사용자로 initrd의 압축을 풀고 수정하고 패키징합니다.

사용자로 initrd의 압축을 풀고 수정하고 패키징합니다.

initrd사용자로서 이미지를 다시 작성하는 데 문제가 있습니다. 먼저 원본 이미지를 "압축 해제"하려고 하면 다음과 같습니다 initrd.

cpio -idm < initrd-base 
cpio: dev/tty8: Cannot mknod: Operation not permitted
cpio: dev/tty3: Cannot mknod: Operation not permitted
cpio: dev/zero: Cannot mknod: Operation not permitted
cpio: dev/loop0: Cannot mknod: Operation not permitted
cpio: dev/loop4: Cannot mknod: Operation not permitted
cpio: dev/loop7: Cannot mknod: Operation not permitted
cpio: dev/loop5: Cannot mknod: Operation not permitted
cpio: dev/loop2: Cannot mknod: Operation not permitted
cpio: dev/tty9: Cannot mknod: Operation not permitted
cpio: dev/tty4: Cannot mknod: Operation not permitted
cpio: dev/null: Cannot mknod: Operation not permitted
cpio: dev/loop6: Cannot mknod: Operation not permitted
cpio: dev/loop1: Cannot mknod: Operation not permitted
cpio: dev/console: Cannot mknod: Operation not permitted
cpio: dev/loop3: Cannot mknod: Operation not permitted
cpio: dev/tty1: Cannot mknod: Operation not permitted
133336 blocks

이러한 경고를 어떻게 제거할 수 있습니까?

둘째 - 파일 소유권을 처리하는 방법을 잘 모르겠습니다. 압축을 풀면 모든 것이 현재 사용자의 소유인 것 같습니다.

initrd재포장 후에는 어떻게 되나요? 표준 접근 권한을 변경하고 싶지 않습니다.

답변1

cpio를 사용하고 있으므로 실제로파일 시스템 초기화,하나도 아니야초기화 프로그램. initrd는 cpio 아카이브가 아닌 파일 시스템 이미지로 저장됩니다. initrd와 initramfs는 Linux 부팅 프로세스에서 비슷한 역할을 하며 실제 루트 파일 시스템 이전에 사용 가능한 일부 파일을 제공합니다(실제 루트 파일 시스템을 마운트하는 데 사용됨). 그러나 내부적으로는 상당히 다르게 처리됩니다. 이것과는 아무 상관이 없습니다. Initrd는 더 오래되었으며 initramfs를 선호하여 다소 사용되지 않습니다. 많은 빌드 시스템 initrd이 initramfs로 전환한 경우에도 여전히 이 파일 이름을 사용합니다.

루트 이미지에는 일반적으로 특정 권한이 필요한 장치 노드와 파일이 포함됩니다. 이 cpio명령은 파일 시스템에 존재하는 파일에서만 아카이브를 생성할 수 있으며, 루트에 속한 장치 노드나 파일을 생성하려면 루트 권한이 필요합니다. 커널 소스 코드에는 파일 시스템에 모든 파일을 생성하지 않고 initramfs를 생성하기 위한 도구 usr/gen_init_cpio와 래퍼 스크립트가 포함되어 scripts/gen_initramfs_list.sh있어 권한 없이 initramfs를 생성할 수 있습니다. 이러한 프로그램은 커널 소스 트리 아래에 문서화되어 있습니다.Documentation/filesystems/ramfs-rootfs-initramfs.txt그리고Documentation/early-userspace/README.

ramfs-rootfs-initramfs.txt"initramfs 채우기" 섹션에서는 initramfs를 빌드하는 일반적인 방법을 설명합니다. 생성할 경로 목록, 해당 유형(디렉터리, 일반, 장치 노드 등), 권한 및 기타 속성이 포함된 텍스트 파일을 작성합니다. 일반 파일의 경우 콘텐츠가 포함된 로컬 파일의 이름을 지정할 수 있습니다. 그런 다음 이 파일을 실행하세요 usr/gen_init_cpio. 커널을 빌드할 때 이 옵션을 파일 이름으로 설정하면 CONFIG_INITRAMFS_SOURCE해당 파일을 호출하여 initramfs가 생성됩니다.usr/gen_init_cpio

initramfs 이미지가 이미 있고 이를 수정하려면 cpio -tv목록을 사용하고 이미지를 기반으로 ramfs 설명 파일을 다시 빌드하세요. 가능하다면 원래 커널 소스에서 initramfs 설명 파일을 얻어 작업을 저장하십시오. 디렉터리에 있는 일반 파일의 내용만 추출합니다. 그런 다음 일반 파일과 ramfs 설명 파일을 수정하고 마지막으로 실행하여 usr/gen_init_cpio새 initramfs를 생성합니다.

답변2

initramfs의 압축을 풀고 나중에 다시 압축해야 하는 경우 -s/-i 옵션을 사용하여 fakeroot 환경을 파일에 저장할 수 있습니다.

$ mkdir initrd
$ cd initrd
$ zcat ../initrd.gz | fakeroot -s ../initrd.fakeroot cpio -i

이제 다음과 유사한 내용을 포함하는 fakeroot 환경용 파일이 생겼습니다.


dev=fe05, ino=20326044, 모드=120777, uid=0, gid=0, nlink=1, rdev=0 dev=아이언 05,이노=20326045,mode=20664,uid=0,gid=0,nlink=1,rdev=1281 dev=fe05,ino=20326046,mode=20664,uid=0,gid=0,nlink=1,rdev=259 dev=fe05 ,ino=20326047,mode=100644,uid=0,gid=0,nlink=1,rdev=0

파일 보기:

$ stat dev/console
   File: 'dev/console'
   Size: 0               Blocks: 0          IO Block: 4096   regular empty file
 Device: fe05h/65029d    Inode: 20326045    Links: 1

너무 깊이 파고들지는 않았지만 다음을 통해 필요한 노드를 만들 수 있는 것 같습니다.

$ touch <file>
$ stat <file>
$ # put info about file into your fakeroot environment with your own params

initramfs를 빌드하려면 방금 실행했습니다.

$ find | fakeroot -i ../initrd.fakeroot cpio -o -H newc | gzip -c > ../initrd.gz

답변3

이러한 오류는 사용자에게 노드를 생성할 수 있는 권한이 없기 때문에 발생합니다. 루트만 fifo 및 소켓 이외의 노드를 생성할 수 있습니다(참조:무노드아래 문서 EPERM)

initrd를 다시 패키지하면 해당 특수 파일이 포함되지 않습니다. initrd를 다시 패키지하려면 다음이 있습니다.옵션Called는 --owner모든 파일의 소유자를 설정하는 데 사용할 수 있습니다.하지만, 루트만 이 옵션을 사용할 수 있습니다.

내가 보는 유일한 방법은 루트 액세스 권한이 있는 다른 시스템에 initrd를 복사하고 그곳에서 작업을 수행하는 것입니다. 그런 다음 다시 복사하십시오.

답변4

귀하의 답변에 감사드립니다. 도움이 되었지만 나만의 해결책을 찾았습니다.

initrd 이미지 재생성은 fakeroot-ng(및 가능하면 fakeroot)를 사용하여 수행할 수 있습니다.

이 도구의 기본 아이디어는 모든 시스템 호출을 래핑하여 fakeroot 환경에서 실행되는 모든 프로그램이 루트에서 실행되는 것으로 간주하는 것입니다.

나는 fakeroot 환경에서 스크립트의 일부를 호출합니다. initramfs의 압축을 풀고 모든 변경 사항을 수행한 후 다시 패키징합니다.

모든 권한이 올바르게 설정되었으며 루트가 모든 파일의 소유자입니다.

fakeroot-ng는 다음 위치에 있습니다. http://fakeroot-ng.lingnu.com/index.php/Home_Page

관련 정보