sstea備忘録

日々のPCライフのメモ、備忘録、及びそれに類推する何か。
記載内容に間違い等を発見された場合はコッソリ教えてください... → sstea<a>aol.jp (<a> を @ に変えてください)


kernel

Raspberry Pi のカーネルカバレッジ情報を取得する

◆GCOVカーネル
Linux にはカバレッジ計測する gcov コマンドというものがあります。
しかし、一般的な gcov でカバレッジ計測が可能なのはユーザー空間のプログラムです。
(厳密には gcov コマンド自体は、
  カバレッジ計測用のコンパイルオプションでコンパイルされたプログラムの
  実行結果を収集、可視化するためのものですが。)

Linux カーネルはユーザー空間のプログラムではないので、
一般的な gcov コマンド等ではカバレッジ計測できないのですが、
それを行なってしまうのがGCOVカーネルなのです。

元々は LTP (Linux Test Project) のサイトからGCOVカーネル用のパッチをダウンロードして適用する必要があったのですが、いつのまにか本家の Linux に取り込み済みのようです。

# 3.18 以降なら ARM にも対応しています。
# (3.17 以前でも本質的には対応されてます。 Kconfig メニュー上表示されませんが。)

◆カーネルカバレッジデータのサンプル
どんな感じのデータが取得できるのかは、まずは見てもらった方が早いと思います。
下記は自分が raspberry pi でGCOVカーネル(3.19.3) を実際に動かして取得したデータです。

  GCOVカーネルカバレッジデータの出力サンプル


arch/arm/lib/uaccess_with_memcpy.c の __copy_to_user_memcpy() の部分を
↓下記に抽出しました。
if 文などの分岐単位でカバレッジ計測されます。 
左にその行の実行回数が表示されています。

ss_rpi_gcov01

◆GCOVカーネルのビルド
では実際のGCOVカーネルのビルド方法です。

"make menuconfig" により、
CONFIG_GCOV_KERNEL と CONFIG_GCOV_PROFILE_ALL を有効にし、
Linux カーネルをビルドします。(Linux カーネルのビルド方法詳細はここを参照)
    General setup  --->
      GCOV-based kernel profiling  --->
      [*] Enable gcov-based kernel profiling
      [*] Profile entire Kernel

           Specify GCOV format (Autodetect)  --->
# CONFIG_GCOV_KERNEL のメニューは CONFIG_DEBUG_FS を有効にしないと表示されません。

参考までに、本家 LTP の説明ページ。
http://ltp.sourceforge.net/coverage/gcov.php

(実際動かしてみると、結構重くなってましたので、あくまでプロファイリング用のカーネルと割り切りましょう。)

◆lcov コマンドのインストール
GCOVカーネルで取得したカバレッジデータを
上記サンプルのように html 化して出力してくれる lcov というツール(?)があります。

ホスト環境に lcov コマンドをインストールしておきます。
(Linux カーネルをクロスビルドしているホスト側です。構築方法詳細はここを参照)

$ git clone https://github.com/linux-test-project/lcov.git
$ cd lcov/
$ sudo make install
で、lcov 1.11 がインストールできると思います。

または、下記でもいいです。
$ curl -L -O http://downloads.sourceforge.net/ltp/lcov-1.11.tar.gz
$ tar xvzf lcov-1.11.tar.gz
$ cd lcov-1.11/
$ sudo make install

いつもの apt-get でもインストールされたんですが、
バージョンが最新(1.11)ではなく1.10でしたので、
上記のどちらかを推奨します。
$ sudo apt-get install lcov

◆カーネルカバレッジデータの取得

GCOVカーネルをビルドしたなら、そのカーネルでRaspberry Pi を実際に動かしてみます。

/sys/kernel/debug/gcov/ 以下にカバレッジデータが蓄積されていますので、
そのデータを取得し、ホスト環境に持って行きます。
$ sudo mount -t debugfs nodev /sys/kernel/debug/
$ sudo cp -a /sys/kernel/debug/gcov/home/mint/raspi/linux-3.19.y ./gcov-data
$ sudo tar cvjf gcov.tar.bz2 gcov-data/
※ピンク色の部分はクロスビルドした環境によって異なります。

