하드 링크를 잃지 않고 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

이제 새 아카이브의 크기는 원본 아카이브의 두 배입니다.

~/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

관련 정보