web-dev-qa-db-ja.com

ユーザーとして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はどのようになりますか?私は標準のアクセス権を変更しないことを好みます。

5
Dejwi

あなたの答えをありがとう、それらは有用でした、しかし私は私自身の解決策を理解します。

Initrdイメージの再作成は、fakeroot-ngで(おそらくfakerootでも)実行できます。

すべてのシステムコールをラップするためのツールの基本的な考え方。したがって、fakeroot環境内で実行されるすべてのプログラムは、ルートによって実行されると考えています。

スクリプトの一部をfakeroot環境内で呼び出します-initramfsをアンパックし、すべての変更を実行して、再度パックします。

すべての特権が正しく設定されています。ルートはすべてのファイルの所有者です。

Fakeroot-ngは次の場所にあります。 http://fakeroot-ng.lingnu.com/index.php/Home_Page

1
Dejwi

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アクセスがあり、そこで操作を実行します。その後、コピーして戻します。

2
chaos

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
1
Woland