ubuntu 20.04 linux6.3.8 qemu arm64プラットフォームでext4ルートファイルシステムを作成します

序文

  • ubuntu 20.04 qemu linux6.0.1を参照してext4ルートファイルシステムを作成できます

  • aarch64 プラットフォームの glib ライブラリを検証する必要があるため、Linux qemu arm64 のテスト環境を再構築しました

  • この記事では、rootfs ルート ファイル システムの作成を開始し、qemu arm64 プラットフォーム上の Linux システムを実行します。

開発環境

  • win10 64位 VMware Workstation Pro 16

  • ubuntu 20.04

  • qemu (仮想 ARM 開発ボード)、virt arm64 プラットフォーム

  • Linux 6.3.8

ビジーボックスをダウンロードして解凍します

  • 現在、busybox を使用すると、Linux ルート ファイル システムに必要な一般的なコマンドをすばやく作成できます。そのため、busybox の最新バージョンは次のとおりです。busybox-1.36.1.tar.bz2

  • Busybox の公式ダウンロード アドレス: 、https://busybox.net/downloads/busybox-1.36.1.tar.bz2公式 Web サイトからhttps://busybox.net/downloads/最新バージョンを直接ダウンロードできます。

  • ダウンロードしたbusyboxをubuntuに入れて解凍します。

$ ls
busybox-1.36.1.tar.bz2

$ tar xjvf busybox-1.36.1.tar.bz2

ビジーボックスをコンパイルする

  • linux gccここで強調したいのは、ワンタイム コンパイルが必要な場合は、クロスコンパイル ツールチェーンが必要であることです(たとえば、aarch64-linux-gnu-xxxこのようなツールチェーンには、Linux 関連のヘッダー ファイルが統合されています)。

  • コンパイルする場合busybox-1.36.1、推奨される Linux gcc は次のとおりです。gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu.tar.xz

  • これは qemu エミュレータです。直接コンパイルできます。当面は、menuconfig で構成を手動で変更する必要はありません。

  • コンパイルコマンドは以下のとおりです。

/* menuconfig 配置,直接保存即可 */
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

/* 创建 busybox 输出的路径 */
$ mkdir /home/zhangsz/linux/rootfs/1016

/* 编译, install,这样就可以把 busybox 的编译产物放在CONFIG_PREFIX的路径下  */
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CONFIG_PREFIX=/home/zhangsz/linux/rootfs/1016/ install

Busybox によってコンパイルされた製品:

$ cd /home/zhangsz/linux/rootfs/1016/

$ ls
bin  linuxrc  sbin  usr
  • Busybox によって直接コンパイルされた製品にはまだ多くの lib ライブラリとコマンドが不足していることに注意してください。これらは継続的に強化する必要があります。Linux カーネル起動コンソールに関連するいくつかの点を補足する必要があります。

