为了规避一些不必要的错误,建议制作的目标系统和主机系统采用同一个ubuntu版本。这里两个系统都选用的是ubuntu20.04.
$ sudo apt-get install qemu-user-static
$ mkdir rootfs
$ dd if=/dev/zero of=ubuntu20.04.img bs=1M count=4096
$ mkfs.ext4 -L ubuntu20.04 ubuntu20.04.img
$ sudo mount ubuntu20.04.img rootfs/
利用上面的命令创建一个4G大小的镜像文件,然后将镜像挂载到rootfs下,但是这个的注意镜像的大小尽量大一点,要不然后期安装的时候可能因空间不足导致安装软件包失败。这里也可以直接在roofs目下进行操作,最后在将ubuntu20.04.img挂载到其它地方,将rootfs创建的文件系统复制到挂载的镜像中。
http://cdimage.ubuntu.com/ubuntu-base/releases/
将下载的tarball解压到rootfs中。
$ tar -xzvf ubuntu-base-20.04.2-base-arm64.tar.gz -C rootfs
利用chroot命令切换根文件系统,如果切换失败尝试“cp
/usr/bin/qemu-arm-static rootfs/usr/bin/ ”。
$ sudo chroot rootfs/ #完事后可以用exit退出
推荐使用下面方法切换文件系统,这个会将主机下的/dev /sys /proc挂载到新的文件系统中,在执行一些命令是就不会出现错误。
vim ch-mount.sh
#!/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 mount -o bind /dev/pts ${2}dev/pts
echo "CHROOT..."
sudo chroot ${2}
echo "Success!"
}
function 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
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
$ chmod +x ch-mount.sh
$ ./ch-mount.sh -m rootfs #进入文件系统,
#exit退出后需要执行下面命令
$ ./ch-mount.sh -u rootfs
https://zhuanlan.zhihu.com/p/575679886
$ apt-get update
$ apt-get install sudo
$ apt-get install vim
$ apt-get install udev #安装后会从串口输出debug信息。
$ apt-get install net-tools
$ apt-get install ethtool
$ apt-get install udhcpc
$ apt-get install netplan.io #20.04代替ifupdown,推荐安装这个放弃apt-get install ifupdown
$ apt-get install language-pack-en-base
$ apt-get install language-pack-zh-han*
$ apt-get install iputils-ping
$ apt-get install openssh-sftp-server
$ apt-get install ntp
$ apt-get install usbutils
$ apt-get install alsa-utils
$ apt-get install libmtp9 #和adbd相关
到这里一个不含有桌面的文件系统已经算是完成。网络采用netplan管理,netplan配置详见netplan章节。
ubuntu20的桌面环境比较多,因为在嵌入式平台上用所以需要选一个轻量级的桌面环境,这里选用的lubuntu-desktop。
$ apt-get install lubuntu-desktop
利用上面命令安装lubuntu-desktop时大概需要占用3G多的空间,因为这个命令会将一些可选的依赖包一并安装,但对于嵌入式系统来说有些包根本就用不上,占用系统空间不说还可能会导致系统变慢,所以采用“–no-install-recommends”选项取消可选依赖的安装,如果后期需要了在单独安装即可。命令如下,可以节省1G多空间。
$ apt-get install --no-install-recommends lubuntu-desktop
gdm3图形管理器
上面方式安装后默认用到的图形管理器是sddm。这里可以切换成gdm3或者lightdm。个人感觉gdm3比较好看,所以这里就选择了gdm3作为图形管理器,安装命令:
$ apt-get install --no-install-recommends gdm3 #这里同样取消了可选包
#想用lightdm时安装下面命令,如果加--no-install-recommends参数,lightdm无法正常工作
$ apt-get install lightdm
安装过程中会让选择图形管理器,过去安装后无法正常显示登录界面可以利用下面命令重新配置。
$ dpkg-reconfigure gdm3
gdm3设置开机自动登录
$ vim /etc/gdm3/custom.conf
# GDM configuration storage
#
# See /usr/share/gdm/gdm.schemas for a list of available options.
[daemon]
# Uncomment the line below to force the login screen to use Xorg
#WaylandEnable=false
# Enabling automatic login
AutomaticLoginEnable = true #取消之前的注释
AutomaticLogin = username #取消之前的注释,修改成要登录的用户名字
gdm3设置允许root用户登录桌面
$ vim /etc/gdm3/custom.conf
# Enabling timed login
# TimedLoginEnable = true
# TimedLogin = user1
# TimedLoginDelay = 10
AllowRoot=true #添加的内容
$ vim /etc/pam.d/gdm-password
#%PAM-1.0
auth requisite pam_nologin.so
#auth required pam_succeed_if.so user != root quiet_success #注释掉这一行
@include common-auth
auth optional pam_gnome_keyring.so
@include common-account
# SELinux needs to be the first session rule. This ensures that any
# lingering context has been cleared. Without this it is possible
lightdm设置开机自动登录
$ cat /etc/lightdm/lightdm.conf.d/20-autologin.conf
[Seat:*]
user-session=Lubuntu
autologin-user=username #修改成自动登录的用户名
greeter-show-manual-login=true
Ubuntu 18.04/20.04使用netplan设置网络。Netplan是Canonical(Ubuntu)开发的实用程序,能在Linux系统上轻松配置网络。它基于基于YAML的配置,从而大大简化了网络配置过程。要配置网络接口,只需创建所需网络接口的YAML描述,然后Netplan将为所选的渲染器工具生成所有必需的配置。可以在/etc/netplan目录下创建相应的“*.yaml”文件来配置网络。
$ sudo vim /etc/01-network-manager-all.yaml
#修改时注意yaml文件的格式要求。
network:
ethernets:
eth0:
dhcp4: no #指定是否需要进行DHCP,4指的是ipv4
addresses: [192.168.3.105/24] #IP地址
optional: true
gateway4: 192.168.3.1 #默认网关,如果不需要网关地址,这一行可以不要
nameservers:
addresses: [114.114.114.114, 8.8.8.8] #dns配置
version: 2
renderer: NetworkManager #对于无NetworkManager可选择networkd
因为yaml需要严格的遵循缩进规则,为了避免配置的错误,可以利用下面两条命令来测试配置和让配置生效
sudo netplan try
sudo netplan apply
adduser ubuntu #增加用户
adduser ubuntu sudo #增加管理员权限
安装时添加–no-install-recommends参数已经忽略了好多软件的安装,但是还是有些用不到的软件会被安装,可以利用apt-get remove --purge xxx或者dpkg -r xxx卸载掉不用的软件。
$ apt-get remove --purge lubuntu-update-notifier #lubuntu升级管理软件,没啥用嵌入式中乱升级系统可能导致系统无法正常启动。
$ apt-get remove --purge libreoffice* #系统自带的office,
vim /lib/systemd/system/[email protected]
开机设置选项:ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
文件部分内容展示:
[Service]
# The '-o' option value tells agetty to replace 'login' arguments with an
# option to preserve environment (-p), followed by '--' for safety, and then
# the entered username.
ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
Type=idle
Restart=always
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
KillMode=process
IgnoreSIGPIPE=nostem/[email protected]" 46L, 1468C
SendSIGHUP=yes
注意:这种方式需要安装udev, sudo apt-get install udev
$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target