• 嵌入式Ubuntu根文件系统移植带桌面


    1、为什么要移植Ubuntu根文件系统

    相信到达这一步的人,都已经对根文件系统有了个充分的认识,已经自己从无到有创建过根文件系统了,玩过busybox的了,也可能移植过别的嵌入式文件系统了。但是,那些根文件系统要么哪个命令不支持,要么一些功能不支持,总之,达不到当前项目的需求了。
    于是,上网一查,顿时惊为天人,原来嵌入式设备也可以这么强了,可以移植使用Ubuntu根文件系统了,经过了网上资料,结合当前的项目需求对Ubuntu根文件系统做了一个了解,然后就记录自己移植的步骤。

    1.1 移植步骤

    1.1.1 Ubuntu获取

    当然了Ubuntu已提供了基本的可移植到嵌入式设备的根文件系统,因此我们去官网下载即可,并选取版本。
    官网地址:http://cdimage.ubuntu.com/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    然后点击下载,将下载好的文件放入到linux系统中。

    1.1.2 移植之前的准备

    移植之前我们需要一个辅助工具,用来对根文件系统进行一个基本的搭建,有那么个借鸡生蛋的那个味。我的理解就是能够模拟出根文件系统运行的状态。

    sudo apt-get install qemu-user-static
    
    • 1

    1.1.3 开始移植

    解压Ubuntu系统
    mkdir rootfs

    sudo tar -vzxf ubuntu-base-16.04.6-base-armhf.tar.gz -C rootfs/
    
    • 1

    32位arm:

    sudo cp /usr/bin/qemu-arm-static ./rootfs/usr/bin/
    
    • 1

    64位arm64:

    sudo cp /usr/bin/qemu-aarch64-static ./rootfs/usr/bin/
    
    • 1
    sudo cp /etc/resolv.conf ./rootfs/etc/resolv.conf
    
    • 1

    1.1.4 增加DNS服务

    sudo vim ./rootfs/etc/resolv.conf
    
    • 1

    加入以下内容:

    nameserver 8.8.8.8
    
    • 1

    退出保存

    1.1.5 挂载VFS

    根文件系统要运行起来,还需要虚拟文件系统,也就是说现在需要模拟根文件系统的运行环境,因此需要挂载proc, sys, dev, dev/pts等目录。操作完成还需要卸载。
    所以将挂载和卸载的命令编写成一个脚本,方便操作,脚本内容如下:

    #!/bin/bash
    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 mount -o bind /dev/pts ${2}dev/pts      
        sudo chroot ${2}    
    }
    umnt ()
    {
        echo "UNMOUNTING"
        sudo umount ${2}proc
        sudo umount ${2}sys
        sudo umount ${2}dev/pts
        sudo umount ${2}dev 
    }
    
    if [ "$1" = "-m" ] && [ -n "$2" ];
    then
        mnt $1 $2
        echo "mnt -m pwd"
    elif [ "$1" = "-u" ] && [ -n "$2" ];
    then
        umnt $1 $2
        echo "mnt -u pwd"
    else
        echo ""
        echo "Either 1'st, 2'nd or bothparameters were missing"
        echo ""
        echo "1'st parameter can be one ofthese: -m(mount) OR -u(umount)"
        echo "2'nd parameter is the rootfs path"
        echo ""
        echo "For example: ./mk.sh -m ./rootfs/"
        echo ""
        echo 1st parameter : ${1}
        echo 2nd parameter : ${2}
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    可以创建一个mk.sh脚本,将内容拷贝进去。
    增加可执行权限:

    chmod 777 mk.sh
    
    • 1

    执行命令:

    ./mk.sh -m ./rootfs/
    
    • 1

    挂载成功后,当前终端已经将根文件系统切换到了我们上面制作的rootfs根文件系统中。

    1.1.6 安装常用的命令和软件

    由于 ubuntu base 是一个最小根文件系统,很多命令和软件都没有,因此我们需要先安装一
    下常用的命令和软件,输入如下命令:

    apt update
    apt install sudo
    apt install vim
    apt install kmod net-tools ethtool ifupdown language-pack-en-base rsyslog htop iputils-ping
    
    • 1
    • 2
    • 3
    • 4

    我们就先安装这些命令和软件,保证 ubuntu base 根文件系统能够在开发板上正常启动即
    可,等启动以后再根据实际情况继续安装其他的命令和软件。

    1.1.7设置 root 用户密码

    设置一下 root 用户的密码,这里我设置简单一点, root 用户密码也设置为“root”,相当于用户名和密码一样,命令如下:

    passwd root 
    
    • 1

    输入“passwd root”以后会让你输入 root 用户密码,输入两次。

    1.1.8 创建用户

    添加一个用户 sdr

    useradd -s '/bin/bash' -m -G adm,sudo sdr
    
    • 1

    给用户 sdr 设置密码

    passwd sdr
    
    • 1

    输入“passwd sdr”以后会让你输入用户密码,输入两次。

    1.1.9 设置主机名和IP

    输入如下命令设置本机名称和 IP 地址:

    echo "sdr" > /etc/hostname
    echo "127.0.0.1 localhost" >> /etc/hosts
    echo "127.0.0.1 sdr" >> /etc/hosts
    
    • 1
    • 2
    • 3

    1.1.10 终端设置

    因为我们的开发板是使用串口作为终端的,所以需要设置一下,比如我们开发板使用的UART1对应的串口设备文件为ttyPS0,我们输入如下命令:

    ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttyPS0.service
    
    • 1

    1.1.11 退出配置

    这样基本配置我们就设置好了,我们退出这个根文件系统,然后取消挂载。
    设置好以后就可以退出根文件系统了,输入如下命令退出:

    exit
    
    • 1

    退出以后再执行一下脚本取消挂载,命令如下:

    ../mk.sh -u ./rootfs/
    
    • 1

    至此, ubuntu base 根文件系统就已经制作好了,接下来就是挂载到开发板上去测试。

    1.2 测试

    1.2.1 制作SD卡启动

    我这边是以一个sd卡启动的镜像为例子。
    sd卡分为BOOT(fat32)和rootfs(ext4)两个区域,将生成的系统拷贝到sd卡rootfs区。

    umount /dev/sdb2
    sudo mkfs.ext4 -L rootfs /dev/sdb2
    
    sudo chmod 755 /media/sdr/rootfs
    sudo chmod 755 /media/sdr/rootfs/*
    
    sudo chown root:root /media/sdr/rootfs
    sudo chown root:root /media/sdr/rootfs/*
    
    sudo rm -rfd /media/sdr/rootfs/*
    sudo cp -a -r ./rootfs/* /media/sdr/rootfs/
    sync
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    然后弹出卡。

    1.2.2 上机验证

    将设备设置为SD卡启动

    Ubuntu 16.04.6 LTS sdr ttyPS0
    
    sdr login: root
    Password:
    Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.14.0-xilinx armv7l)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    The programs included with the Ubuntu system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
    applicable law.
    
    root@sdr:~#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1.3 安装图形界面

    1.3.1 图形界面各个模块说明

    图形程序安装,我安装的桌面是xubuntu-desktop,只需要下面一条指令即可:

    apt install xubuntu-desktop
    
    • 1

    我这个安装是在嵌入式设备上安装的。但是在linux系统中安装也是一样的。

    1.3.2 安装桌面提示重复登录,且密码不正确

    图形程序安装,安装完成后,串口居然登录不上了,说实话啊,心里瞬间不信邪啊,重新安装了一次,结果还是不行啊,废了。
    先说一下现象是什么?就是反复输入用户名和密码,结果提示无效的,提示重新输入,有时候还会出现接连出现两次登录提示,而且等一会之后,突然可以登录上了,也就是说shell终端已经登录上了。但是啊,还提示登录,我就郁闷了,咋回事。

    又测试了几次,根据日志的信息,怀疑是不是有两个终端登录选项,是不是同时需要登录,结果导致数据串味了。交叉了,然后就查看了启动信息确实有两个。然后就更改根文件系统的配置信息去掉了一个。

    我删除的:

    /lib/systemd/system/getty-static.service
    /lib/systemd/system/getty@.service
    
    • 1
    • 2

    我使用的是这个:

    /lib/systemd/system/serial-getty@.service
    
    • 1

    然后串口可以正常登录了。

    1.3.3 Ubuntu关闭软件更新器开机提醒弹窗

    删除更新通知程序

    sudo apt-get remove update-notifier
    
    • 1

    然后登录桌面就没有提示了。

    2、常见配置

    2.1 无法登录

    不论输入什么样的用户名密码,即使完全正确,都会提示:
    验证错误
    是因为这个串口就不支持用户登录,需要添加终端支持:
    打开文件:

    sudo vim /etc/securetty
    
    • 1

    添加:

    # Xilinx uartlite - port
    ttyPS0
    ttyPS1
    
    • 1
    • 2
    • 3

    然后重新上电即可登录。

    2.2 网络超时异常

    就是启动网络服务后,若是没有插网线将会等很长时间。
    就是在不联网的情况下,每次开机都要等待很久,卡在网络连接上5分钟
    解决办法:
    进入系统后修改文件/etc/systemd/system/network-online.target.wants/networking.service
    输入命令:

    sudo vim /lib/systemd/system/networking.service
    
    • 1

    将里面的TimeoutStartSec=5min 修改为:

    TimeoutStartSec=10sec
    
    • 1

    重启,即可。
    然后重新上电即可登录。

    2.3 网络 DHCP 配置

    我们默认没有配置 DHCP,因为 ubuntu 启动以后不能直接联网,需要手动启动网卡并设置IP地址。这里我们配置一下网络 DHCP,这样系统启动以后就会自动设置好网络。在 linux 系统下的网卡名字为 eth0 和 eth1,我们以 eth0 为例,讲解一下如何配置其 DHCP,输入如下命令:

    echo auto eth0 > /etc/network/interfaces.d/eth0
    echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
    /etc/init.d/networking restart
    
    • 1
    • 2
    • 3

    设置好以后重启开发板, eth0 网卡就会默认打开,可以直接上网。 eth1 网卡同理,支持将上述命令中的 eth0 换为 eth1 即可。
    然后重新上电即可登录。

    2.4 开机Failed to insert module ‘autofs4’

    开机启动信息显示 Failed to insert module ‘autofs4’
    把File Systems --> 里的 Kernel automounter version 4 support (also supports v3) 选上

    2.5 开机取消用户名和密码直接登录

    假定目前只有root用户:
    1.修改/etc/passwd 去掉root后面的x
    修改前:

    root:x:0:0:root:/root:/bin/bash
    
    • 1

    修改后:

    root::0:0:root:/root:/bin/bash
    
    • 1

    2.修改/etc/shadow
    修改前:

    root:$6$KSC.MN5x$d9LfhYpxXPAkrbXbv7uP1df/duNTjqkEiy8BHLJxTOuSrBkwCgcVYS8N/Tvn6fEE
    WAqtzKir7uN6a/xozgZQ0C.:17381:0:99999:7:::
    
    • 1
    • 2

    修改后:

    root::17381:0:99999:7:::
    
    • 1

    3.修改/lib/systemd/system/serial-getty@.service

    #ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
    ExecStart=-/sbin/agetty --autologin root 115200,38400,9600 %I $TERM
    
    • 1
    • 2
  • 相关阅读:
    Redis主从配置
    计算机视觉(Computer Vision, CV)是什么?
    各报文段格式集合
    Redis集群配置
    HTML期末作业——基于html实现娱乐音乐资讯发布平台HTML模板(22页面)
    Vue.js 框架源码与进阶 - Vue.js 源码剖析 -虚拟 DOM
    一起学docker系列之二深入理解Docker:基本概念、工作原理与架构
    mkv视频格式转换mp4格式
    利用Hugging Face中的模型进行句子相似性实践
    GMOS6803为7频段高精度RTK系统应用桥梁监测
  • 原文地址:https://blog.csdn.net/weixin_46089486/article/details/125516817