嵌入式linux系统移植-根文件系统

创建的根文件系统,linux内核有两种挂载方式:

  • 网络挂载:内核挂载在服务器的nfs目录下—调试阶段
  • mfgtool烧写:直接打包.tar.bz2使用mfgtool烧写到板子emmc的第2分区,内核挂载到自己的emmc的根文件系统—成品阶段

有这样一个概念关系,以DDR为核心领导的这个结构:
EMMC<一一一>DDR<一一一>网络传输

nfs服务器搭建

网络文件系统,英文 Network File System(NFS),是由 SUN 公司研制的 UNIX 表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

  • 安装 NFS 服务
sudo apt-get install nfs-kernel-server

服务器部分

  • NFS 共享目录
sudo mkdir /home/zxy/linux/nfs
sudo chmod 777 /home/zxy/linux/nfs/
  • 配置 NFS 服务
    打开/etc/exports文件
    在结尾添加 NFS 共享的目录
添加内容
/home/zxy/linux/nfs *(rw,sync,no_root_squash)

*表示允许所有的网络段访问
rw 表示访问者具有可读写权限
sync 表示将缓存写入设备中,可以说是同步缓存的意思
no_root_squash 表示访问者具有 root 权限。

为防止网络传输过程中出现末尾卡顿现象
在主机/etc/hosts文件加入

192.168.1.24(板子ip) /home/zxy/linux/nfs(主机nfs挂载目录)
  • 重启 NFS 服务器
sudo /etc/init.d/nfs-kernel-server restart	//重启
showmount -e	//查看NFS共享目录
  • 报错:Loading: *** ERROR: File lookup fail
    可能使版本不兼容,修改如下:让buntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。
    在这里插入图片描述
    重启:sudo service nfs-kernel-server restart

客户端部分

  • uboot网络环境
    以下环境变量可以在uboot源码中提前写好。
setenv ipaddr 192.168.1.24
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250
saveenv
  • NFS 测试
    将服务器(192.168.1.23) NFS 共享目录挂载到到开发板(192.168.1.24)的 get 目录中。
//下载文件
nfs 80800000 ${serverip}:/home/zxy/linux/nfs/zImage
//挂载
mount -t nfs -o nolock,nfsvers=3 192.168.1.23:/home/zxy/linux/nfs get/
//卸载
umount get

自己添加了网络启动内核、设备树、文件系统的环境变量:

//基本格式:"		" \
//每个变量格式:"	\0" \
//每个命令格式:"	;" \
	"ipaddr=192.168.18.34\0" \
	"ethaddr=00:04:9f:04:d2:35\0" \
	"gatewayip=192.168.18.1\0" \
	"netmask=255.255.255.0\0" \
	"serverip=192.168.18.33\0" \
	"debugargs=setenv bootargs console=ttymxc0,115200 root=/dev/nfs " \
		"nfsroot=${serverip}:/home/zxy/linux/nfs/rootfs rw " \
		"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}::eth0:off\0" \
	"debugboot=echo Booting from zxy_and_pingping server ...; " \
		"run debugargs; " \
		"nfs 80800000 ${serverip}:/home/zxy/linux/nfs/zImage;" \
		"nfs 83000000 ${serverip}:/home/zxy/linux/nfs/imx6ull-alientek-emmc.dtb;" \
		"bootz 0x80800000 - 0x83000000;\0" \

根文件系统构建

学习了根文件系统才恍然大悟,之前说过的像Ubuntu、CentOS之类的基于linux内核,他们的不同之处就在于根文件系统五花八门。

那些linux常用的 ls、 mv、 ifconfig 等命令都定义在根文件系统中,所以说这个根文件系统是很重要的。

通过实践我发现,越是往上层做,兼容性越高,通用性越强。

在这里插入图片描述

