创建的根文件系统,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(本地目录)