0%

ubuntu根文件系统移植

ubuntu根文件系统移植

现在有更好的教程了。还是两个结合的看把。

https://blog.csdn.net/weixin_51963312/article/details/142416613?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B0%86ubuntu%E7%A7%BB%E6%A4%8D%E5%88%B0stm32mp157%E5%BC%80%E5%8F%91%E6%9D%BF%E4%B8%8A%E3%80%82&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-142416613.142^v101^pc_search_result_base8&spm=1018.2226.3001.4187

移植前的准备

在移植之前,我们首先要在电脑上安装Ubuntu。在ubuntu中的终端操作下面步骤。

在移植之前我们需要一个辅助工具,用来对根文件系统进行一个基本的搭建,就能模拟出根文件系统运行的状态。

1
sudo apt-get install qemu-user-static

其中qemu-user-static安装包的作用时一个QEMU的一个子模块。QEMU是一个开源的虚拟化和模拟器的工具。而子模块专注于用户模式模拟,允许你在当前主机架构上运行另一个架构的二进制文件,而无需启动完整的虚拟机。

下载根文件系统

ubuntu以提供了基本的可移植到嵌入式的根文件系统,因此我们去官网下载即可。

http://cdimage.ubuntu.com/

点击网址后进入网站,点击红色标注的选项。

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
2
3
4
5

h@h-virtual-machine:~/h/rootfs$ sudo cp /usr/bin/qemu-arm-static ./usr/bin/
h@h-virtual-machine:~/h/rootfs$ sudo cp /etc/resolv.conf ./etc/resolv.conf
将主机的DNS配置文件(/etc/resolv.conf)复制到根文件系统的/etc/resolv.conf。
根文件系统可以解析域名(例如访问apt源),从而正常联网。

复制完毕后,进入到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
2
h@h-virtual-machine:~/h$ touch mk.sh
h@h-virtual-machine:~/h$ chomd 777 mk.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/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

保存退出后,执行下面代码,就可以进入到我们制作的rootfs根文件系统中。

1
h@h-virtual-machine:~/h$ ./mk.sh -m ./rootfs/

如果成功挂载,会出现下面这样的:

1
2
3
4
5
6
7
8
MOUNTING
[sudo] h 的密码:
root@h-virtual-machine:/#
root@h-virtual-machine:/#
root@h-virtual-machine:/# ls
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var

如果想退出,可以输入exit,在退出后,接着输入**./mk.sh -u ./rootfs/** 。退出 chroot 后,挂载的VFS(proc、sysfs、dev 等)仍然存在,需要清理以避免影响下次操作。

5、安装常用的命令和软件

在根文件挂载的界面操作下,执行下面命令。

1
2
3
4
apt update
apt install sudo
apt install vim
apt install kmod net-tools ethtool ifupdown language-pack-en-base rsyslog htop iputils-ping

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
2
3
echo "sdr" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 sdr" >> /etc/hosts

127.0.0.1代表的本机的意思,不用改。

9、终端设置

因为我们的开发板是使用串口作为终端的,所以需要设置一下,比如我们开发板使用的UART1对应的串口设备文件为ttySTM0、我们输入如下命令:

1
2
3
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttySTM0.service

注意:ttySAC2为串口节点,具体根据自己的板子设置

10、退出配置

这样基本配置我们就设置好了,我们退出这个根文件系统,然后取消挂载。设置好以后就可以退出根文件系统了,输入如下命令退出:

1
2
exit
./mk.sh -u ./rootfs/

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。