IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 嵌入式Ubuntu根文件系统移植带桌面 -> 正文阅读

[系统运维]嵌入式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.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/*

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.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.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
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:22:23  更:2022-07-04 23:24:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:05:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码