ubuntu根文件系统移植
现在有更好的教程了。还是两个结合的看把。
移植前的准备
在移植之前,我们首先要在电脑上安装Ubuntu。在ubuntu中的终端操作下面步骤。
在移植之前我们需要一个辅助工具,用来对根文件系统进行一个基本的搭建,就能模拟出根文件系统运行的状态。
1 | sudo apt-get install qemu-user-static |
其中qemu-user-static安装包的作用时一个QEMU的一个子模块。QEMU是一个开源的虚拟化和模拟器的工具。而子模块专注于用户模式模拟,允许你在当前主机架构上运行另一个架构的二进制文件,而无需启动完整的虚拟机。
下载根文件系统
ubuntu以提供了基本的可移植到嵌入式的根文件系统,因此我们去官网下载即可。
点击网址后进入网站,点击红色标注的选项。
S
点击后,进入下面界面,继续点击。
然后选择其中一个版本,点击下载。
下载好安装包,等会要用。
开始移植
1、在根目录中创建一个文件。
1 | mkdir rootfs |
2、解压刚才下载的安装包,到rootfs文件中。
1 | sudo tar -vzxf ubuntu-base-16.04.6-base-armhf.tar.gz |
3、复制之前下载的qemu-user-static其中某些文件到刚刚解压的根文件系统中。
1 |
|
复制完毕后,进入到resolv.conf文件中,修改其中的内容。保存退出。
1 | h@h-virtual-machine:~/h/rootfs$ sudo vim /etc/resolv.conf |
修改后的resolv.conf文件中界面如下:
nameserver 202.96.128.86。
202.96.128.86是电脑网络的DNS服务器端口。配置成功后可以通过下面测试网络
1 | ping www.baidu.com |
- 如果能解析并ping,说明DNS配置成功。
4、挂载VFS
- VFS是虚拟的文件系统,用于统一管理各种文件系统。
- 挂载VFS是为了根文件系统太难记必要的虚拟文件系统支持。
1、创建一个mk.sh的脚本。
在rootfs的父目录中创建一个名字为mk.sh的脚本文件,并修改其的权限。在文件中添加下面代码。
1 | h@h-virtual-machine:~/h$ touch mk.sh |
1 | #!/bin/bash |
保存退出后,执行下面代码,就可以进入到我们制作的rootfs根文件系统中。
1 | h@h-virtual-machine:~/h$ ./mk.sh -m ./rootfs/ |
如果成功挂载,会出现下面这样的:
1 | MOUNTING |
如果想退出,可以输入exit,在退出后,接着输入**./mk.sh -u ./rootfs/** 。退出 chroot 后,挂载的VFS(proc、sysfs、dev 等)仍然存在,需要清理以避免影响下次操作。
5、安装常用的命令和软件
在根文件挂载的界面操作下,执行下面命令。
1 | apt update |
6、设置root用户密码
设置一下 root 用户的密码,命令如下:
1 | passwd root |
输入“passwd root”以后会让你输入 root 用户密码,输入两次
7、创建用户
添加一个用户sdr:
1 | useradd -s '/bin/bash' -m -G adm,sudo sdr |
给用户设置密码:
1 | passwd sdr |
8、设置主机名和IP
输入如下命令设置本机名称和IP地址
1 | echo "sdr" > /etc/hostname |
127.0.0.1代表的本机的意思,不用改。
9、终端设置
因为我们的开发板是使用串口作为终端的,所以需要设置一下,比如我们开发板使用的UART1对应的串口设备文件为ttySTM0、我们输入如下命令:
1 | ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttySTM0.service |
10、退出配置
这样基本配置我们就设置好了,我们退出这个根文件系统,然后取消挂载。设置好以后就可以退出根文件系统了,输入如下命令退出:
1 | exit |
11、将根文件系统下载进开发板中
之前我们在开发板上运行linux,使用的是老师给的。现在我们只改变了根文件系统,uboot和linux内核不变,所以我们修改原来的rootfs。为了做区别,我使用newrootfs为新的根文件系统的名称。
1、我们要把newrootfs转移到opt目录下。
1
mv newrootfs /opt/
2、修改/etc/exports
1
2# 在主机终端执行
sudo vi /etc/exports在文件中,加入下面这段话。
1
/opt/newrootfs *(rw,sync,no_root_squash,no_subtree_check)
3、重新运行一下。
1
sudo exportfs -ra
4、重新启动开发板,在开始输出东西时,一直按下enter键。直到到进入U-boot模式。
第一个红框时U-boot的版本信息。
第二个是进入U-boot的结果。
5、输入下面命令,可以产看参数。
1
2# 在U-Boot控制台执行
printenv bootargs输出如下:
6、执行
setenv
命令修改bootargs
环境变量:1
setenv bootargs 'root=/dev/nfs nfsroot=192.168.60.30:/opt/newrootfs intr rsize=1024 wsize=1024 rootwait rw earlyprintk ip=192.168.60.90 console=ttySTM0,115200'
上面的截图是我修改过后的,原先是下面这样
1
bootargs=root=/dev/nfs nfsroot=192.168.60.30:/opt/rootfs intr rsize=1024 wsize=1024 rootwait rw earlyprintk ip=192.168.60.90 console=ttySTM0,115200
7、执行
saveenv
命令保存环境变量1
saveenv
8、重启开发板,最后会看到下图:
到此在stm32mp157的开发板上就跑起来了linux。