ユーザーとしての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
はどのようになりますか?私は標準のアクセス権を変更しないことを好みます。
あなたの答えをありがとう、それらは有用でした、しかし私は私自身の解決策を理解します。
Initrdイメージの再作成は、fakeroot-ngで(おそらくfakerootでも)実行できます。
すべてのシステムコールをラップするためのツールの基本的な考え方。したがって、fakeroot環境内で実行されるすべてのプログラムは、ルートによって実行されると考えています。
スクリプトの一部をfakeroot環境内で呼び出します-initramfsをアンパックし、すべての変更を実行して、再度パックします。
すべての特権が正しく設定されています。ルートはすべてのファイルの所有者です。
Fakeroot-ngは次の場所にあります。 http://fakeroot-ng.lingnu.com/index.php/Home_Page
Cpioを使用しているため、実際には initrd ではなく initramfs を作成しています。 initrdは、cpioアーカイブとしてではなく、ファイルシステムイメージとして保存されます。 initrdとinitramfsは、Linuxブートプロセスで同様の役割を果たし、真のルートファイルシステムの前に利用できる(真のルートファイルシステムのマウントに使用される)ファイルを提供します。内部ではかなり異なる方法で処理されますが、ここでは関係ありません。 Initrdは古いため、initramfsを支持してやや推奨されていません。多くのビルドシステムは、コンテンツをinitramfsに切り替えても、ファイル名initrd
を使用します。
ルートイメージには通常、特定の権限が必要なデバイスノードとファイルが含まれています。 cpio
コマンドは、ファイルシステムに存在するファイルに基づいてのみアーカイブを生成できます。ルートに属するデバイスノードまたはファイルを作成するには、ルート権限が必要です。カーネルソースには、ツールusr/gen_init_cpio
とラッパースクリプトscripts/gen_initramfs_list.sh
が含まれています。これらは、ファイルシステムにすべてのファイルを作成せずにinitramfsを生成し、特権を必要とせずにinitramfsを生成するために提供されます。これらのプログラムは、カーネルソースツリーの Documentation/filesystems/ramfs-rootfs-initramfs.txt
および Documentation/early-userspace/README
に記載されています。
Initramfsを構築する通常の方法は、「initramfsの生成」セクションのramfs-rootfs-initramfs.txt
で説明されています。タイプ(ディレクトリ、通常、デバイスノードなど)、権限、その他の属性を使用して作成するパスのリストを含むテキストファイルを記述します。通常のファイルの場合、コンテンツを含むローカルファイルの名前を指定します。次に、このファイルに対してusr/gen_init_cpio
を実行します。カーネルを構築するときに、CONFIG_INITRAMFS_SOURCE
オプションをファイル名に設定すると、そのファイルに対してusr/gen_init_cpio
を呼び出すことでinitramfsが生成されます。
すでにinitramfsイメージがあり、それを変更する場合は、cpio -tv
を使用してリストし、それに基づいてramfs記述ファイルを再構築します。可能であれば、作業を節約するために、元のカーネルソースからinitramfs記述ファイルを入手してください。通常のファイルのコンテンツを一部のディレクトリにのみ抽出します。次に、通常のファイルとramfs記述ファイルを変更し、最後にusr/gen_init_cpio
を実行して新しいinitramfsを生成します。
ユーザーにノードを作成する権限がないため、これらのエラーが発生します。 rootだけがfifosとソケット以外のノードを作成できます(EPERM
の下の mknod ドキュメントを参照)
Initrdを再度パックすると、それらの特別なファイルはそこにはありません。 initrdを再パックするために、すべてのファイルの所有者を設定するために使用できる--owner
という オプション があります。 [〜#〜]しかし[〜#〜]、rootのみがこのオプションを使用できます。
私が見る唯一の方法は、initrdを別のシステムにコピーすることです。ここで、rootアクセスがあり、そこで操作を実行します。その後、コピーして戻します。
Initramfsをアンパックして後で再パックする必要がある場合は、-s/-iオプションを使用して、fakeroot環境をファイルに保存できます。
$ mkdir initrd
$ cd initrd
$ zcat ../initrd.gz | fakeroot -s ../initrd.fakeroot cpio -i
これで、fakeroot環境に次のようなものが含まれるファイルが作成されました。
…
dev = fe05、ino = 20326044、mode = 120777、uid = 0、gid = 0、nlink = 1、rdev = 0 dev = fe05、ino = 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
深く掘り下げたわけではありませんが、次の方法でnesessaryノードを作成できるようです。
$ 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