首先在http://cdimage.ubuntu.com/ubuntu-base/releases/
网址下载对应的ubuntu根文件系统源码,链接地址如下图所示,我们这里使用的是20.04版本的ubuntu源码
然后进入下图所示的选项
执行下载我们所需要的文件
选择上图所示的文件进行下载。下载完成后将文件复制到我们的开发机器上。
在开发机器上对文件进行解压缩操作,如上图命令。解压缩完成后的文件夹如下图所示
可以查看我们开机机上是否有 /usr/bin/qemu-arm-static
文件,如果没有则 在开发机上执行 apt-get install qemu-user-static
安装qemu相关工具即可,然后在根文件系统根目录下执行命令sudo cp /usr/bin/qemu-arm-static ./usr/bin/
复制文件即可,如下图所示。
接着拷贝开发机上的DNS配置文件到我们制作的根文件系统上,执行命令 sudo cp /etc/resolv.conf ./etc/
即可,如下图所示。
接着修改默认源,使用命令sudo vim etc/apt/sources.list
打开文件即可,如下图所示
然后将里面的内容全部删除,替换成如下内容
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
替换后的如下图所示,我们的默认源也是好了的。
这些完成后,就可以在主机上去测试看看我们的根文件系统是否可以使用了。
如下图先创建个挂载某些文件系统的脚本文件。
文件内容如下
TOP_DIR=$(cd $(dirname $0) && pwd)
sudo mount -t proc /proc $TOP_DIR/proc
sudo mount -t sysfs /sys $TOP_DIR/sys
sudo mount -o bind $TOP_DIR/dev
sudo mount -o bind /dev/pts $TOP_DIR/dev/pts
sudo chroot $TOP_DIR
然后修改脚本文件权限 sudo chmod 777 mount.sh
即可。接着添加个取消挂载的脚本,文件内容如下
TOP_DIR=$(cd $(dirname $0) && pwd)
sudo umount $TOP_DIR/proc
sudo umount $TOP_DIR/sys
sudo umount $TOP_DIR/dev
sudo umount $TOP_DIR/dev/pts
同样的也要修改脚本文件的权限sudo chmod 777 unmount.sh
即可。执行挂载脚本./mount.sh
即可
执行passwd root
设置我们的密码,输入两次密码即可,设置成功如下图所示
然后设置下本机名称 echo "test_root" > /etc/hostname
即可,然后执行exit退出根文件系统,接着执行./unmount.sh
脚本,取消我们的挂载文件。
遇到的问题 /bin/sh: 0: can't access tty; job control turned of
,这个问题主要是找不到init进程,我这边安装systemd后也没有,查看其他的是使用/sbin/init链接到/lib/systemdsystemd上,这样就可以解决这个问题了
其中lib/systemd/system/getty@.service
文件内容如下
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service
# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes
# IgnoreOnIsolate causes issues with sulogin, if someone isolates
# rescue.target or starts rescue.service from multi-user.target or
# graphical.target.
Conflicts=rescue.service
Before=rescue.service
# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0
[Service]
# the VT is cleared by TTYVTDisallocate
# The '-o' option value tells agetty to replace 'login' arguments with an
# option to preserve environment (-p), followed by '--' for safety, and then
# the entered username.
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION
[Install]
WantedBy=getty.target
DefaultInstance=tty1
问题2 Timed out waiting for device /dev/ttyFIQ0
,这是tty服务造成的
[ OK ] Started System Logging Service.
[ TIME ] Timed out waiting for device /dev/ttyFIQ0.
[DEPEND] Dependency failed for Serial Getty on ttyFIQ0.
[ OK ] Reached target Login Prompts.ev/ttyFIQ0 (59s / 1min 30s)
[ OK ] Reached target Multi-User System.tyFIQ0 (53s / 1mi
[ OK ] Reached target Graphical Interface.FIQ0 (45s / 1mi
Starting Update UTMP about System Runlevel Changes...
[ OK ] Finished Update UTMP about System Runlevel Changes.
DDR V1.14 b1f29a2a6f typ 22/09/02-16:40:04tyFIQ0 (8s / 1min
如下图所示
解决方式:在根文件系统里面执行 apt-get install udev
即可。安装一些常用命令,这边我是用脚本的方式让它运行
cat << EOF | sudo chroot $TARGET_ROOTFS_DIR
apt-get update
apt install sudo usbutils -fy
apt install rsyslog net-tools udhcpc -fy
apt install udev htop iputils-ping -fy
DEBIAN_FRONTEND=noninteractive apt-get install -fy systemd
ln -s /lib/systemd/systemd /sbin/init
echo -e "root\nroot" | passwd root
useradd -s '/bin/bash' -m -G adm,sudo hzmct
echo -e "hzmct\nhzmct" | passwd hzmct
echo "hzmct" > /etc/hostname
echo "127.0.0.1 localhost" > /etc/hosts
echo "127.0.0.1 hzmct" >> /etc/hosts
EOF