質問: 組み込みLinuxを構築しているのですがハードが未着なので とりあえずqemu-system-arm -M vexpress-a9で動かそうとしています。 ブートローダu-bootから起動させるのが条件なため、kernelはuImageになります。 `make ARCH=arm uImage` で uImageを作成できましたが installをどうすればいいかわかりません。 `make ARCH=arm help`で > > uinstall - Install U-Boot wrapped compressed kernel > > Install using (your) ~/bin/installkernel or > > (distribution) /sbin/installkernel or > > install to $(INSTALL_PATH) and run lilo > > > なので `make ARCH=arm INSTALL_PATH=../../target/rootfs/boot uinstall` とすると、uImageではなくvmlinuzが../../target/rootfs/bootにinstallされます。 uImageをinstallするにはどうしたらいいでしょうか? 追記 -- よくある組み込みlinuxの場合、NANDフラッシュにu-boot用,カーネル用, rootfs用 パーティションを作ってカーネルイメージをカーネルパーティションに置き、そこからロードする という方法が取られていますが 今回はext4フォーマットのSDカードにrootfsを置き、rootfs中の /boot/uImageをu-bootがロードするという形にします。 そのための../../rootfsです。 カーネルモジュールは使用しないので、単に`cp arch/arm/boot/uImage ../../target/rootfs/boot`でも構わないといえば構わないのですが helpに出て来ているuinstallが動作しないのが疑問です。 バグでしょうか?
回答: ファイル名が vmlinuz もしくは vmlinux になっているだけで、中身は uImage ということはないでしょうか? というのも、 arch/arm/boot/Makefile でuinstallターゲットが定義されており、 arch/arm/boot/install.sh を呼び出しているのですが、このスクリプトは**元のファイル名が zImage でなければ vmlinux というファイル名に変更して**コピーするようです。 ``` $ cd linux-4.9.4/ $ make ARCH=arm bcm2835_defconfig $ make ARCH=arm ## kernel.releaseを作成したいだけ $ echo "here" > arch/arm/boot/uImage $ touch System.map $ make ARCH=arm INSTALL_PATH=/tmp uinstall /bin/sh ./arch/arm/boot/install.sh "4.9.4" \ arch/arm/boot/uImage System.map "/tmp" Installing normal kernel You have to install it yourself $ ls /tmp System.map-4.9.4 vmlinux-4.9.4 $ cat /tmp/vmlinux-4.9.4 here ``` また `/sbin/installkernel` 等が存在すればそれが使われますが、例えばCentOSのそれはppc系以外であれば全てvmlinuzにしてしまうようでした。(ただし `make uinstall` の INSTALL_PATH が引き継がれなかったので、上記のテストでは無効化しました) uinstallターゲットが追加されたコミットでは、TFTPサーバーにコピーするスクリプトとかを `~/bin/installkernel` に置けて便利、といったことが書かれているので、単にINSTALL_PATHに uImage をコピーするためだけに使うという用途は想定されていなかったのかもしれません。