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
コマンドは、ファイルシステムに存在するファイルからのみアーカイブを生成できます。ルートに属するデバイスノードまたはファイルを作成するには、root権限が必要です。カーネルソースコードには、ファイルシステムにすべてのファイルを生成せずに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
答え4
ご回答ありがとうございます。役に立ちましたが、私自身の解決策を見つけました。
initrd画像の再生成は、fakeroot-ng(および可能であればfakeroot)を使用して実行できます。
このツールの基本的な考え方は、すべてのシステムコールをラップして、fakeroot環境で実行されているすべてのプログラムがルートで実行されていると見なすことです。
私はfakeroot環境でスクリプトの一部を呼び出します。 initramfsを解凍し、すべての変更を実行してから再パッケージ化します。
すべての権限が正しく設定され、ルートはすべてのファイルの所有者です。
fakeroot-ngは次の場所にあります。 http://fakeroot-ng.lingnu.com/index.php/Home_Page