序文
-
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 の下に新しいディレクトリを作成し、
lib
gcc クロスコンパイル ツールチェーン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_install
Linux カーネル ディレクトリで生成されたコマンドを実行します。 -
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../_install modules_install
-
次に、 Linux モジュール ディレクトリ
lib
内のすべてのファイルをrootfs/lib
次の場所にコピーします。
ルートファイルシステムを作成する
-
Linux ルート ファイル システム ディレクトリを作成するプロセスは、実際には各プラットフォームで同様であるため、プラットフォームが異なる場合は、対応するコンパイラを選択してください。
-
ここでは、スクリプトを使用してルート ファイル システム ディレクトリ テンプレートをすばやく作成し、busybox のコンパイル済み製品と gcc クロスコンパイル環境の lib をコピーして、カスタマイズされたファイル システム イメージにパッケージ化します。
-
create_rootfs.sh
rootfsの各ディレクトリ構造を生成する
#!/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-aarch64
qemuを起動します
#!/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.gz
qemu の起動ディレクトリにコピーします。 -
qemu が起動するディレクトリは次のとおりです。
- rootfs を作成して qemu を起動するための上記のスクリプト、Linux カーネル イメージ
Image.gz
、および上記で作成したものrootfs
。これに基づいて、rootfs
qemu に必要な ext4 イメージを生成します。
-rwxr-xr-x 1 zhangsz zhangsz 292 6月 18 17:22 boot_qemu.sh
-rwxr-xr-x 1 zhangsz zhangsz 1335 6月 18 12:39 create_rootfs.sh
-rw-r--r-- 1 zhangsz zhangsz 13141574 6月 18 12:37 Image.gz
-rwxr-xr-x 1 zhangsz zhangsz 517 6月 18 12:39 make_boot.sh
-rw-r--r-- 1 zhangsz zhangsz 463 6月 18 18:05 readme.md
drwxr-xr-x 7 zhangsz zhangsz 4096 6月 18 18:00 rootfs
-rwxr-xr-x 1 zhangsz zhangsz 118 6月 18 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 などのシステムでも実行できます。