package/pkg-utils: fix regression in size and build time with PPD (branch yem/rsync-copy)
cover package/pkg-utils: fix regression in size and build time with PPD (branch yem/rsync-copy)
Hello All!
This small series is a proposal to revert the huge regression in size and (to a lesser extend) build dtime due to not hard-linking source files whn preparing per-package directories, or when assembling the final target+host directories.
Regards,
Yann E. MORIN.
----------------------------------------------------------------
Yann E. MORIN (2):
Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build" package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Makefile | 4 ++-- package/pkg-utils.mk | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-)
Signature · 10 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------' _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
PATCH 1/2 Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build"
Commit 21d52e52d8de (package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) stopped hardlink the source and destination when rsyncing per-package directory, on the rationale that modifying files in-place after the rsync would also modify the original file, and that break foo-rebuild and can cause issues with post-build scripts.
However, what 21d52e52d8de did not envision, is that copying instead of hard-linking has two nasty side effects:
- the size increase for the build directory increase with the number of packages and with the depth of th dependency chains for those
packages: a (relatively small) build that was previously totalling ~13GiB in output/, now totals north of 122GiB, an almost 10-time increase;
- the build time increases, as it takes mopre time to read+write files than it takes to create a new link to a file; the same build saw a increase of build time from 5min 10s to 7min 30s, a 45% increase.
These regressions are both serious, so revert the change; we'll come up with a stopgap measure in follow-up commits.
This reverts commit 21d52e52d8dee0940d28b3a38551eb183be37813.
--- package/pkg-utils.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
package/pkg-utils.mk +1 -1
@@ -217,7 +217,7 @@ ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) define per-package-rsync mkdir -p $(3) $(foreach pkg,$(1),\ - rsync -a \ + rsync -a --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef
Signature · 6 lines
2.25.1 _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 1/2] Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build"
Hi Yann,
Quoted 10 lines · On Tue, 17 Oct 2023 23:01:19 +0200 "Yann E. MORIN" <[email protected]>…
Commit
21d52e52d8de(package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) stopped hardlink the source and destination when rsyncing per-package directory, on the rationale that modifying files in-place after the rsync would also modify the original file, and that break foo-rebuild and can cause issues with post-build scripts.However, what
21d52e52d8dedid not envision, is that copying instead of hard-linking has two nasty side effects:
Quoted 7 lines
- the size increase for the build directory increase with the number of packages and with the depth of th dependency chains for those
packages: a (relatively small) build that was previously totalling ~13GiB in output/, now totals north of 122GiB, an almost 10-time increase;- the build time increases, as it takes mopre time to read+write files
s/mopre/more
Quoted 1 line
than it takes to create a new link to a file; the same build saw a
an increase
Quoted 11 lines
increase of build time from 5min 10s to 7min 30s, a 45% increase.
These regressions are both serious, so revert the change; we'll come up with a stopgap measure in follow-up commits.
This reverts commit
21d52e52d8dee0940d28b3a38551eb183be37813.Signed-off-by Yann E. MORIN <[email protected]>Cc Herve Codina <[email protected]>Cc Peter Korsgaard <[email protected]>Cc Thomas Petazzoni <[email protected]>
With the typo fixed:
Best regards,
Hervé
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 1/2] Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build"
In reply to Yann E. MORINQuoted 25 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Yann" == Yann E MORIN <[email protected]> writes:
Commit
21d52e52d8de(package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) stopped hardlink the source and destination when rsyncing per-package directory, on the rationale that modifying files in-place after the rsync would also modify the original file, and that break foo-rebuild and can cause issues with post-build scripts.However, what
21d52e52d8dedid not envision, is that copying instead of hard-linking has two nasty side effects:- the size increase for the build directory increase with the number of packages and with the depth of th dependency chains for those
packages: a (relatively small) build that was previously totalling ~13GiB in output/, now totals north of 122GiB, an almost 10-time increase;- the build time increases, as it takes mopre time to read+write files than it takes to create a new link to a file; the same build saw a increase of build time from 5min 10s to 7min 30s, a 45% increase.
These regressions are both serious, so revert the change; we'll come up with a stopgap measure in follow-up commits.
Quoted 6 lines
This reverts commit
21d52e52d8dee0940d28b3a38551eb183be37813.Signed-off-by Yann E. MORIN <[email protected]>Cc Herve Codina <[email protected]>Cc Peter Korsgaard <[email protected]>Cc Thomas Petazzoni <[email protected]>
Committed to 2023.02.x and 2023.08.x, thanks.
Signature · 5 lines
Bye, Peter Korsgaard _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
PATCH 2/2 package/pkg-utils: teach per-package-rsync to copy or hardlink dest
In reply to Yann E. MORINcommit 21d52e52d8de (package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) was recently reverted, so we are back to a situation where it is possible for packages and post-build scripts to modify files in-place, and thus impact files in any arbitrary per-package directory, which may break things on rebuild for example.
21d52e52d8de wsa too big a hammer, but we can still apply the reasoning from it, to the aggregation of the final target and host directories.
This solves the case for post-build scripts at least. We leave the case of inter-package modification aside, as it is a bigger issue that will need more than jsut copying files around.
--- Makefile | 4 ++-- package/pkg-utils.mk | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-)
Makefile +2 -2
@@ -717,7 +717,7 @@ STAGING_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list-staging.t .PHONY: host-finalize host-finalize: $(PACKAGES) $(HOST_DIR) $(HOST_DIR_SYMLINK) @$(call MESSAGE,"Finalizing host directory") - $(call per-package-rsync,$(sort $(PACKAGES)),host,$(HOST_DIR)) + $(call per-package-rsync,$(sort $(PACKAGES)),host,$(HOST_DIR),copy) .PHONY: staging-finalize staging-finalize: $(STAGING_DIR_SYMLINK)
@@ -725,7 +725,7 @@ staging-finalize: $(STAGING_DIR_SYMLINK) .PHONY: target-finalize target-finalize: $(PACKAGES) $(TARGET_DIR) host-finalize @$(call MESSAGE,"Finalizing target directory") - $(call per-package-rsync,$(sort $(PACKAGES)),target,$(TARGET_DIR)) + $(call per-package-rsync,$(sort $(PACKAGES)),target,$(TARGET_DIR),copy) $(foreach hook,$(TARGET_FINALIZE_HOOKS),$($(hook))$(sep)) rm -rf $(TARGET_DIR)/usr/include $(TARGET_DIR)/usr/share/aclocal \ $(TARGET_DIR)/usr/lib/pkgconfig $(TARGET_DIR)/usr/share/pkgconfig \
package/pkg-utils.mk +12 -3
@@ -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 \ + $(if $(filter hardlink,$(4)), \ + --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/, \ + $(if $(filter copy,$(4)), \ + $(empty), \ + $(error per-package-rsync can only "copy" or "hardlink", not "$(4)") \ + ) \ + ) \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef
@@ -230,8 +239,8 @@ endef # # $1: space-separated list of packages to rsync from define prepare-per-package-directory - $(call per-package-rsync,$(1),host,$(HOST_DIR)) - $(call per-package-rsync,$(1),target,$(TARGET_DIR)) + $(call per-package-rsync,$(1),host,$(HOST_DIR),hardlink) + $(call per-package-rsync,$(1),target,$(TARGET_DIR),hardlink) endef # Ensure files like .la, .pc, .pri, .cmake, and so on, point to the
Signature · 6 lines
2.25.1 _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Hi Yann,
Quoted 7 lines · On Tue, 17 Oct 2023 23:01:20 +0200 "Yann E. MORIN" <[email protected]>…
commit
21d52e52d8de(package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) was recently reverted, so we are back to a situation where it is possible for packages and post-build scripts to modify files in-place, and thus impact files in any arbitrary per-package directory, which may break things on rebuild for example.
21d52e52d8dewsa too big a hammer, but we can still apply the reasoning
s/wsa/was/
Quoted 5 lines
from it, to the aggregation of the final target and host directories.
This solves the case for post-build scripts at least. We leave the case of inter-package modification aside, as it is a bigger issue that will need more than jsut copying files around.
s/jsut/just/
Quoted 10 lines
Signed-off-by Yann E. MORIN <[email protected]>Cc Herve Codina <[email protected]>Cc Peter Korsgaard <[email protected]>Cc Thomas Petazzoni <[email protected]>--- Makefile | 4 ++-- package/pkg-utils.mk | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-)
[...]
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 222
Quoted 13 lines
package/pkg-utils.mk +3
-1@@ -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 ?
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 232
Quoted 10 lines
package/pkg-utils.mk +7
-0+ $(if $(filter hardlink,$(4)), \ + --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/, \ + $(if $(filter copy,$(4)), \ + $(empty), \ + $(error per-package-rsync can only "copy" or "hardlink", not "$(4)") \ + ) \ + ) \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef
[...]
Best regards,
Hervé
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Hervé, All
On 2023-10-18 10:53 +0200, Herve Codina via buildroot spake thusly:
Quoted 2 lines
On Tue, 17 Oct 2023 23:01:20 +0200
"Yann E. MORIN" <[email protected]> wrote:
[--SNIP--]
Typoes fixed in both commits, thanks.
Quoted 7 lines
Quoted 7 lines
package/pkg-utils.mk +1
-0@@ -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
Quoted 8 lines
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 222
Quoted 6 lines
package/pkg-utils.mk +2
-1define 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.
Regards,
Yann E. MORIN.
Quoted 19 lines
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 232
Quoted 10 lines
package/pkg-utils.mk +7
-0+ $(if $(filter hardlink,$(4)), \ + --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/, \ + $(if $(filter copy,$(4)), \ + $(empty), \ + $(error per-package-rsync can only "copy" or "hardlink", not "$(4)") \ + ) \ + ) \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef[...]
Best regards,
Hervé
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Signature · 10 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------' _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Yann, All,
Quoted 2 lines · On Wed, 18 Oct 2023 17:20:47 +0200 "Yann E. MORIN" <[email protected]>…
Hervé, All
[...]
Quoted 17 lines
Quoted 16 lines
Quoted 4 lines
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 222
Quoted 10 lines
package/pkg-utils.mk +3
-1@@ -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 ?
Quoted 4 lines
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.
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...
Regards,
Hervé
Quoted 17 lines
Regards,
Yann E. MORIN.Quoted 13 lines
Quoted 10 lines
package/pkg-utils.mk +7
-0+ $(if $(filter hardlink,$(4)), \ + --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/, \ + $(if $(filter copy,$(4)), \ + $(empty), \ + $(error per-package-rsync can only "copy" or "hardlink", not "$(4)") \ + ) \ + ) \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef[...]
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Hervé, All,
On 2023-10-18 17:38 +0200, Herve Codina via buildroot spake thusly:
Quoted 18 lines
Quoted 16 lines · On Wed, 18 Oct 2023 17:20:47 +0200 "Yann E. MORIN" <[email protected]>…
Hervé, All
Quoted 15 lines
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 222
Quoted 13 lines
package/pkg-utils.mk +3
-1@@ -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 ?
Quoted 6 lines
Quoted 4 lines
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...
Quoted 5 lines
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-versionAs 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).
Regards,
Yann E. MORIN.
Quoted 24 lines
Regards,
HervéQuoted 17 lines
Regards,
Yann E. MORIN.Quoted 13 lines
Quoted 10 lines
package/pkg-utils.mk +7
-0+ $(if $(filter hardlink,$(4)), \ + --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/, \ + $(if $(filter copy,$(4)), \ + $(empty), \ + $(error per-package-rsync can only "copy" or "hardlink", not "$(4)") \ + ) \ + ) \ $(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \ $(3)$(sep)) endef[...]
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Signature · 10 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------' _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
Herve Codina via buildroot
Reviewed-by Herve CodinaRe: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Yann, All,
Quoted 64 lines · On Wed, 18 Oct 2023 18:18:59 +0200 "Yann E. MORIN" <[email protected]>…
Hervé, All,
On 2023-10-18 17:38 +0200, Herve Codina via buildroot spake thusly:
Quoted 18 lines
Quoted 16 lines · On Wed, 18 Oct 2023 17:20:47 +0200 "Yann E. MORIN" <[email protected]>…
Hervé, All
Quoted 15 lines
package/pkg-utils.mk ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y) · line 222
Quoted 13 lines
package/pkg-utils.mk +3
-1@@ -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 ?
Quoted 6 lines
Quoted 4 lines
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...
Quoted 5 lines
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-versionAs 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.)
Quoted 8 lines
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:
Best regards,
Hervé
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Re: [Buildroot] [PATCH 2/2] package/pkg-utils: teach per-package-rsync to copy or hardlink dest
In reply to Yann E. MORINQuoted 11 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Yann" == Yann E MORIN <[email protected]> writes:
commit
21d52e52d8de(package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build) was recently reverted, so we are back to a situation where it is possible for packages and post-build scripts to modify files in-place, and thus impact files in any arbitrary per-package directory, which may break things on rebuild for example.
21d52e52d8dewsa too big a hammer, but we can still apply the reasoning from it, to the aggregation of the final target and host directories.
Quoted 8 lines
This solves the case for post-build scripts at least. We leave the case of inter-package modification aside, as it is a bigger issue that will need more than jsut copying files around.
Signed-off-by Yann E. MORIN <[email protected]>Cc Herve Codina <[email protected]>Cc Peter Korsgaard <[email protected]>Cc Thomas Petazzoni <[email protected]>
Committed to 2023.02.x and 2023.08.x, thanks.
Signature · 5 lines
Bye, Peter Korsgaard _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
All,
On 2023-10-17 23:01 +0200, Yann E. MORIN spake thusly:
Quoted 5 lines
This small series is a proposal to revert the huge regression in size and (to a lesser extend) build dtime due to not hard-linking source files whn preparing per-package directories, or when assembling the final target+host directories.
Quoted 8 lines
Regards,
Yann E. MORIN.----------------------------------------------------------------
Yann E. MORIN (2):
Revert "package/pkg-utils.mk: break hardlinks in global {TARGET, HOST}_DIR on per-package build" package/pkg-utils: teach per-package-rsync to copy or hardlink dest
Both patches applied, after fixing issues noticed by Hervé.
Regards,
Yann E. MORIN.
Quoted 15 lines
Makefile | 4 ++-- package/pkg-utils.mk | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-)Signature · 10 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------' _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot
Signature · 10 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------' _______________________________________________ buildroot mailing list [email protected] https://lists.buildroot.org/mailman/listinfo/buildroot