31908


組み込み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が動作しないのが疑問です。  
バグでしょうか？


CC BY-SA 3.0
2017-01-15T04:45:42.123
31861
2017-01-17T09:41:26.030
2017-01-17T05:57:50.740
7844
7844
question
linux kernel
linux kernel uImageのinstall方法


ファイル名が vmlinuz もしくは vmlinux になっているだけで、中身は uImage ということはないでしょうか？

というのも、
[arch/arm/boot/Makefile](https://git.kernel.org/cgit/linux/kernel/git/stable/linux-
stable.git/tree/arch/arm/boot/Makefile?id=refs/tags/v4.9.4)
でuinstallターゲットが定義されており、
[arch/arm/boot/install.sh](https://git.kernel.org/cgit/linux/kernel/git/stable/linux-
stable.git/tree/arch/arm/boot/install.sh?id=refs/tags/v4.9.4)
を呼び出しているのですが、このスクリプトは **元のファイル名が zImage でなければ vmlinux というファイル名に変更して**
コピーするようです。

[code]

    $ 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
    
[/code]

また `/sbin/installkernel`
等が存在すればそれが使われますが、例えばCentOSのそれはppc系以外であれば全てvmlinuzにしてしまうようでした。（ただし `make
uinstall` の INSTALL_PATH が引き継がれなかったので、上記のテストでは無効化しました）

[uinstallターゲットが追加されたコミット](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a65d29225ed884456f3d34dcefd3a18df24af03b)では、TFTPサーバーにコピーするスクリプトとかを
`~/bin/installkernel` に置けて便利、といったことが書かれているので、単にINSTALL_PATHに uImage
をコピーするためだけに使うという用途は想定されていなかったのかもしれません。


CC BY-SA 3.0
2017-01-17T09:41:26.030
31908
2017-01-17T09:41:26.030
8000
31861
answer