initramfs再作成手順
今回は少し毛色を変えて、Linuxのinitramfsの再構築手順についてまとめたいと思います。
ちょっとinitrdを変更する機会があったのですが、久しぶりに触ることになったので忘れてしまっていたんですよね。。
また一から調べ直しているような状況だったので、今後は困らないように。と思いまとめることにしました!!
■環境
今回用いる環境は、
jetson nanoになります。
ただ、initramfs展開後のフォルダ構成やinitファイルに記載されたスクリプトが異なるだけで、
Linux全般に使用できる手順かと思います。
自分の環境に合わせて読み替えてみてください。
■initrdの展開手順
まずは編集するためにinitramfsを展開していきます。
前準備として、下記コマンドで作業用フォルダの作成を行って下さい。
mkdir hoge cd hoge mkdir huga
そして、
展開のコマンドはこちらになります。
unmkinitramfs /boot/initrd ./huga or unmkinitramfs /boot/initrd.img-`uname -r` ./huga
お使いのinitramfsの名前に応じて使い分けてみてください。
展開処理にほんの少し時間がかかります。
完了するとhugaフォルダに、
bin dev etc init lib mnt proc sbin sys tmp usr var
といったようなinitrd展開後のフォルダ群が格納されているかと思います。
また、こちらのコマンドでも展開が可能です。
cd huga zcat /boot/initrd | cpio -id or cd huga zcat /boot/initrd.img-`uname -r` | cpio -id
これで展開は完了です。
■initramfs再作成手順
では次に再作成方法です。
展開時に使用したunmkinitramfsと対をなす、
mkinitramfs というコマンドがあり、こちらを利用すれば作成は出来そうでした。
そこで、
mkinitramfs -o 展開ファイル先 huga
を実行してみたのですが、
depmod: ERROR: Bad version passed huga
といったエラーが出てしまいました。
どうやら、unameを指定しなければならないようだったので、
mkinitramfs -o ./initrd huga `uname -r`
と実行。
無事先ほどのエラーは消えたのですが、、、
元々のinitramfsのサイズが、5MByte程度であったのに対して生成されたinitramfsのサイズは15MByte。。。
明らかにおかしい。。
試しに置き換えてみましたが、、、案の定動作がおかしい。。
原因を調べたのですが泥沼にはまる。。
ということで、、、
mkinitramfsの利用は断念し、先ほどの展開手順で補足的に記載したcpioを用いた方法に方向転換。
cpioを用いたinitramfs再作成コマンドはこちらになります。
cd ./huga sudo find . | cpio -R 0:0 -o -H newc | gzip > initrd.img or cd ./huga sudo find . | cpio -R 0:0 -o -H newc | gzip > initrd.img
生成されたinitramfsを置き換えて再起動すれば、編集後のinitramfsを用いることが出来るようになります。
■initramfs内を閲覧するだけなら
initramfs内のフォルダ構成を確認したいだけであればわざわざ展開しなくても、
こちらのコマンドで一覧表示が可能です。
lsinitramfs /boot/initrd or lsinitramfs /boot/initrd-`uname -r`
■(補足)initrdとinitramfsの違い
最後にinitrdとinitramfsの違いについてまとめます。
詳細はこちらに記載されているのですが、
http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ramfs-rootfs-initramfs.txt.html
どうやらかつてはinitrdというgzipで圧縮されたファイルイメージをカーネルドライバに組み込んで実行していたようです。
ただこの方法だと、ファイルシステムを組み込んであげる必要があったり、initrd実行後、RAMディスクをアンマウントしないと行けなかったり、
と手間が取り扱いが面倒でした。
そこで、登場したのがinitramfs。
initramfsはcpioとgzipで圧縮されたアーカイブになったファイルシステムイメージであり取り扱いがシンプルになっており、
メモリ上にファイルシステムを作っておき、そこに先ほどのイメージを展開するだけなので手順も簡素化されております。