All of lore.kernel.org
 help / color / mirror / Atom feed
From: Herve Codina via buildroot <buildroot@buildroot.org>
To: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>, buildroot@buildroot.org
Subject: Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Date: Wed, 18 Oct 2023 18:42:52 +0200	[thread overview]
Message-ID: <20231018184252.20c64e43@bootlin.com> (raw)
In-Reply-To: <20231018161859.GB2607@scaer>

Yann, All,

On Wed, 18 Oct 2023 18:18:59 +0200
"Yann E. MORIN" <yann.morin.1998@free.fr> wrote:

> Hervé, All,
> 
> On 2023-10-18 17:38 +0200, Herve Codina via buildroot spake thusly:
> > On Wed, 18 Oct 2023 17:20:47 +0200
> > "Yann E. MORIN" <yann.morin.1998@free.fr> wrote:  
> > > Hervé, All  
> > > > > --- a/package/pkg-utils.mk
> > > > > +++ b/package/pkg-utils.mk
> > > > > @@ -214,10 +214,19 @@ ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y)
> > > > >  # $1: space-separated list of packages to rsync from
> > > > >  # $2: 'host' or 'target'
> > > > >  # $3: destination directory
> > > > > +# $4: literal "copy" or "hardlink" to copy or hardlink files from src to dest
> > > > >  define per-package-rsync
> > > > >  	mkdir -p $(3)
> > > > >  	$(foreach pkg,$(1),\
> > > > > -		rsync -a --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \
> > > > > +		rsync -a \
> > > > > +			--hard-links \    
> > > > You preserve hard links (--hard-links) in all cases (copy and hardlink).
> > > > In case of copy, is it correct to preserve hard links ?    
> > > Yes, --hard-links is:
> > > 
> > >     This tells rsync to look for hard-linked files in the source and
> > >     link together the corresponding files on the destination.  
> > In case of 'copy', you keep hard-links already present in source and so the
> > destination (final host/target dirs) is not a full copy.  
> 
> Ah, it does not hard-link something in dest into src. The hardlinks are
> only in the destination. See below...
> 
> > Some hard-links can be present and post-build scripts can still corrupt some
> > per-package sources.
> > 
> > I don't understand why keeping hard-links on this last copy is needed and I
> > probably miss something...  
> 
> That is because we can have hard-links in host or target. For example,
> git will install a lot of hard-links in /usr/libexec/git-core/
> (excerpt):
> 
>     $ ls -li per-package/git/target/usr/libexec/git-core/
>     9588770 -rwxr-xr-x 141 ymorin ymorin 3318828 Oct 16 17:45 git-var
>     9588770 -rwxr-xr-x 141 ymorin ymorin 3318828 Oct 16 17:45 git-verify-commit
>     9588770 -rwxr-xr-x 141 ymorin ymorin 3318828 Oct 16 17:45 git-verify-pack
>     9588770 -rwxr-xr-x 141 ymorin ymorin 3318828 Oct 16 17:45 git-verify-tag
>     9588770 -rwxr-xr-x 141 ymorin ymorin 3318828 Oct 16 17:45 git-version
> 
>     $ ls -li target/usr/libexec/git-core/
>     9600190 -rwxr-xr-x 141 ymorin ymorin 2832860 Oct 16 17:45 git-var
>     9600190 -rwxr-xr-x 141 ymorin ymorin 2832860 Oct 16 17:45 git-verify-commit
>     9600190 -rwxr-xr-x 141 ymorin ymorin 2832860 Oct 16 17:45 git-verify-pack
>     9600190 -rwxr-xr-x 141 ymorin ymorin 2832860 Oct 16 17:45 git-verify-tag
>     9600190 -rwxr-xr-x 141 ymorin ymorin 2832860 Oct 16 17:45 git-version
> 
> As you can see, in git's PPD, git tools are hard-links, and in target/
> they also are hard-links. But the inode is different, so the hard-links
> in target/ are different from the hard-links in the PPD.
> 
> However, in all the PPDs of packages that have git as a dependency, the
> hard-links would all be to the same inode, 9588770.
> 
> (The size delta is because the files in target/ are stripped.)
> 
> So, in case of "copy", this is actually a copy, that keeps existing
> hard-links in the source, as new hard-links in the destination. Without
> --hard-links, the files in target/usr/libexec/git-core/ would all have a
> different inode, as they would be different files, and that would
> tremendously increase the filesystem size (squashfs would notice, and
> would store the content only once, but would still create as many inodes
> as needed, though).
> 

Thanks a lot for these explanations!
It is clearer in my mind now.

Maybe, in the commit log:
--- 8< ---
rsync --hard-links option allows to keep existing hard-links in the source
as new hard-links in the destination ("copy" of hard-links).
Having this hard-links "copy" contributes to the directories size
reduction.
--- 8< --- 

With all that said:
Reviewed-by: Herve Codina <herve.codina@bootlin.com>

Best regards,
Hervé
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

  reply	other threads:[~2023-10-18 16:43 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-17 21:01 [Buildroot] [PATCH 0/2] package/pkg-utils: fix regression in size and build time with PPD (branch yem/rsync-copy) Yann E. MORIN
2023-10-17 21:01 ` [Buildroot] [PATCH 1/2] Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build" Yann E. MORIN
2023-10-18  8:38   ` Herve Codina via buildroot
2023-10-26 18:34   ` Peter Korsgaard
2023-10-17 21:01 ` [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest Yann E. MORIN
2023-10-18  8:53   ` Herve Codina via buildroot
2023-10-18 15:20     ` Yann E. MORIN
2023-10-18 15:38       ` Herve Codina via buildroot
2023-10-18 16:18         ` Yann E. MORIN
2023-10-18 16:42           ` Herve Codina via buildroot [this message]
2023-10-26 18:34   ` Peter Korsgaard
2023-10-21 19:25 ` [Buildroot] [PATCH 0/2] package/pkg-utils: fix regression in size and build time with PPD (branch yem/rsync-copy) Yann E. MORIN

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231018184252.20c64e43@bootlin.com \
    --to=buildroot@buildroot.org \
    --cc=herve.codina@bootlin.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=yann.morin.1998@free.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.