拿着手里的STM32MP157 Mini,想移植一个Linux发行版,但是手册里只提供了linaro版的debian,于是想移植一个Ubuntu。鉴于网络上较全面的文章比较少,所以记录一下整个过程。
获取ubuntu-base
去linaro官网看了下,最新的ubuntu还停留在15.12版本也就是
vivid
,然而这个版本连国内支持armhf的ubuntu-vivid的源都不好找。因此就想通过ubuntu-base来构建rootfs。先来到ubuntu官网,我这里选择的是ubuntu-base-18.04,是因为我电脑上的虚拟机环境也是ubuntu-18.04。如果使用18.04的虚拟机环境来构建ubuntu-base-20.04并chroot,会出现
qemu: Unsupported syscall: 403
的错误,这是因为在ubuntu-18.04中安装的qemu版本过低,因此要通过源码编译的方式来安装qemu5.2.0,这个过程比较麻烦,所以就选择了ubuntu-base-18.04。下载ubuntu-base-18.04.5-base-armhf.tar.gz完成后,复制到虚拟机中。
这里千万不要在Windows中解压,也不要在WSL环境的Ubuntu中进入到Windows目录中解压,因为有些文件名称相同只是大小写不同,在Windows中会被认为是同一个文件从而覆盖掉,而在Linux中则不会。- 我这里复制到了
~/Desktop/Image/
目录下。新建一个文件夹并将压缩包解压进去。注意解压使用sudo
,之后的操作同样需要。cd ~/Desktop/Image/ mkdir ubuntu-base-18.04 sudo tar zxf ubuntu-base-18.04.5-base-armhf.tar.gz -C ubuntu-base-18.04/ cd ubuntu-base-18.04/
- 我这里复制到了
配置环境
进入解压的目录后,复制
qemu-arm-static
到要制作的根文件系统中,这里确保已经正确安装了qemu-user-static
。sudo apt-get install qemu-user-static sudo cp /usr/bin/qemu-arm-static ./usr/bin
如果遇到了这样的错误
chroot: failed to run command ‘/bin/bash’: No such file or directory
就是没有复制成功或者qemu没有安装好。可以使用下面的命令来强制重新安装*sudo apt-get --reinstall install qemu-user-static
下一步配置DNS以便能够正常联网,可以直接复制虚拟机的配置文件到根文件系统中,也可以编辑根文件系统的配置文件。
sudo cp /etc/resolv.conf ./etc/resolv.conf
修改软件源为中科大arm源
sudo vim ./etc/apt/sources.list
删除原来文件中的所有内容,添加以下内容:
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-proposed main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
挂载根文件系统
接下来可以chroot到根文件系统中了。这里使用的是
arch-chroot
,这是archlinux提供的一个自动化chroot的脚本,可以进行自动挂载虚拟文件系统等操作,不用手动挂载。以下是安装以及执行的命令(确保正处于ubuntu-base-18.04
目录下):sudo apt install arch-install-scripts sudo arch-chroot .
执行完成后会进入base根文件系统
执行以下命令,看到很多教程都安装rsyslog,实测安装完问题不断,因此这里建议先不安装。
apt update apt install -y sudo language-pack-en-base ssh net-tools ethtool ifupdown iputils-ping htop vim bash-completion systemd
其中必须安装的软件包:
systemd
,不安装这个就不能正确配置串口服务,烧录到板子上会出现kernel panic
从而无法启动系统。*另外ethtool、ifupdown
这几个也是需要安装的,否则无法配置网络。设置root密码
passwd root
设置主机名称(STM32MP157)和本机IP
echo "STM32MP157" > /etc/hostname echo "127.0.0.1 localhost" >> /etc/hosts echo "127.0.0.1 STM32MP157" >> /etc/hosts
配置DHCP
echo auto eth0 > /etc/network/interfaces.d/eth0 echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
配置串口自动登录
vim /lib/systemd/system/serial-getty\@.service
修改
BindsTo
:将dev-%i.device
改成dev-%i
;修改
ExecStart
:将-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
改成-/sbin/agetty -a root --keep-baud 115200,38400,9600 %I $TERM
(如果-/sbin/agetty
后面有-o
参数,记得删掉,确保改完之后是一样的)exit
退出根文件系统。
制作ext4文件系统镜像
首先使用
du
命令查看一下根文件系统的大小cd .. sudo du -sh ubuntu-base-18.04
根文件系统大小是400M左右,那就创建一个500M的ext4空文件并格式化。
dd if=/dev/zero of= fsmp1x_rootfs.ext4 bs=500M count=1 sudo mkfs.ext4 fsmp1x_rootfs.ext4
这里如果ext4空文件的大小小于根文件系统的大小,复制的时候就会提示空间不足。这时候更改大小,重新来一遍就可以了*
接下来挂载刚刚创建的ext4空文件,这里我挂载到了
~/Desktop/Image/fsmp1x_rootfs
,然后将ubuntu-base-18.04
文件夹中所有内容复制到刚刚挂载的临时目录去mkdir fsmp1x_rootfs sudo cp ./ubuntu-base-18.04/* ./fsmp1x_rootfs/ -a
卸载之前挂载的ext4文件
sudo umount ./fsmp1x_rootfs
这时候ext4文件系统已经制作好了,可以拷贝到windows中使用STM32CubeProgrammer进行烧录了。
系统烧录及启动
烧录具体过程可参考配套的资料【正点原子】STM32MP157快速体验V1.5.pdf 第二章节的系统烧录,这里简单叙述一下重点。
将开发板的启动拨码开关设置为
000
,连接上USB_OTG
线(建议连接电脑的USB3.0端口)。找到配套资料包中为EMMC烧录准备
flashlayout
文件atk_emmc-stm32mp157d-atk-qt.tsv
,使用记事本编辑最后一行rootfs对应的ext4文件系统名,修改为fsmp1x_rootfs.ext4
(将该文件复制过去)。
#Opt Id Name Type Device Offset Binary
- 0x01 fsbl1-boot Binary none 0x0 tf-a/tf-a-stm32mp157d-atk-serialboot.stm32
- 0x03 ssbl-boot Binary none 0x0 uboot/u-boot.stm32
P 0x04 fsbl1 Binary mmc1 boot1 tf-a/tf-a-stm32mp157d-atk-trusted.stm32
P 0x05 fsbl2 Binary mmc1 boot2 tf-a/tf-a-stm32mp157d-atk-trusted.stm32
PD 0x06 ssbl Binary mmc1 0x00080000 uboot/u-boot.stm32
P 0x21 boot System mmc1 0x00280000 atk-image-bootfs.ext4
P 0x22 rootfs FileSystem mmc1 0x04280000 fsmp1x_rootfs.ext4
打开STM32CubeProgrammer,打开上面修改过的flashlayout文件,选择二进制文件的路径,点击下载,完成后将拨码开关设置为
010
并上电启动。通过串口查看系统启动情况,这里截出三个标志性的地方,分别是内核启动、系统启动、启动成功。
系统配置
1.调整分区大小
使用
df -h
命令查看文件系统磁盘使用情况,发现根文件系统的大小只有477M,已经使用了88%了,这是因为创建的ext4空文件的大小就是500M。使用
fdisk -l
命令列出所有分区信息,在最后可以看到/dev/mmcblk2p3
这个分区总共有7.2G因此要使用
resize2fs
命令来调整/dev/mmcblk2p3
这个分区的大小。调整完再次查看,该分区的空间已经全部利用起来了
2.安装gnome和vncserver
安装gnome以及依赖包,安装过程中会出现选择时区的选项,选择
Asia-Shanghai
即可。apt-get install --no-install-recommends ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal -y
安装vncserver
apt-get install vnc4server -y
不要着急启动vncserver,这时候连接上去只有灰灰的屏幕和’x’形的鼠标指针。先安装xfonts
apt-get install xfonts-100dpi apt-get install xfonts-75dpi
再删除
~/.vnc/xstartup
文件原有内容,修改为以下内容#!/bin/sh # Uncomment the following two lines for normal desktop: export XKL_XMODMAP_DISABLE=1 unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources xsetroot -solid grey vncconfig -iconic & gnome-session & gnome-panel & gnome-settings-daemon & metacity & nautilus & gnome-terminal &
输入
vncserver
来启动,第一次启动会要求输入密码。再使用vnc客户端来连接,注意IP地址后面需要加上:1
。可以使用-geometry
来指定分辨率。vncserver -geometry 1920x1080
3.安装mate桌面
- 上面的gnome桌面过于简陋,使用以下命令安装mate桌面,需要消耗2GB以上的空间,耗时也比较久。
安装完成后重启,再次使用vnc连接,等待十几秒就可以看到mate桌面了。apt-get install ubuntu-mate-core ubuntu-mate-desktop
- 说实话,好看是好看,缺点就是啥都不干的时候,这块板子上800MHz的CPU都能直接拉满。*