ユーザーとして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コマンドは、ファイルシステムに存在するファイルからのみアーカイブを生成できます。ルートに属するデバイスノードまたはファイルを作成するには、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

これらのエラーは、ユーザーにノードを作成する権限がないために発生します。ルートのみfifoとソケット以外のノードを作成できます(参照:ムノード以下の文書EPERM

initrd を再パッケージすると、その特殊ファイルは含まれません。 initrdを再パッケージするには、次のものがあります。オプションCalled は、--ownerすべてのファイルの所有者を設定するために使用できます。しかし、、ルートのみこのオプションを使用できます。

私が見る唯一の方法は、rootアクセス権を持つ別のシステムにinitrdをコピーしてそこで作業を実行することです。その後、再度コピーしてください。

答え4

ご回答ありがとうございます。役に立ちましたが、私自身の解決策を見つけました。

initrd画像の再生成は、fakeroot-ng(および可能であればfakeroot)を使用して実行できます。

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

私はfakeroot環境でスクリプトの一部を呼び出します。 initramfsを解凍し、すべての変更を実行してから再パッケージ化します。

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

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

関連情報