ハードリンクを失うことなくinitramfs cpioを再アーカイブする方法は?

ハードリンクを失うことなくinitramfs cpioを再アーカイブする方法は?

私は次のようなDebian initramfsを持っています。

  • 私はそれを次の場所に解凍しました:
~/my_initramfs $ sudo cpio -idmBv < ../initramfs.cpio
.
bin
conf
conf/arch.conf
...
cpio: usr/sbin/watchdog linked to usr/bin/[
cpio: usr/sbin/watchdog linked to usr/bin/[[
cpio: usr/sbin/watchdog linked to usr/bin/ar
...
cpio: usr/sbin/watchdog linked to usr/sbin/vconfig
usr/sbin/watchdog
44511 blocks
  • busyboxを含む247のハードリンクがあることを確認してください。
~/my_initramfs $ ls -lA bin/* | head
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/[
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/[[
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/ar
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/arch
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/ash
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/awk
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/basename
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/bc
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/blkdiscard
-rwxr-xr-x 247 root root 764552 Jul 25  2021 bin/bunzip2
  • そしてまたアーカイブ
~/my_initramfs $ sudo find . -print | sudo cpio -ovB > ~/my_initramfs.cpio
.
./run
./usr
./usr/bin
...
./sbin
./init
81237 blocks

今、新しいアーカイブのサイズは元のアーカイブの2倍です。

~/my_initramfs $ ls -lA ../*initramfs.cpio
-rw-r--r-- 1 fadedbee fadedbee 227892224 Apr  3 15:27 ../initramfs.cpio
-rw-r--r-- 1 radedbee fadedbee 415933440 Apr  8 11:03 ../my_initramfs.cpio

両方のcpioアーカイブの内容を見ると、新しいアーカイブにbusyboxのコピーがたくさん(別名で)あるように見えます。

~/my_initramfs $ cpio -itv < ../initramfs.cpio | grep "bin/a"
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/sbin/arping
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/sbin/arp
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/sbin/adjtimex
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/sbin/acpid
445102 blocks
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/bin/awk
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/bin/ash
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/bin/arch
-rwxr-xr-x 247 root     root            0 Jul 25  2021 usr/bin/ar

~/my_initramfs $ cpio -itv < ../my_initramfs.cpio | grep "bin/a"
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/bin/arch
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/bin/ash
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/bin/ar
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/bin/awk
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/sbin/acpid
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/sbin/adjtimex
812365 blocks
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/sbin/arping
-rwxr-xr-x 247 root     root       764552 Jul 25  2021 usr/sbin/arp
  • ビジボックスコピーの代わりにハードリンクを含むcpioアーカイブを作成するには?

これを試しましたが、--link次のエラーが発生します。

~/my_initramfs $ find . -print | cpio -ovB --link > ~/my_initramfs.cpio
cpio: --link is meaningless with --create
Try 'cpio --help' or 'cpio --usage' for more information.

答え1

ソースコードを読み、答えを見つけました。https://salsa.debian.org/kernel-team/initramfs-tools/-/blob/master/mkinitramfs?ref_type=heads#L492

~/my_initramfs $ find . -depth | sudo cpio -o > ~/my_initramfs.cpio
812365 blocks
~/my_initramfs $ find . -depth | sudo cpio -o -H newc > ~/my_initramfs.cpio
445102 blocks

関連情報