基本文件

  • /bin:可执行文件,一般都是一些命令, ls、 mv 等。
  • /dev:设备文件,硬件设备,也是以文件的形式存在的
  • /etc :各种配置文件。
  • /lib:库文件,命令和用户编写的应用程序要使用这些库文件。
  • /mnt :临时挂载目录,一般是空目录,可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。
  • /proc:一般是空目录,用来存储系统运行信息文件。
  • /usr:(Unix Software Resource )软件资源目录
  • /var:存放一些可以改变的数据。
  • /sbin:存放一些可执行文件,此目录下的文件或者说命令只有管理员才能使用
  • /sys :类似于 proc 文件系统的特殊文件系统。
  • /opt:可选的文件、软件存放区。

静态库和动态库
Linux 中的应用程序一般都是需要库,静态库动态库

  • 静态库:每个应用程序中都有属于自己的库,可执行文件会很大。
  • 动态库:所有应用程序共用同一个库,(常用)。

库文件
/lib、usr/lib目录下的 * so * 、*.a文件。

/etc/init.d/rcS 文件
Linux 内核启动以后需要启动一些服务,就是shell文件,可将自启动命令放在这里

一定要给其可执行权限!

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

/etc/fstab 文件
Linux 开机以后自动配置哪些需要自动挂载的分区。
< file system>:要挂载的特殊的设备。
< mount point>:挂载点。
< type>:文件系统类型。
< options>:挂载选项。
< dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份。
< pass>:磁盘检查设置,为 0 表示不检查。
在这里插入图片描述

/etc/inittab 文件
init 程序会读取/etc/inittab这个文件。

<id>:<runlevels>:<action>:<process>

<id>:每个指令的标识符,不能重复。一般我们将串口或者 LCD 屏幕设置为控制 tty。
<runlevels>: 对 busybox 来说此项完全没用,所以空着。
<action>:动作,用于指定<process>可能用到的动作。

在这里插入图片描述
这个格式不管有没有空没空着,都得有3个“:”

#etc/inittab
::sysinit:/etc/init.d/rcS//系统启动以后运行/etc/init.d/rcS 这个脚本文件。
console::askfirst:-/bin/sh//将 console 作为控制台终端,也就是 ttymxc0。
# tty1::askfirst:-/bin/sh//将 tty1屏幕 作为控制台终端。
::restart:/sbin/init//重启的话运行/sbin/init。
::ctrlaltdel:/sbin/reboot//按下 ctrl+alt+del 组合键的话就运行/sbin/reboot
::shutdown:/bin/umount -a -r//关机的时候执行/bin/umount,也就是卸载各个文件系统。
::shutdown:/sbin/swapoff -a//关机的时候执行/sbin/swapoff,也就是关闭交换分区。

/etc/resolv.conf文件

配置域名解析服务器的 IP 地址,一般就是网关。

nameserver 114.114.114.114
nameserver 192.168.1.1

构建工具

常用方法:Busybox、Buildroot、Yocto,这些都各有利弊。和uboot、linux内核一样,可以修改配置文件,使用图形界面,最终编译生成根文件系统。

更简单的:Ubuntu-base 根文件系统,官方都搞好了,直接解压就行了,只需要简单操作几步。

  • 解压ubuntu base 根文件系统
    注意 -vzxf 顺序,因为根文件系统好多都上锁了。
sudo tar -vzxf ubuntu-base-16.04.5-base-armhf.tar.gz
  • 安装 qemu
    跨平台虚拟化的虚拟机,用于在主机上挂载生成的根文件系统,安装各种软件。
sudo apt-get install qemu-user-static
sudo cp /usr/bin/qemu-arm-static ./usr/bin/ //拷贝 qemu-arm-static
  • 设置软件源

/etc/resolv.conf文件

sudo cp /etc/resolv.conf ./etc/resolv.conf //拷贝 resolv.conf,添加网关

/etc/apt/sources.list 文件

添加软件源,清华源、中科大源等。这里添加中科大源,把墙外的源注释掉就行。

#中科大源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe

#阿里云 (可能更全)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
  • 在主机挂载并配置根文件系统

mount.sh挂载脚本

#!/bin/bash
echo "MOUNTING"
sudo mount -t proc /proc /home/zxy/linux/nfs/rootfs/proc
sudo mount -t sysfs /sys /home/zxy/linux/nfs/rootfs/sys
sudo mount -o bind /dev /home/zxy/linux/nfs/rootfs/dev
sudo mount -o bind /dev/pts /home/zxy/linux/nfs/rootfs/dev/pts
sudo chroot /home/zxy/linux/nfs/rootfs

unmount.sh卸载脚本

#!/bin/bash
echo "UNMOUNTING"
sudo umount /home/zxy/linux/nfs/rootfs/proc
sudo umount /home/zxy/linux/nfs/rootfs/sys
sudo umount /home/zxy/linux/nfs/rootfs/dev
sudo umount /home/zxy/linux/nfs/rootfs/dev/pts

开始优化根文件系统

sudo chmod 777 mount.sh unmount.sh

./mount.sh

//安装软件
apt update
apt install sudo
apt install vim
apt install kmod
apt install net-tools
apt install ethtool
apt install ifupdown
apt install language-pack-en-base
apt install rsyslog
apt install htop
apt install iputils-ping

passwd root //设置 root 用户密码

//配置板子环回ip
echo "alientek_imx6ul" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 alientek_imx6ul" >> /etc/hosts

///设置串口终端
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttymxc0.service

exit	//退出根文件系统

./unmount.sh

启动方式

  • nfs挂载启动
    注意!板子ip和服务器ip位于同一网络地址。
setenv bootargs ‘console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.253:/
home/zuozhongkai/linux/nfs/ubuntu_rootfs rw ip=192.168.1.251:192.168.1.253:192.168.1.1:255.255.
255.0::eth0:off’
saveenv //保存环境变量
  • mfgtool烧写
tar -vcjf ubuntu_rootfs.tar.bz2 * //进入根目录,打包根文件系统

板子配置

uboot的ip地址、掩码、网关等,在内核启动后都会通过bootargs环境变量传过去。

成功进入根文件系统后。

  • 添加新用户
adduser zxy_board //添加普通用户

su //切换回 root 用户
chmod u+w /etc/sudoers
sudo vi /etc/sudoers
	添加zxyboard ALL=(ALL:ALL) ALL获取sudo权限
chmod u-w /etc/sudoers
  • 网络 DHCP 配置
    这个比较重要,需要把板子的eth0网卡打开。
su //切换到 root 用户
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
/etc/init.d/networking restart
  • 域名解析服务
    位于/etc/resolv.conf
    配置域名解析服务器的 IP 地址,一般就是www.baidu.com解析成ip地址。
nameserver 192.168.18.1	//本地网关
nameserver 114.114.114.114//DNS公用域名,或8.8.8.8
nameserver 127.0.0.1//本机地址,环回

//如果还没解析成功 添加网关
//route add default gw 192.168.31.1

ssh服务器搭建

搞好了之后,就可以直接使用ssh访问板子了,不用依赖于串口了。

安装&配置

  • 查看SSH Server是否安装。
dpkg -l|grep ssh
  • 安装 SSH Server
    安装完之后,再次查看ssh是否安装。
sudo apt-get install openssh-server
  • 查看是否启动成功
ps -e | grep ssh

若未启动

sudo /etc/init.d/ssh start
或
sudo service ssh start
  • SSH Server配置文件
    /etc/ssh/sshd_config
    SSH Server 端口,默认是22
    允许root用户以任何认证方式登录
    在这里插入图片描述
  • 重启SSH Server
sudo /etc/init.d/ssh stop
sudo /etc/init.d/ssh start

运行测试

  • client登录server
ssh servername@serverip	//登录
exit		//退出
  • 下载文件
scp servername@serverip:/path/file /local_dir(本地目录)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值