◆カーネルカバレッジデータのhtml化

ところ変わって、こちらはホスト環境側になります。
KERNEL_DIR はクロスビルドした Linux カーネルのディレクトリです。
$ export KERNEL_DIR=/home/mint/raspi/linux-3.19.y
$ export CROSS_COMPILE=arm-linux-gnueabihf-
Raspberry Pi 上で取得した gcov.tar.bz2 を適当なディレクトリに展開します。
$ mkdir gcov-tmp/
$ cd gcov-tmp/
$ tar xvjf gcov.tar.bz2


クロス環境での lcov の使い方がいまいちよく分からなかったので、
この辺りは自分がトライ&エラーで試した結果になります。
なのでもっとスマートな方法があるかもしれないです。

カバレッジデータとソースコードを同ディレクトリに置くために、取得データをカーネルツリーにコピーします。
(lcov のオプションで別ディレクトリのままでもいけそうな気もするのですが。)
$ cp -a gcov-data/* ${KERNEL_DIR}/

クロス用の gcov を指定し、lcovコマンドを叩きます。output-file、output-directory の名前は何でもいいです。
$ lcov --capture --directory ${KERNEL_DIR}/ --output-file coverage.info --gcov-tool ${CROSS_COMPILE}gcov
$ genhtml coverage.info --output-directory out
genhtml により out ディレクトリ下に html が生成されますので、
out ディレクトリ下の index.html をブラウザで開いてください。

参考までに、本家 LTP の説明ページ。あっさりし過ぎ。。。
http://ltp.sourceforge.net/coverage/lcov.php

Raspbian(2015-02)のLinuxカーネルを差し替える

前記事で新バージョン(2015-02-16-raspbian-wheezy)の Raspbian をインストールしたので、Linuxカーネルも差し替えたいと思います。
以下、以前に書いた、この辺を見ながらクロスビルドしました。

微妙に手順変わってます。。。

◆カーネル/ローダブルモジュールのビルド

カーネルのクロスビルドには以前作った環境を使います。
以下、ホスト環境での操作になります。

git からLinuxカーネルのソースを取得します。
$ cd /home/mint/raspi/
$ git clone https://github.com/raspberrypi/linux.git
$ cd linux/
$ git checkout -b rpi-3.19.y remotes/origin/rpi-3.19.y
現時点の最新カーネルバージョンは 3.19.1 でした。(もうすぐ 4.0 になりますね。)

Raspberry Pi 実機上から取得したカーネルコンフィグをベースに、デバッグ関連、プロファイル関連のコンフィグを無効化したカーネルコンフィグ(これ)を使用します。(機能的にはデフォルトを維持してます。圧縮形式は lz4 に変更してますが。)

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ cd /home/mint/raspi/linux/

上記のカスタマイズしたコンフィグを.config として linux ディレクトリ直下に置きます。
$ curl http://sstea.blog.jp/raspi/kbuild/kconfig-rpi-3.19.1 > .config
デフォルトのコンフィグを使用する場合は↓のようにしてもいいです。
$ make bcmrpi_defconfig

カーネルをビルドします。(コア数に応じて -j2 とかお好みで付けてあげてください)
$ make dtbs zImage modules
$ make modules_install INSTALL_MOD_PATH=../out/  INSTALL_MOD_STRIP=--strip-unneeded

前までは zImage を kernel.img にリネームするだけで問題ありませんでしたが、
dtb 使うようになってから、もう一工程、下記作業が必要になったようです。
(ここめっちゃ悩みました。詳細は↓おまけ1参照。
  mkknlimg は "git clone https://github.com/raspberrypi/tools.git" で取ってきた中にあります。)
$ cd /home/mint/raspi/
$ tools/mkimage/mkknlimg --dtok linux/arch/arm/boot/zImage out/kernel.img
dtb ファイル(bcm2708-rpi-b-plus.dtb)もコピーしておきます。
$ cp -p linux/arch/arm/boot/dts/bcm2708-rpi-b-plus.dtb out/

dtbファイルとkernel.img とローダブルモジュール郡を圧縮し、Raspberry Pi に持っていきます。
(まあ、このあたりは好きな方法で持っていってもらえればいいんですが。)
$ tar cvjf new.tar.bz2 out/

$ scp -p new.tar.bz2 pi@192.168.0.100:~
# IPアドレス部分は Raspberry Pi のIPアドレスを指定

◆クロスビルドしたLinuxカーネルへの差し替え
以下、Raspberry Pi 側での操作になります。

dtbファイルとカーネルイメージを差し替えます。
$ tar xvjf new.tar.bz2

$ sudo cp out/bcm2708-rpi-b-plus.dtb /boot/
$ sudo cp out/kernel.img /boot/
新しいカーネルバージョンのローダブルモジュールを展開します。
$ sudo cp -a out/lib/firmware/* /lib/firmware/
$ sudo cp -a out/lib/modules/3.19.1+/ /lib/modules/
リブートし、新しいカーネルの起動確認を行ないます。
$ reboot

もはや不要になったファイルは削除しておこうと思います。(必須ではないです)
$ sudo rm -rf /lib/modules/3.18.9+/ /lib/modules/3.18.9-v7+/
$ sudo rm -rf /boot.bak/

使用しない dtb ファイルや カーネルイメージファイルも削除していいですよね?
(自分が使用しているのは Raspberry Pi Model B+ モデルですので、下記ファイルは使用していません。)
$ sudo rm /boot/bcm2708-rpi-b.dtb /boot/bcm2709-rpi-2-b.dtb /boot/kernel7.img
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        3671884 1723412   1749112  50% /
devtmpfs          219996       0    219996   0% /dev
tmpfs              44836     452     44384   2% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89660       0     89660   0% /run/shm
/dev/mmcblk0p1     57288   10200     47088  18% /boot

◆おまけ1

以前のように、クロスビルドしたlinuxカーネルの zImage ファイルを kernel.img とリネームだけして、Raspberry Pi のカーネルを差し替えてみたんですが、どうも dtb ファイルを認識していないように思います。
ブートログにちらほらエラーも見えますし。
/boot/bcm2708-rpi-b-plus.dtb ファイルは確かに存在するのですが。
(ブートログは /var/log/messages で確認できます。)
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.19.1+ (mint@Mint) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Sat Mar 14 22:50:58 JST 2015
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine: BCM2708
[    0.000000] cma: Reserved 8 MiB at 0x1b800000
[    0.000000] Memory policy: Data cache writeback
            :

試しに、/boot/config.txt の末尾に
device_tree=bcm2708-rpi-b-plus.dtb
と追加し、リブートしてみたところ、
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.19.1+ (mint@Mint) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Sat Mar 14 22:50:58 JST 2015
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine model: Raspberry Pi Model B Plus
[    0.000000] cma: Reserved 8 MiB at 0x1b800000
[    0.000000] Memory policy: Data cache writeback
            :
dtb ファイル認識してますね。。。

どうして、デフォルトのカーネルイメージは config.txt に何も記載がなくても、ちゃんと正しい dtb ファイルを認識できてるんでしょうか?
カーネルバージョンの差か、コンフィグ変えたからか、とか考えていろいろ試してみたんですが、どうも関係なさそうです。
カーネルイメージに何か情報を付与してんじゃねーの?と思って、オリジナルのkernel.imgをバイナリエディタで開いてみると、、、
末尾に何か付いてますね。。。文字列が読めます。
圧縮イメージなのに読める文字列があるって事は、圧縮後に付与されたって事です。

zImageファイルはImageファイルを圧縮して自己展開プログラムを先頭にくっつけたファイルで、自分が知る限り末尾にこんな情報はくっつかないので、外部ツールなりでzImageにこの情報を付与する加工を加えているように思います。

カーネルイメージ生成手順、何か増えてんのか?と思って https://github.com/raspberrypi/tools の中をいろいろ見てると mkknlimg とかいうそれらしいのがありました。

で、コレ使って kernel.img 作ってみると、、、

$ mkknlimg --dtok zImage kernel.img
config.txt を弄らなくても、いけましたー。

◆おまけ2
CONFIG_KALLSYMS を無効化しようとして毎回、迷子になるのでメモ。

[1] CONFIG_LATENCYTOP と CONFIG_FTRACE を無効化

  Kernel hacking  --->
  [ ] Latency measuring infrastructure
  [ ] Tracers  ----

[2] CONFIG_KPROBES を無効化
  General setup  --->
  [ ] Kprobes

[3] KALLSYMS_ALL がようやく変更可能になるので無効化
  General setup  --->
  -*- Configure standard kernel features (expert users)  --->
  [ ]   Load all symbols for debugging/ksymoops

◆おまけ3
dtb (device tree blob)
ファイルは dts (device tree source)ファイルから生成されますが、dtb ファイルから dts ファイルに戻す事もできます。
Linux ツリーの中に dtc (device tree compiler)が入っています。

下記、コマンドで dtb ファイルから dts ファイルを取得できます。
$ cd /home/mint/raspi/
$ linux/scripts/dtc/dtc -I dtb -O dts ./bcm2708-rpi-b-plus.dtb > ./out.dts

Raspberry Pi のカーネルをクロスビルドする

前回までは設定をいじってましたが、今回はLinuxカーネルを差し替えます。

こちらの記事で最新のRaspbianのカーネルを差し替えてますので、そちらも参考までに。

◆VirtualBox上でクロスコンパイルする

特にカーネルを差し替える必要はないのかもしれませんが、自己満足コンフィグレーションの最適化のため、何となく自家製Myカーネルに差し替えたいと思います。愛着もわきますし。

Raspberry Piのターゲット上でカーネルをビルドをすることも可能ですが、カーネルビルドするにはRaspberry Piでは非力で、とても時間がかかってしまうため、VirtualBox上に構築したLinux Mintでクロスコンパイルしようと思います。

VirtualBox上にLinux Mintの構築方法はこちらを参照。

以下はVirtualBox上のLinux Mintでの操作です。

◆Raspberry Pi用クロスコンパイラを取得する
コンパイラもカーネルソースもgitで公開されています。

  GitHub (https://github.com/raspberrypi/)

gitがインストールされていない場合は、インストールしておきます。
$ sudo apt-get install git

まずはTerminalを起動し、適当な作業ディレクトリを作成します。
以降、作業ディレクトリを ${HOME}/raspi/ として記述します。
$ cd ${HOME}/raspi/
$ git clone https://github.com/raspberrypi/tools.git

取得してきた中を見ると tools/arm-bcm2708/ に以下の4つのツールチェーンがあります。
- arm-bcm2708-linux-gnueabi
- arm-bcm2708hardfp-linux-gnueabi
- gcc-linaro-arm-linux-gnueabihf-raspbian
- gcc-linaro-arm-linux-gnueabihf-raspbian-x64

どれを使うべきか、、、
自分は 32bit版 Linux Mint をインストールしているので 64bit版はそもそも実行できません。
これで残りの候補は3つ。(64bitマシンならこれ一択でいい気もします)
それぞれの gcc で --version を実行した結果が下記です。
$ arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-gcc --version
arm-bcm2708-linux-gnueabi-gcc (crosstool-NG 1.15.2) 4.7.1 20120402 (prerelease)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-gcc --version
arm-bcm2708hardfp-linux-gnueabi-gcc (crosstool-NG 1.15.2) 4.7.1 20120402 (prerelease)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) 4.8.3 20140106 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
gcc-linaro-arm-linux-gnueabihf-raspbian がGCCバージョン4.8.3 で一番新しいので、これを使うことにします。
(安易ですが、OSSは最新であれば最新ほどいい、が自分のモットーですので。)

.bashrc の最後に
PATH=${HOME}/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:${PATH}
とでも付け加えて、パスを通しておきます。

# 新しいTerminalを使うか ". ~/.bashrc" と実行しないと、まだ反映はされていませんので注意。

◆Raspberry Pi用Linuxカーネルのソースコードを取得
$ cd ${HOME}/raspi/
$ git clone https://github.com/raspberrypi/linux.git
それなりに時間かかると思います。

◆Raspberry Pi用のカーネルコンフィグを最適化する
カーネルコンフィグは Raspberry Pi 上で
$ sudo zcat /proc/config.gz > raspi.config
とすれば、今 Raspberry Pi で動いているLinuxカーネルのカーネルコンフィグが取得できます。

今回は自分がデフォルトのコンフィグをベースに変更を加えたこのコンフィグを使用します。
カーネルバージョンは 3.12.31 です。

# もっと最新のカーネルがいいという方はもっと↓を参照。

変更点は下記の通りです。
- デバッグ関連のコンフィグを無効化
(ダンプ 吐かれても別に原因解析する気ないなー、と思ったのでCOREDUMP、GDB、KPROBEとか全部切ってます。)
- プロファイル関連のコンフィグを無効化
- IPv6 の無効化(元々ローダブルモジュールだったのでそのままでもいいのですが)
- ROOT_NFS の無効化
- カーネル圧縮形式をlz4に変更
- ログバッファサイズとかその他、何点か微修正

カーネルイメージの省サイズ化、及びオーバーヘッド軽減を目的としたものなので、デフォルトのコンフィグから機能的には変わっていないはずです。(nfs root を使用する場合を除き)

上記コンフィグを.config として linux ディレクトリ直下に置きます。
$ curl http://sstea.blog.jp/raspi/kbuild/kconfig-rpi-3.12.31 > .config

◆Raspberry Pi用のカーネルをビルド(再構築)する
今回、カーネル圧縮形式をlz4にしているので下記をインストールしておきます。
$ sudo apt-get install liblz4-tool

ついでに、カーネルビルドに必要なパッケージが未インストールなら入れておきます。
$ sudo apt-get install build-essential libncurses5-dev

環境変数を設定します。
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
カーネルコンフィグを変えたい場合は変えます。(変えないならmenuconfigは不要です。)
$ cd ${HOME}/raspi/linux/
$ make menuconfig
カーネルをビルドします。
$ make
カーネルモジュールのビルド&インストールを行います。(インストール先はテンポラリなのでどこでもいいです。../mod-3.12.31である必要はありません。)
$ make modules
$ make modules_install INSTALL_MOD_PATH=../mod-3.12.31/  INSTALL_MOD_STRIP=--strip-unneeded

ビルドが完了したなら、linux/arch/arm/boot/zImage がカーネルイメージになります。
これを kernel.img とリネームし、Raspberry Pi の /boot/kernel.img と置換することで新カーネルに差し替えることが出来ます。

ちなみに、元のカーネルイメージはgzip圧縮形式で 3.3MBほどでした。
今回のカーネルイメージはlz4圧縮形式で3.0MBほどで、シュリンク出来ています。
(同じgizp圧縮形式なら2.6MBまで縮みましたが、展開速度が高速なlz4を採用しています。)

あと、${HOME}/raspi/mod-3.12.31/ というのが出来ているはずなのでこの中の lib/modules/3.12.31+/ をRaspberry Pi の /lib/modules/ 以下に置いてあげるのも忘れずに。

ちなみに、../mod-3.12.31/lib/firmware/ にもいろいろファイルが出来ているのですが、
Raspberry Pi の /lib/firmware/ にあるファイルと一つも被っていないのが謎。
たぶんなくてもいい気もしますが、念のために ../mod-3.12.31/lib/firmware/ 以下のファイルも Raspberry Pi の /lib/firmware/ 以下にコピーしておくことにします。

◆Raspberry Pi用のチャキチャキの最近カーネルを使用する
と、ここで終わってもいいのですが、せっかくビルドまでして自家製カーネルを使うのだから、最新バージョンのカーネルを使用したいと思います。
現在の最新バージョンは 3.17.2 ですので、3.17.2 のカーネルにしましょう。

git でLinuxカーネルのソースを取得する所までは同じです。
(または、3.12.31 のツリーが不要なら make distclean してそれを流用しましょう。)
$ cd ${HOME}/raspi/linux/
$ git checkout -b rpi-3.17.y remotes/origin/rpi-3.17.y

3.17.2 のカーネルコンフィグにはこのコンフィグを使用します。
デフォルトコンフィグからの変更点は 3.12.31 の時と同様です。

ビルド方法等は 3.12.31 と同様です。

カーネルイメージを差し替えて、リブート後 Raspberry Pi 上で
$ uname -r
とし、3.17.2 と表示されていれば成功です。

◆カーネルイメージのファイル名を変更する
今回はカーネルを自家製カーネルに置き換えました。
ファームアップデート等を行なうと、本家のカーネルイメージに置き換えられてしまいます。

カーネルイメージのファイル名をデフォルト(kernel.img) から変更することで、これを回避することができます。

/boot/config.txt に下記を追記します。
$ kernel=kernel-3.17.img

カーネルイメージのファイル名をリネームします。
$ sudo mv /boot/kernel.img /boot/kernel-3.17.img

◆おまけ1
カーネルのオーバーヘッド軽減を目指してカーネルコンフィグをいじりましたが、効果は出ているのでしょうか?

printk で表示できる時間はカーネル起動からの時間のため、カーネル省サイズ下によるブートローダーの展開時間削減の効果は残念ながら正確な確認方法がありません。(体感できるレベルでなければ)

カーネル起動後であればカーネルログで確認できますので、今回の確認方法としてはカーネルログのrootfsのマウントまでの時間("EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)"とういうログの出力時間)を指標としたいと思います。
以前の記事でquietの効果確認を行なったのと同じ方法です。)

オリジナルconfig
raspberrypi kernel: [   13.000215] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
変更config
raspberrypi kernel: [   12.670055] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)

一応オリジナルより早くなってそうです。体感できないと思いますが。
小さなことからコツコツと!!

◆おまけ2

initramfsを使用してみます。

# 結局使用しない構成に戻しましたが。

現状のブートシーケンスはbootloader→kernel→rootfsの順に起動しますが、
bootloader→kernel→initramfs→rootfsの順に起動させる事ができます。

このinitramfsで先に起動させておきたいデーモン等やモジュールのロード等を済ませれば、rootfsの起動スクリプトの処理が遅かろうが関係ありません。
$ sudo apt-get install initramfs-tools
$ sudo update-initramfs -c -k $(uname -r)
で /boot/ 以下に initrd.img-3.17.2+ というファイルが出来ているはずです。

/boot/config.txt に以下を追記すれば、initramfsを使用したブートシーケンスになります。
initramfs initrd.img-3.17.2+
ただこのままだと、純粋にinitramfsを経由するようになった分だけ起動時間が少し遅くなっただけでメリットはありません。

initramfsの中身をいじくるためにこのファイルを VirtualBox の Linux Mint 上に持っていきます。
以下は ${WORKDIR} にファイルを持ってきたとして記載します。

ファイル名を変更し、ディレクトリを作成しておきます。
$ mv initrd.img-3.17.2+ initrd.img-3.17.2+.orig.gz
$ mkdir -p ${WORKDIR}/initramfs/
展開します。
$ cd ${WORKDIR}/initramfs/
$ gunzip -c -9 ../initrd.img-3.17.2+.orig.gz | cpio -i -d -H newc
お好きにいじくってください。

満足したら、再びinitramfsイメージにします。
$ cd ${WORKDIR}/initramfs/
$ find . | cpio -o -H newc | gzip > ../initrd.img-3.17.2.+
これを raspberry pi の /boot/ 以下においてあげてください。


次回はいったんこの環境をバックアップしようと思います。
プライバシーポリシー
当サイトでは、Googleを含む第三者配信事業者や広告ネットワークが配信する広告を掲載しています。
当サイトでは、アクセス情報に基づいた適切な広告表示、及びトラフィックデータ収集のためにCookieを使用しています。
ユーザーはCookieの無効化により、これらの情報の提供を拒否する事ができます。
スポンサーリンク
記事検索
スポンサーリンク