Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

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で圧縮されたアーカイブになったファイルシステムイメージであり取り扱いがシンプルになっており、
メモリ上にファイルシステムを作っておき、そこに先ほどのイメージを展開するだけなので手順も簡素化されております。

■最後に

今回はinitramfsの作成方法について触れてみました。
久しぶりにLinux OSに近い部分を触ったので忘れている点が多かった。。
たまには触らなきゃダメですね。