完璧な rootfs

  • まず rootfs ディレクトリを作成し、次にすべての Busybox 製品を rootfs にコピーします。

  • まず rootfs の下に新しいディレクトリを作成し、 libgcc クロスコンパイル ツールチェーンlibc/lib/の下のライブラリ ファイルをrootfs/libそのディレクトリにコピーします。

  • sudo cp -rf ../../tools/gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/* rootfs/lib

  • modules_installLinux カーネル ディレクトリで生成されたコマンドを実行します。

  • make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../_install modules_install

  • 次に、 Linux モジュール ディレクトリlib内のすべてのファイルをrootfs/lib次の場所にコピーします。

ルートファイルシステムを作成する

  • Linux ルート ファイル システム ディレクトリを作成するプロセスは、実際には各プラットフォームで同様であるため、プラットフォームが異なる場合は、対応するコンパイラを選択してください。

  • ここでは、スクリプトを使用してルート ファイル システム ディレクトリ テンプレートをすばやく作成し、busybox のコンパイル済み製品と gcc クロスコンパイル環境の lib をコピーして、カスタマイズされたファイル システム イメージにパッケージ化します。

  • create_rootfs.shrootfsの各ディレクトリ構造を生成する

#!/bin/bash
echo "------Create rootfs start...--------"

rootfs=$1
sudo rm -rfv $rootfs
sudo mkdir -v $rootfs
cd $rootfs

echo "--------Create root,dev....----------"
sudo mkdir root dev etc boot tmp var sys proc lib mnt home usr
sudo mkdir etc/init.d etc/rc.d

echo "make node in dev/console dev/null"
sudo mknod -m 600 dev/console c 5 1
sudo mknod -m 600 dev/null  c 1 3

# create etc config /etc/inittab
echo -e "::sysinit:/etc/init.d/rcS " >etc/inittab
echo -e "::askfirst:-/bin/sh " >>etc/inittab
echo -e "::ctrlaltdel:/sbin/reboot " >>etc/inittab
echo -e "::shutdown:/bin/umount -a -r " >>etc/inittab

# create etc config /etc/init.d/rcs
echo -e "#! /bin/sh " >etc/init.d/rcS
echo -e "mount -t sysfs none /sys " >>etc/init.d/rcS
echo -e "mount -t proc none /proc " >>etc/init.d/rcS
echo -e "mount -t tmpfs tmpfs /tmp" >>etc/init.d/rcS
echo -e "mdev -s " >>etc/init.d/rcS
chmod +x etc/init.d/rcS

# create etc config /etc/fstab
echo -e "proc       /proc       proc        defaults 0 0 " >etc/fstab
echo -e "sysfs      /sys        sysfs       defaults 0 0 " >>etc/fstab
echo -e "devtmpfs   /dev        devtmpfs    defaults 0 0 " >>etc/fstab
echo -e "tmpfs      /tmp        tmpfs       defaults 0 0 " >>etc/fstab
echo -e "tmpfs      /var        tmpfs       defaults 0 0 " >>etc/fstab

cd ..
echo "-------make rootfs done---------"
  • make_boot.shスクリプト: rootfs ext4 ミラーを作成します。
#!/bin/bash

echo "---------- make boot.img ------------"

img_ext=".img"
img_mnt="_mnt"

boot_img=$1${
    
    img_ext}
boot_img_mnt=$1${
    
    img_mnt}

echo ${
    
    boot_img}
echo ${
    
    boot_img_mnt}

sudo rm -rf ${
    
    boot_img}
sudo rm -rf ${
    
    boot_img_mnt}


dd if=/dev/zero of=${
    
    boot_img} bs=1M count=1024
mkfs.ext4 ${
    
    boot_img}
sudo mkdir ${
    
    boot_img_mnt}

sudo mount ${
    
    boot_img} ${
    
    boot_img_mnt}
sudo cp -rv $1/* ${boot_img_mnt}
sudo cp -rv rootfs/* ${boot_img_mnt}
sudo umount ${boot_img_mnt}

echo "------------ make boot.img end ---------"
  • boot_qemu.sh: qemu-system-aarch64qemuを起動します
#!/bin/bash
echo "---------- boot qemu ----------"
echo $1

sudo qemu-system-aarch64 \
        -M virt \
        -cpu cortex-a57 \
        -smp 4 \
        -m 4G \
        -kernel Image.gz \
        -drive format=raw,file=$1 \
        -nographic \
        -append "noinitrd root=/dev/vda rw console=ttyAMA0 init=/linuxrc ignore_loglevel" \
  • run.sh: qemu を実行するには、初めて実行することも、sudo ./run.sh後で次の方法でsudo ./boot_qemu.sh rootfs_qemu.img開始することもできます。
#!/bin/bash

source create_rootfs.sh rootfs_qemu
source make_boot.sh rootfs_qemu
source boot_qemu.sh rootfs_qemu.img

qemuを起動する

  • Linux カーネル (現在はlinux-6.3.8カーネル イメージ ファイル)をlinux-6.3.8/arch/arm64/boot/Image.gzqemu の起動ディレクトリにコピーします。

  • qemu が起動するディレクトリは次のとおりです。

ここに画像の説明を挿入

  • rootfs を作成して qemu を起動するための上記のスクリプト、Linux カーネル イメージImage.gz、および上記で作成したものrootfs。これに基づいて、rootfsqemu に必要な ext4 イメージを生成します。
-rwxr-xr-x  1 zhangsz zhangsz        292 618 17:22 boot_qemu.sh
-rwxr-xr-x  1 zhangsz zhangsz       1335 618 12:39 create_rootfs.sh

-rw-r--r--  1 zhangsz zhangsz   13141574 618 12:37 Image.gz
-rwxr-xr-x  1 zhangsz zhangsz        517 618 12:39 make_boot.sh
-rw-r--r--  1 zhangsz zhangsz        463 618 18:05 readme.md
drwxr-xr-x  7 zhangsz zhangsz       4096 618 18:00 rootfs

-rwxr-xr-x  1 zhangsz zhangsz        118 618 12:39 run.sh
  • 最初の実行: rootfs に従ってイメージが作成されrootfs_qemu.img、qemu 起動スクリプトが呼び出されてboot_qemu.sh開始されます。実行コマンドは次のとおりです。sudo ./run.sh

  • 起動情報は以下のとおりです。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

  • プロセス Linux シェル コマンド ライン、qemu arm64 プラットフォームに基づく Linux ext4 ルート ファイル システムは正しく実行されます。

まとめ

  • 上記は、linux6.3.8 qemu arm64 プラットフォームに基づいて ext4 ルート ファイル システムを作成し、Linux カーネルをコンパイルします。構築するには、ubuntu 20.04 qemu arm64 linux6.3.8 開発環境を参照してください。

  • qemu は、組み込み Linux システム開発の初期段階でのいくつかの技術評価と機能検証、特に一部のハードウェア プラットフォームに依存しないソフトウェアの機能開発検証に使用できます。qemu を使用してシミュレーションと実行を行うと、開発の効率が大幅に向上します。

  • 現在、qemu は Linux を実行できるだけでなく、rt-smart などのシステムでも実行できます。

おすすめ

転載: blog.csdn.net/tcjy1000/article/details/131276866
おすすめ