构建嵌入式环境
1. 制作文件系统并挂载
目标:制作文件系统
# 分配固定空间大小的sd卡
dd if=/dev/zero of=sd bs=1M count=32
# 将sd文件虚拟化为磁盘设备,如此才能进行格式化
losetup /dev/loop1 sd
# 对磁盘设备进行格式化,使用 ext2格式,块数量为100
mke2fs -m 0 /dev/loop1 100
# 将磁盘设备挂载到文件系统,如此可以通过路径读写磁盘
mount -t ext2 /dev/loop1 ./sd_mnt
# 取消磁盘挂载
umount /dev/loop1
losetup -d /dev/loop1
更简单方法
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mount -t ext3 rootfs.ext3 /mnt -o loop
# 取消磁盘挂载
umount /dev/loop1
2. centos6 配置nfs
2.1 服务端
安装
yum install nfs-utils rpcbind
apt install nfs-kernel-server
配置
主要配置文件:/etc/exports
/home/rootfs *(rw,sync,no_root_squash,no_subtree_check)
no_subtree_check : 不检查父目录权限
no_root_squash : 不进行root权限压缩(root_squash(root权限压缩)若登录root用户登录,则将其压缩为nobody登录)
启动
service rpcbind start
service nfs start
测试
# 更新配置
exportfs -r
# 查看导出目录
showmount -e
# 本地挂载
mount -t nfs -o nolock localhost:/root/rootfs /mnt
2.2 客户端
安装并启动
yum install rpcbind
service rpcbind start
查看共享目录
showmount -e 192.168.1.102 # 显示nfs server 192.168.1.102的共享目录
创建挂载点并挂载共享目录
把nfs server的共享目录/media挂到本地的/media,挂载选项设为读写,在后台进行挂载,失败时1分钟超时
mount -t nfs -o rw,bg,retry=1 192.168.1.102:/media /media
卸载
umount /media
2.3
#nfs挂在根文件系统的配置 /etc/exports
/root/rootfs *(rw,sync,no_root_squash,no_subtree_check)
chmod -R 0777 /root/rootfs
exportfs -r
showmount localhost -e
3. 内核配置nfs
4. bootargs
setenv bootargs root=/dev/nfs nfsroot=192.168.1.9:/root/rootfs ip=192.168.1.9:192.168.1.12:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200
nfsroot=主机ip:目录
ip=开发板ip:主机ip:网关:掩码::接口:是否开启dhcp
console=串口0,波特率
uboot
1. 构建uboot
下载uboot
修改 ARCH=arm , CROSS_COMPILE=arm-linux-gnueabi-
uboot的defconfig在 根目录 configs/下找
make vexpress_ca9x4_defconfig
make -j4
运行
qemu-system-arm -M vexpress-a9
-kernel u-boot
-nographic
-m 512M
2. 保证uboot和主机联网
qemu网络设置
3. uImage
进入kernel目录
确保有 mkimage 工具
make LOADADDR=0x60003000 uImage
将 uImage 和 dtb文件拷贝到tftp目录
在uboot编码启动参数和ip
vi include/configs/vexpress_common.h
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage; tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0'; \
bootm 0x60003000 - 0x60500000;"
#define CONFIG_IPADDR 192.168.1.11
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.1.12
0. 准备工作
0.1 添加用户并授权
groupadd test
useradd -m -s /bin/bash -g test test
vi /etc/sudoers.c/test
test ALL=(ALL) NOPASSWD: ALL
0.2 工作目录
cd /home/test
mkdir source build rootfs image
0.3 设置环境变量
vi /home/test/.bashrc
export CROSS_COMPILE=
export TARGET=arm
0. 安装交叉编译工具链
apt install gcc-arm-linux-gnueabi -y
1. 编译uboot
1.1 修改默认启动命令
vi include/configs/vexpress_common.h
// sd卡
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage; tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0,115200'; \
bootm 0x60003000 - 0x60500000;"
// nfs
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage; tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/nfs nfsroot=192.168.1.1.12:/home/test/rootfs ip=192.168.1.11 console=ttyAMA0,115200'; \
bootm 0x60003000 - 0x60500000;"
#define CONFIG_IPADDR 192.168.1.11
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.1.12
xxx_defconfig在 根目录的 configs下找
make xxx_defconfig
make ARCH=$TARGET CROSS_COMPILE=$CROSS_COMPILE
cp u-boot ../../image/
2. 编译kernel
make ARCH=$TARGET vexpress_defconfig
make menuconfig
make ARCH=$TARGET CROSS_COMPILE=$CROSS_COMPILE zImage
make ARCH=$TARGET CROSS_COMPILE=$CROSS_COMPILE LOADADDR=0x60003000 uImage
make ARCH=$TARGET CROSS_COMPILE=$CROSS_COMPILE dtbs
2.1 内核支持nfs
配置支持nfs client
2.2 宿主机安装配置nfs server
安装
yum install nfs-utils rpcbind
apt install nfs-kernel-server
配置
vi /etc/exports
/home/rootfs *(rw,sync,no_root_squash,no_subtree_check)
no_subtree_check : 不检查父目录权限
no_root_squash : 不进行root权限压缩(root_squash(root权限压缩)若登录root用户登录,则将其压缩为nobody登录)
启动
service rpcbind start
service nfs start
测试
# 更新配置
exportfs -r
# 查看导出目录
showmount -e
# 本地挂载
mount -t nfs -o nolock localhost:/root/rootfs /mnt
3. 构建rootfs
3.1 编译busybox
make menuconfig
make ARCH=$TARGET CROSS_COMPILE=$CROSS_COMPILE
make install
cp _install/* /home/test/rootfs -rf
3.2 添加设备节点
cd rootfs
mkdir dev
cd dev
mknod tty0 c 4 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4
mknod null c 1 3
mknod console c 5 1
3.3 完善系统
mkdir proc sys tmp var etc lib
mkdir etc/init.d
1. 系统根据 /etc/inittab初始化
vi etc/inittab
::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
#tty2::askfirst:-/bin/sh
#::ctrlaltdel:/bin/umount -a -r
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
1.1 初始化时执行
vi etc/init.d/rcS
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin/usr/bin
LD_LIBRARY_PATH=/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
mkdir -p /var/lock
echo "------------------"
echo " hello"
echo "------------------"
1.1.1 mount -a ,根据 etc/fstab 挂载
vi etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev tmpfs defaults 0 0
2. askfirst执行 profile
PS1='yangxr@vexpress:\w #'
export PS1