构建嵌入式环境

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

posted on 2021-12-15 17:09  开心种树  阅读(99)  评论(0编辑  收藏  举报