Quantcast
Channel: aimdevel’s blog
Viewing all articles
Browse latest Browse all 35

Linuxをu-bootから起動する on ラズパイ4B

$
0
0

前回ラズパイでu-bootを動作させた。

aimdevel.hatenablog.com

今回はさらにu-bootからlinuxを起動する。

初めに

u-bootまで起動しているのでラスパイ特有の手順はほぼない。
せっかくu-bootを使用するので、linux kernelはFIT imageの形式にしたものを使用する。
FIT imageについては以下を参照。

Flattened Image Tree (FIT) Format — Das U-Boot unknown version documentation

作るもの

以下の内容になるように作成する。

  • linuxブートの流れ

    1. u-boot起動
    2. u-bootがFIT imageからlinuxを起動
  • rootfsの内容
    ラズパイOS公式のもの

実施環境

  • ビルド環境
    windows11のwslでubuntu24.04を使用してビルドなどを行い、sdカードの操作はwindows側で行った。
  • 実機
    ラズパイ4B
  • 対象バージョン
    ラズパイOSの公式イメージ「2024-03-15-raspios-bookworm-arm64-lite.img.xz」と同等。
    • raspi OS bookworm
    • linux kernel
      linux-stable_20240423

手順

以下の資材を準備していく。

資材説明取得元/作成方法
FITImagelinux kernelとdevice treeを含んだイメージ自前で作成する
boot.scru-boot用のスクリプトファイル自前で作成する
sdカードu-bootを起動できるように準備したものにlinuxを起動する設定を加える前回の記事のものを流用
  1. linux kernelをビルドする

     wget https://github.com/raspberrypi/linux/archive/refs/tags/stable_20240423.tar.gz
     tar xf stable_20240423.tar.gz
     cd linux-stable_20240423
     make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig  
     make -j`nproc` ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
    
  2. FIT imageを作成する
    linux-stable_20240423/arch/arm64/boot/ディレクトリに移動し、kernel.itsというファイルを作成する。

     cd arch/arm64/boot/
     touch kernel.its
    

    kernel.itsを以下の内容に編集する。

     /dts-v1/;
     / {
         description = "fitImage for raspberrypi";
         #address-cells = <1>;
         images {
             kernel {
                 description = "Linux kernel";
                 data = /incbin/("./Image.gz");
                 type = "kernel";
                 arch = "arm64";
                 os = "linux";
                 compression = "gzip";
                 load = <0x40480000>;
                 entry = <0x40480000>;
             };
             fdt {
                 description = "Flattened devicetree blob";
                 data = /incbin/("./dts/broadcom/bcm2711-rpi-4-b.dtb");
                 type = "flat_dt";
                 arch = "arm64";
                 compression = "none";
             };
         };
         configurations {
             default = "config-1";
             config-1 {
                 description = "kernel with fdt configuration";
                 kernel = "kernel";
                 fdt = "fdt";
             };
         };
     };
    

    以下のコマンドでビルドする。mkimageコマンドがない場合はインストールすること。
    mkimage -f kernel.its FITImage FITImageが作成される。

  3. boot.scrを作成する
    前回のu-bootの資材を使用する。

    aimdevel.hatenablog.com

    u-bootをビルドしたディレクトリに移動し、boot_cmd.txtを以下の内容で作成する。

     fatload mmc 0:1 ${loadaddr} FITImage
     setenv bootargs "console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rw rootwait"
     bootm
    

    以下のコマンドでboot.scrを作成する。

     tools/mkimage -A arm64 -O linux -T script -C none -d boot_cmd.txt boot.scr 
    

    カレントディレクトリにboot.scrが作成されていることを確認できる。

  4. sdカードを作成する
    u-bootが起動するsdカードの第一パーティションにFITImageとboot.scrを格納する。

  5. 起動する
    sdカードをラズパイにさして電源を入れる。
    u-bootのメッセージが表示された後に、linuxが起動することを確認できる。
    さらにラズパイ実機上でmountコマンドを実行すると、sdカードの第2パーティションがマウントされている様子を見れる。

    [!NOTE]
    rootfsはラズパイOS公式のもののままなので、kernel moduleなどがうまく動いていないと思うが、それは動きとしては正常である。
    この段階でkernel moduleを使用したい場合は、rootfsにlinux kernelをビルドした際に、make modules_installでkernel moduleをインストールしておく必要がある。以下などが参考になる。
    https://qiita.com/tetsu_koba/items/92f22fc6a302f0f66fe7
    今回はu-bootからFIT形式にしたlinuxを起動できるかを確認したかっただけなので、この手順は省略した。

終わりに

ラズパイ上でu-bootからlinuxを起動できることを確認した。
次回はFIT imageにinitramfsも含めてlinuxを起動してみる。

参考資料


Viewing all articles
Browse latest Browse all 35

Trending Articles