• 使用Qemu运行Ubuntu文件系统(1)


    参考

     

    平台

    Qemu + AArch32(vexpress-ca9)
    Linux: Linux-4.14.13
     

    概述

            根文件系统采用busybox的优点是节省空间,缺点是添加一款软件就需要自己找源代码编译,还需要解决依赖关系,费时费力,为了解决这个问题,可以使用ubuntu的arm版本的根文件系统,这样就可以充分利用ubuntu软件仓库里已经做好的众多软件包,并且依赖关系也已经帮我们解决了,安装的方式跟PC机一样,使用apt命令。
     

    正文

    使用的平台还是Qemu,用它来模拟一个vexpress-ca9开发板,这部分可以参考下面的博客:

    用Qemu搭建aarch32学习环境

    为Qemu aarch32开发板添加sd卡

     
    启动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、增加软件源

    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
    
    function mnt() {
        echo "MOUNTING"
        sudo mount -t proc /proc ${2}proc
        sudo mount -t sysfs /sys ${2}sys
        sudo mount -o bind /dev ${2}dev
    
        sudo chroot ${2}
    }
    
    function umnt() {
        echo "UNMOUNTING"
        sudo umount ${2}proc
        sudo umount ${2}sys
        sudo umount ${2}dev
    
    }
    
    
    if [ "$1" == "-m" ] && [ -n "$2" ] ;
    then
        mnt $1 $2
    elif [ "$1" == "-u" ] && [ -n "$2" ];
    then
        umnt $1 $2
    else
        echo ""
        echo "Either 1'st, 2'nd or both parameters were missing"
        echo ""
        echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
        echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
        echo ""
        echo "For example: ch-mount -m /media/sdcard/"
        echo ""
        echo 1st parameter : ${1}
        echo 2nd parameter : ${2}
    fi

    切换根目录:

    sudo ch-mount.sh -m tmp/
    • 更新

    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 -u tmp/

    四、制作根文件系统

    • 查看根文件系统的大小

    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-serialx2dgetty.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-serialx2dgetty.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
     未完待续……
     
  • 相关阅读:
    result set sql server
    [转载]:C#、.Net面试题目及答案
    [转载]:合并两个已排序好的int数组,并排序返回c#实现
    [转载]实际举例C#引用类型和值类型的区别
    mysql 性能优化方案
    oracle 并行原理深入解析及案例精粹
    创建Oracle外部表 External Table
    Oracle 分区表
    MySQL索引类型一览
    MySQL配置文件mysql.ini参数详解、MySQL性能优化
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/9540670.html
Copyright © 2020-2023  润新知