文章目录
X86下构建 ARM 文件系统并运行
构建流程
安装 qemu-user-static
安装 debootstrap
构建 ARM 平台的 Ubuntu 根文件系统
查看 Ubuntu 根文件系统
关于 debootstrap 的用法
验证arm64 ubuntu rootfs
附录
X86下构建 ARM 文件系统并运行
资料参考
在 X86 机器下可以构建一个原生的arm 文件系统,基于qemu-user-static debootstrap chroot命令就可以实现
- 通过qemu-debootstrap可以构建原生的arm 文件系统。
- 通过qemu-aarch64-static 及chroot, 可以在X86主机上对arm 文件系统进行挂载。
- 通过apt命令工具可以对arm 文件系统安装相应的软件包,可以添加帐号,定制主机名等。
下面就通过具体的一系列操作来实现在通用 X86-PC 机上搭建可以运行在 ARM 下的文件系统。
构建流程
基于资料参考接下来的会把整个构建的log都贴出来:
安装 qemu-user-static
$ sudo apt-get install qemu-user-static
[sudo] password for vmuser: Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: binfmt-support The following NEW packages will be installed: binfmt-support qemu-user-static 0 upgraded, 2 newly installed, 0 to remove and 325 not upgraded. Need to get 7,753 kB of archives. After this operation, 86.1 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://mirrors.aliyun.com/ubuntu xenial/main amd64 binfmt-support amd64 2.1.6-1 [50.7 kB] Get:2 http://mirrors.aliyun.com/ubuntu xenial-updates/universe amd64 qemu-user-static amd64 1:2.5+dfsg-5ubuntu10.34 [7,702 kB] Fetched 7,753 kB in 8s (910 kB/s) Selecting previously unselected package binfmt-support. (Reading database ... 276761 files and directories currently installed.) Preparing to unpack .../binfmt-support_2.1.6-1_amd64.deb ... Unpacking binfmt-support (2.1.6-1) ... Selecting previously unselected package qemu-user-static. Preparing to unpack .../qemu-user-static_1%3a2.5+dfsg-5ubuntu10.34_amd64.deb ... Unpacking qemu-user-static (1:2.5+dfsg-5ubuntu10.34) ... Processing triggers for systemd (229-4ubuntu21.15) ... Processing triggers for ureadahead (0.100.0-19) ... Processing triggers for man-db (2.7.5-1) ... Setting up binfmt-support (2.1.6-1) ... Setting up qemu-user-static (1:2.5+dfsg-5ubuntu10.34) ... Processing triggers for systemd (229-4ubuntu21.15) ... Processing triggers for ureadahead (0.100.0-19) ...
安装 debootstrap
$ sudo apt install debootstrap
Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: debootstrap 0 upgraded, 1 newly installed, 0 to remove and 325 not upgraded. Need to get 37.2 kB of archives. After this operation, 262 kB of additional disk space will be used. Get:1 http://mirrors.aliyun.com/ubuntu xenial-updates/main amd64 debootstrap all 1.0.78+nmu1ubuntu1.6 [37.2 kB] Fetched 37.2 kB in 0s (357 kB/s) Selecting previously unselected package debootstrap. (Reading database ... 276841 files and directories currently installed.) Preparing to unpack .../debootstrap_1.0.78+nmu1ubuntu1.6_all.deb ... Unpacking debootstrap (1.0.78+nmu1ubuntu1.6) ... Processing triggers for man-db (2.7.5-1) ... Setting up debootstrap (1.0.78+nmu1ubuntu1.6) ...
构建 ARM 平台的 Ubuntu 根文件系统
接下来使用 qemu-debootstrap 构建 ARM 平台的 Ubuntu 根文件系统
$ sudo qemu-debootstrap --verbose --arch=arm64 --variant=buildd xenial ubuntu_arm64_xenial http://mirrors.ustc.edu.cn/ubuntu-ports
[sudo] password for vmuser: Ok , we get it. I: Configuring gcc-5... I: Configuring libstdc++-5-dev:arm64... I: Configuring gcc... I: Configuring g++-5... I: Configuring g++... I: Configuring build-essential... I: Configuring libc-bin... I: Base system installed successfully.
查看 Ubuntu 根文件系统
现在就能够通过命令看到获取到的 Ubuntu 根文件系统:
$ du -h ubuntu_arm64_xenial/
1.2M ubuntu_arm64_xenial/var/cache/debconf 12K ubuntu_arm64_xenial/var/cache/ldconfig 4.0K ubuntu_arm64_xenial/var/cache/apt/archives/partial 54M ubuntu_arm64_xenial/var/cache/apt/archives 54M ubuntu_arm64_xenial/var/cache/apt 55M ubuntu_arm64_xenial/var/cache 4.0K ubuntu_arm64_xenial/var/tmp 68M ubuntu_arm64_xenial/var 318M ubuntu_arm64_xenial/
关于 debootstrap 的用法
如果要自定义rootfs,则可以添加build args,qemu-debootstrap会将args传输到debootstrap,
因此,了解debootstrap的用法可以帮助构建自定义的 ubuntu rootfs。
$ debootstrap --help Usage: debootstrap [OPTION]... <suite> <target> [<mirror> [<script>]] Bootstrap a Debian base system into a target directory. --help display this help and exit --version display version information and exit --verbose don't turn off the output of wget --download-only download packages, but don't perform installation --print-debs print the packages to be installed, and exit --arch=A set the architecture to install (use if no dpkg) [ --arch=powerpc ] --include=A,B,C adds specified names to the list of base packages --exclude=A,B,C removes specified packages from the list --components=A,B,C use packages from the listed components of the archive --variant=X use variant X of the bootstrap scripts (currently supported variants: buildd, fakechroot, scratchbox, minbase) minbase: 只包含必要的包和apt; buildd: 包含编译工具包 fakechroot: 包含不用root权限的包 scratchbox: 包含scratchbox(交叉编译工具链)相关包 --keyring=K check Release files against keyring K --no-check-gpg avoid checking Release file signatures --force-check-gpg force checking Release file signatures (also disables automatic fallback to HTTPS in case of a missing keyring), aborting otherwise --no-resolve-deps don't try to resolve dependencies automatically --unpack-tarball=T acquire .debs from a tarball instead of http --make-tarball=T download .debs and create a tarball (tgz format) --second-stage-target=DIR Run second stage in a subdirectory instead of root (can be used to create a foreign chroot) (requires --second-stage) --extractor=TYPE override automatic .deb extractor selection (supported: dpkg-deb ar) --debian-installer used for internal purposes by debian-installer --private-key=file read the private key from file --certificate=file use the client certificate stored in file (PEM) --no-check-certificate do not check certificate against certificate authorities
验证arm64 ubuntu rootfs
# cp /usr/bin/qemu-aarch64-static ubuntu_arm64_xenial/usr/bin/ # mount proc ubuntu_arm64_xenial/proc -t proc # mount sysfs ubuntu_arm64_xenial/sys -t sysfs # cp /etc/hosts ubuntu_arm64_xenial/etc/hosts # cp /etc/resolv.conf ubuntu_arm64_xenial/etc/resolv.conf # chroot ubuntu_arm64_xenial/ root@vmuser-virtual-machine:/# ls ---- 》we got it, running arm rootfs in X86 host bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var root@vmuser-virtual-machine:/# ifconfig bash: ifconfig: command not found root@vmuser-virtual-machine:/# apt install net-tools Reading package lists... Done Building dependency tree... Done The following NEW packages will be installed: net-tools 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 165 kB of archives. After this operation, 688 kB of additional disk space will be used. Get:1 http://ports.ubuntu.com/ubuntu-ports xenial/main arm64 net-tools arm64 1.60-26ubuntu1 [165 kB] Fetched 165 kB in 2s (79.9 kB/s) perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US", LC_ALL = (unset), LC_PAPER = "zh_CN.UTF-8", LC_NUMERIC = "zh_CN.UTF-8", LC_IDENTIFICATION = "zh_CN.UTF-8", LC_MEASUREMENT = "zh_CN.UTF-8", LC_NAME = "zh_CN.UTF-8", LC_TELEPHONE = "zh_CN.UTF-8", LC_ADDRESS = "zh_CN.UTF-8", LC_MONETARY = "zh_CN.UTF-8", LC_TIME = "zh_CN.UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). debconf: delaying package configuration, since apt-utils is not installed E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory) Selecting previously unselected package net-tools. (Reading database ... 11949 files and directories currently installed.) Preparing to unpack .../net-tools_1.60-26ubuntu1_arm64.deb ... Unpacking net-tools (1.60-26ubuntu1) ... Setting up net-tools (1.60-26ubuntu1) ...
附录
下面是构建桌面系统对应的源:
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse