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.3 开始移植
解压Ubuntu系统 mkdir rootfs
sudo tar -vzxf ubuntu-base-16.04.6-base-armhf.tar.gz -C rootfs/
32位arm:
sudo cp /usr/bin/qemu-arm-static ./rootfs/usr/bin/
64位arm64:
sudo cp /usr/bin/qemu-aarch64-static ./rootfs/usr/bin/
sudo cp /etc/resolv.conf ./rootfs/etc/resolv.conf
1.1.4 增加DNS服务
sudo vim ./rootfs/etc/resolv.conf
加入以下内容:
nameserver 8.8.8.8
退出保存
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
可以创建一个mk.sh脚本,将内容拷贝进去。 增加可执行权限:
chmod 777 mk.sh
执行命令:
./mk.sh -m ./rootfs/
挂载成功后,当前终端已经将根文件系统切换到了我们上面制作的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
我们就先安装这些命令和软件,保证 ubuntu base 根文件系统能够在开发板上正常启动即 可,等启动以后再根据实际情况继续安装其他的命令和软件。
1.1.7设置 root 用户密码
设置一下 root 用户的密码,这里我设置简单一点, root 用户密码也设置为“root”,相当于用户名和密码一样,命令如下:
passwd root
输入“passwd root”以后会让你输入 root 用户密码,输入两次。
1.1.8 创建用户
添加一个用户 sdr
useradd -s '/bin/bash' -m -G adm,sudo sdr
给用户 sdr 设置密码
passwd sdr
输入“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.1.10 终端设置
因为我们的开发板是使用串口作为终端的,所以需要设置一下,比如我们开发板使用的UART1对应的串口设备文件为ttyPS0,我们输入如下命令:
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttyPS0.service
1.1.11 退出配置
这样基本配置我们就设置好了,我们退出这个根文件系统,然后取消挂载。 设置好以后就可以退出根文件系统了,输入如下命令退出:
exit
退出以后再执行一下脚本取消挂载,命令如下:
../mk.sh -u ./rootfs/
至此, 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
然后弹出卡。
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:
* Management: https:
* Support: https:
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
1.3 安装图形界面
1.3.1 图形界面各个模块说明
图形程序安装,我安装的桌面是xubuntu-desktop,只需要下面一条指令即可:
apt install xubuntu-desktop
我这个安装是在嵌入式设备上安装的。但是在linux系统中安装也是一样的。
1.3.2 安装桌面提示重复登录,且密码不正确
图形程序安装,安装完成后,串口居然登录不上了,说实话啊,心里瞬间不信邪啊,重新安装了一次,结果还是不行啊,废了。 先说一下现象是什么?就是反复输入用户名和密码,结果提示无效的,提示重新输入,有时候还会出现接连出现两次登录提示,而且等一会之后,突然可以登录上了,也就是说shell终端已经登录上了。但是啊,还提示登录,我就郁闷了,咋回事。
又测试了几次,根据日志的信息,怀疑是不是有两个终端登录选项,是不是同时需要登录,结果导致数据串味了。交叉了,然后就查看了启动信息确实有两个。然后就更改根文件系统的配置信息去掉了一个。
我删除的:
/lib/systemd/system/getty-static.service
/lib/systemd/system/getty@.service
我使用的是这个:
/lib/systemd/system/serial-getty@.service
然后串口可以正常登录了。
1.3.3 Ubuntu关闭软件更新器开机提醒弹窗
删除更新通知程序
sudo apt-get remove update-notifier
然后登录桌面就没有提示了。
2、常见配置
2.1 无法登录
不论输入什么样的用户名密码,即使完全正确,都会提示: 验证错误 是因为这个串口就不支持用户登录,需要添加终端支持: 打开文件:
sudo vim /etc/securetty
添加:
# Xilinx uartlite - port
ttyPS0
ttyPS1
然后重新上电即可登录。
2.2 网络超时异常
就是启动网络服务后,若是没有插网线将会等很长时间。 就是在不联网的情况下,每次开机都要等待很久,卡在网络连接上5分钟 解决办法: 进入系统后修改文件/etc/systemd/system/network-online.target.wants/networking.service 输入命令:
sudo vim /lib/systemd/system/networking.service
将里面的TimeoutStartSec=5min 修改为:
TimeoutStartSec=10sec
重启,即可。 然后重新上电即可登录。
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
设置好以后重启开发板, 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
修改后:
root::0:0:root:/root:/bin/bash
2.修改/etc/shadow 修改前:
root:$6$KSC.MN5x$d9LfhYpxXPAkrbXbv7uP1df/duNTjqkEiy8BHLJxTOuSrBkwCgcVYS8N/Tvn6fEE
WAqtzKir7uN6a/xozgZQ0C.:17381:0:99999:7:::
修改后:
root::17381:0:99999:7:::
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
|