使用Qemu运行Ubuntu文件系统(1)
参考
平台
Qemu + AArch32(vexpress-ca9)
Linux: Linux-4.14.13
概述
根文件系统采用busybox的优点是节省空间,缺点是添加一款软件就需要自己找源代码编译,还需要解决依赖关系,费时费力,为了解决这个问题,可以使用ubuntu的arm版本的根文件系统,这样就可以充分利用ubuntu软件仓库里已经做好的众多软件包,并且依赖关系也已经帮我们解决了,安装的方式跟PC机一样,使用apt命令。
正文
使用的平台还是Qemu,用它来模拟一个vexpress-ca9开发板,这部分可以参考下面的博客:
启动Qemu的命令如下:
kernel_dir=./Linux-4.14.13 kernel_image=${kernel_dir}/arch/arm/boot/zImage dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb sudo qemu-system-arm \ -M vexpress-a9 \ -m 1024M \ -smp 4 \ -kernel ${kernel_image} \ -nographic \ -append "root=/dev/mmcblk0 rw rootfstype=ext4 console=ttyAMA0,115200" \ -net nic,vlan=2 -net tap,vlan=2,ifname=tap2 \ -sd ./ubuntu_rootfs/ubuntu.img \ -dtb ${dtb_image}
说明,其中/dev/mmcblk0表示跟文件系统所在的设备,因为没有进行分区并且使用sd卡启动方式,所以是mmcblk0。第13行就是我们下面要制作的ubuntu根文件系统。
一、安装Qemu
在Linux PC主机上安装模拟器:
sudo apt-get install qemu-user-static
二、下载和解压 ubuntu-core
先从官方上获取ubuntu core的tar包:http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/
选择下载ubuntu-base-16.04-core-armhf.tar.gz,下载完之后,创建临时文件夹并解压根文件系统:
mkdir tmp sudo tar -xf ubuntu-base-16.04-core-armhf.tar.gz -C tmp/
三、修改根文件系统
1、准备网络
sudo cp -b /etc/resolv.conf tmp/etc/resolv.conf
这个文件存放了DNS服务器的地址
2、准备qemu
cp /usr/bin/qemu-arm-static tmp/usr/bin/
3、增加软件源
参考:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu-ports/
sudo vim tmp/etc/apt/source.list 将下面的两行的注释取消掉: deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe
4、进入根文件系统进行操作
可以使用下面的脚本ch-mount.sh将根目录切换到tmp下:
#!/bin/bash
if [ -z "${1}" ]; then
echo "Usage: $0 CHROOT_DIR [BRANCH_NAME|umount]"
exit 1
fi
chrootdir="${1}"
branchname="${2:-}"
if [ ! -d "${chrootdir}" ]; then
echo "Not dir ${chrootdir}"
exit 1
fi
if [ "$(df -T "${chrootdir}" | tail -n1 | awk '{print $2}')" = "sffs" ]; then
echo "Should not use sffs"
exit 1
fi
function mountfs()
{
mountpoint -q "${chrootdir}/dev" || mount --bind /dev "${chrootdir}/dev"
mountpoint -q "${chrootdir}/dev/pts" || mount -t devpts pts "${chrootdir}/dev/pts"
mountpoint -q "${chrootdir}/proc" || mount -t proc proc "${chrootdir}/proc"
mountpoint -q "${chrootdir}/sys" || mount -t sysfs sys "${chrootdir}/sys"
}
function umountfs()
{
mountpoint -q "${chrootdir}/dev/pts" && umount "${chrootdir}/dev/pts"
mountpoint -q "${chrootdir}/dev" && umount "${chrootdir}/dev"
mountpoint -q "${chrootdir}/proc" && umount "${chrootdir}/proc"
mountpoint -q "${chrootdir}/sys" && umount "${chrootdir}/sys"
}
function chroot_run()
{
env -i - LC_ALL=C.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US: LROOT=/root TERM=${TERM} USER=root TZ=Asia/Shanghai HOME=/root _=/usr/bin/env /usr/sbin/chroot "${chrootdir}" "$@"
}
if [ "${branchname}" = "umount" ]; then
umountfs
exit 0
fi
if [ ! -s "${chrootdir}/etc/hosts" ]; then
cat >"${chrootdir}/etc/hosts" << EOF
127.0.0.1 localhost
EOF
fi
if [ ! -s "${chrootdir}/etc/resolv.conf" ]; then
cat >"${chrootdir}/etc/resolv.conf" << EOF
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
fi
mountfs
echo "Enter chroot dir ${chrootdir}"
chroot_run bash -c "cd /root; exec bash --login -i"
切换根目录:
sudo ch-mount.sh tmp/ mount
-
更新
apt update
apt upgrade
-
安装软件包
apt install udev #否则ttyAMA0无法找到 apt install vim #vim编辑器 apt install net-tools #ifconfig,netstat,route,arp等 apt install iputils-ping #ping apt install sudo #sudo命令 #apt install ssh #ssh的client和server apt install ethtool #ethtool命令,显示、修改以太网设置 #apt install wireless-tools #iwconfig等,显示、修改无线设置 apt install ifupdown #ifup,ifdown等工具 #apt install network-manager #Network Manager服务和框架,高级网络管理 apt install rsyslog #系统log服务 apt install bash-completion #bash命令行补全 apt install htop #htop工具,交互式进程查看器
apt install nfs-common #可以远程挂载mount -t nfs
apt install telnetd #可以用telnet登录
对于bash命令自动补全功能,需要安装bash-completion,此外还需要修改/etc/bash.bashrc,将下面的命令的注释去掉:
1 # enable bash completion in interactive shells 2 if ! shopt -oq posix; then 3 if [ -f /usr/share/bash-completion/bash_completion ]; then 4 . /usr/share/bash-completion/bash_completion 5 elif [ -f /etc/bash_completion ]; then 6 . /etc/bash_completion 7 fi 8 fi
然后重新登录即可。
-
创建用户
全部安装完之后,添加一个用户pengdl,并设置密码,同时把root的密码也修改一下:
useradd -s '/bin/bash' -m -G adm,sudo pengdl #增加pengdl用户,同时加到sudo用户组,这样就可以使用sudo命令了 passwd pengdl #给pengdl用户设置密码 passwd root #修改root密码
为pengdl增加sudo权限,修改/etc/sudoers,增加:
pengdl ALL=(ALL:ALL) ALL
-
设置ip
编辑/etc/network/interfaces,添加如下内容:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 gateway 192.168.1.1
-
设置hostname
设置主机名称: echo "ubuntu-arm">/etc/hostname 设置本机入口ip: echo "127.0.0.1 localhost">>/etc/hosts echo "127.0.1.1 ubuntu-arm">>/etc/hosts
在软件安装完毕后,退出根目录:ctrl+D 或者 exit
执行umount:
./ch-mount.sh tmp/ umount
四、制作根文件系统
-
查看根文件系统的大小
du -sh tmp/ 351M tmp/
-
生成镜像,并格式为ext4
dd if=/dev/zero of=ubuntu.img bs=1M count=1024 mkfs.ext4 ubuntu.img mkdir mnt sudo mount ubuntu.img mnt sudo cp -rfp tmp/* mnt sudo umount mnt #检查并修复ubuntu.img e2fsck -p -f ubuntu.img
五、测试
-
开机:
[ 8.915670] Freeing unused kernel memory: 1024K [ 12.875789] systemd[1]: Failed to insert module 'autofs4': No such file or directory [ 13.486345] systemd[1]: systemd 229 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN) [ 13.497463] systemd[1]: Detected architecture arm. Welcome to Ubuntu 16.04 LTS! [ 13.536063] systemd[1]: Set hostname to <ubuntu-arm>. [ 15.590117] systemd-gpt-aut (1023) used greatest stack depth: 4908 bytes left [ 16.987350] systemd[1]: Reached target Swap. ... [ OK ] Found device /dev/ttyAMA0. [ OK ] Reached target Sound Card. [ OK ] Started ifup for eth0. [ OK ] Found device /sys/subsystem/net/devices/eth0. [ OK ] Started LSB: Set the CPU Frequency Scaling governor to "ondemand". [ OK ] Started Raise network interfaces. [ OK ] Reached target Network. Starting /etc/rc.local Compatibility... [ OK ] Started /etc/rc.local Compatibility. [ OK ] Started Serial Getty on ttyAMA0. [ OK ] Started Getty on tty5. [ OK ] Started Getty on tty3. [ OK ] Started Getty on tty6. [ OK ] Started Getty on tty2. [ OK ] Started Getty on tty1. [ OK ] Started Getty on tty4. [ OK ] Reached target Login Prompts. [ OK ] Reached target Multi-User System. [ OK ] Reached target Graphical Interface. Starting Update UTMP about System Runlevel Changes... [ OK ] Started Update UTMP about System Runlevel Changes. Ubuntu 16.04 LTS ubuntu-arm ttyAMA0 ubuntu-arm login: pengdl Password: Last login: Sun Aug 26 16:14:28 UTC 2018 on ttyAMA0 Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.14.13+ armv7l) * Documentation: https://help.ubuntu.com/ pengdl@ubuntu-arm:~$ ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56 inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2101 (2.1 KB) TX bytes:296 (296.0 B) Interrupt:31 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) pengdl@ubuntu-arm:~$ ping www.baidu.com PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data. 64 bytes from 61.135.169.121: icmp_seq=1 ttl=56 time=4.12 ms 64 bytes from 61.135.169.121: icmp_seq=2 ttl=56 time=3.71 ms 64 bytes from 61.135.169.121: icmp_seq=3 ttl=56 time=3.83 ms ^C --- www.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2017ms rtt min/avg/max/mdev = 3.717/3.891/4.125/0.186 ms pengdl@ubuntu-arm:~$ sudo apt install htop Reading package lists... Done Reading state information... Done Suggested packages: lsof strace The following NEW packages will be installed: htop 0 upgraded, 1 newly installed, 0 to remove and 51 not upgraded. Need to get 67.7 kB of archives. After this operation, 146 kB of additional disk space will be used. Get:1 http://ports.ubuntu.com/ubuntu-ports xenial/universe armhf htop armhf 2.0.1-1 [67.7 kB] Fetched 67.7 kB in 2s (27.0 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package htop. (Reading database ... 10417 files and directories currently installed.) Unpacking htop (2.0.1-1) ..._2.0.1-1_armhf.deb ... Processing triggers for mime-support (3.59ubuntu1) ...
-
关机:
pengdl@ubuntu-arm:~$ sudo shutdown -h now [ OK ] Stopped target Timers. [ OK ] Stopped Daily apt activities. [ OK ] Stopped target System Time Synchronized. [ OK ] Stopped target Graphical Interface. [ OK ] Stopped Daily Cleanup of Temporary Directories. [ OK ] Stopped target Multi-User System. [ OK ] Stopped target Login Prompts. Stopping Getty on tty6... Stopping Getty on tty1... Stopping Getty on tty5... Stopping Getty on tty4... [ OK ] Stopped getty on tty2-tty6 if dbus and logind are not available. Stopping Getty on tty2... Stopping Getty on tty3... Stopping LSB: Set the CPU Frequency Scaling governor to "ondemand"... [ OK ] Reached target Unmount All Filesystems. [ OK ] Stopped target Sound Card. Stopping Serial Getty on ttyAMA0... [ OK ] Removed slice system-getty.slice. [ OK ] Stopped /etc/rc.local Compatibility. [ OK ] Stopped target Network. Stopping Raise network interfaces... Stopping Permit User Sessions... [ OK ] Removed slice system-serial\x2dgetty.slice. [ OK ] Stopped LSB: Set the CPU Frequency Scaling governor to "ondemand". [ OK ] Stopped Permit User Sessions. [ OK ] Stopped target Basic System. [ OK ] Stopped target Paths. [ OK ] Stopped Forward Password Requests to Wall Directory Watch. [ OK ] Stopped Dispatch Password Requests to Console Directory Watch. [ OK ] Stopped target Slices. [ OK ] Stopped target System Initialization. [ OK ] Stopped target Encrypted Volumes. [ OK ] Stopped target Swap. Stopping Update UTMP about System Boot/Shutdown... Stopping Load/Save Random Seed... Stopping Network Time Synchronization... [ OK ] Stopped target Sockets. [ OK ] Stopped target Remote File Systems. [ OK ] Stopped target Remote File Systems (Pre). [ OK ] Stopped Load/Save Random Seed. [ OK ] Stopped Network Time Synchronization. [ OK ] Stopped Update UTMP about System Boot/Shutdown. [ OK ] Stopped Create Volatile Files and Directories. [ OK ] Stopped Raise network interfaces. [ OK ] Stopped Apply Kernel Variables. [ OK ] Stopped target Local File Systems. [ OK ] Stopped target Local File Systems (Pre). [ OK ] Stopped Create Static Device Nodes in /dev. [ OK ] Stopped Remount Root and Kernel File Systems. [ OK ] Stopped Load Kernel Modules. [ OK ] Reached target Shutdown. [ 385.729940] reboot: Power down sudo brctl delif br0 tap2 sudo tunctl -d tap2 TUNSETIFF: Device or resource busy brctl show bridge name bridge id STP enabled interfaces br0 8000.f48e387d73d8 no enp3s0 virbr0 8000.000000000000 yes
-
重启:
pengdl@ubuntu-arm:~$ sudo reboot [sudo] password for pengdl: [ OK ] Stopped target Sound Card. [ OK ] Reached target Unmount All Filesystems. [ OK ] Stopped target Timers. [ OK ] Stopped Daily apt activities. [ OK ] Stopped target System Time Synchronized. [ OK ] Stopped Daily Cleanup of Temporary Directories. [ OK ] Stopped target Graphical Interface. [ OK ] Stopped target Multi-User System. Stopping LSB: Set the CPU Frequency Scaling governor to "ondemand"... [ OK ] Stopped target Login Prompts. Stopping Getty on tty5... Stopping Getty on tty3... Stopping Getty on tty2... Stopping Getty on tty6... [ OK ] Stopped getty on tty2-tty6 if dbus and logind are not available. Stopping Getty on tty4... Stopping Serial Getty on ttyAMA0... Stopping Getty on tty1... [ OK ] Stopped Getty on tty4. [ OK ] Stopped Serial Getty on ttyAMA0. [ OK ] Stopped Getty on tty2. [ OK ] Removed slice system-serial\x2dgetty.slice. Stopping Permit User Sessions... [ OK ] Removed slice system-getty.slice. [ OK ] Stopped /etc/rc.local Compatibility. [ OK ] Stopped target Network. Stopping Raise network interfaces... [ OK ] Stopped LSB: Set the CPU Frequency Scaling governor to "ondemand". [ OK ] Stopped Permit User Sessions. [ OK ] Stopped target Basic System. [ OK ] Stopped target Paths. [ OK ] Stopped Forward Password Requests to Wall Directory Watch. [ OK ] Stopped Dispatch Password Requests to Console Directory Watch. [ OK ] Stopped target Sockets. [ OK ] Stopped target Slices. [ OK ] Stopped target System Initialization. Stopping Network Time Synchronization... [ OK ] Stopped target Encrypted Volumes. Stopping Load/Save Random Seed... Stopping Update UTMP about System Boot/Shutdown... [ OK ] Stopped target Swap. [ OK ] Stopped target Remote File Systems. [ OK ] Stopped target Remote File Systems (Pre). [ OK ] Stopped Network Time Synchronization. [ OK ] Stopped Load/Save Random Seed. [ OK ] Stopped Update UTMP about System Boot/Shutdown. [ OK ] Stopped Create Volatile Files and Directories. [ OK ] Stopped Raise network interfaces. [ OK ] Stopped Apply Kernel Variables. [ OK ] Stopped Load Kernel Modules. [ OK ] Stopped target Local File Systems. [ OK ] Stopped target Local File Systems (Pre). [ OK ] Stopped Remount Root and Kernel File Systems. [ OK ] Stopped Create Static Device Nodes in /dev. [ OK ] Reached target Shutdown. [ 85.454918] reboot: Restarting system [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.14.13+ (pengdonglin@pengdonglin-dell) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) #11 SMP PREEMPT Thu Apr 5 11:23:40 CST 2018 [ 0.000000] CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache [ 0.000000] OF: fdt: Machine model: V2P-CA9 [ 0.000000] Memory policy: Data cache writealloc [ 0.000000] cma: Reserved 16 MiB at 0x9f000000
未完待续……
本文来自博客园,作者:dolinux,未经同意,禁止转载