Skip to content

定制 Linux 系统

ChangeLog:

  • 20180409 – remount operation、mke2fs、nls package
  • 20180404 – build minimal rootfs with busybox

本文实验环境为 BeagleBone Black

0,编译 U-Boot 与 Linux Kernel

U-Boot:

Kernel:

1,准备一个 SD 卡,大小 1 G 左右即可;

删除分区:

$ sudo dd if=/dev/urandom of=/dev/mmcblk0 bs=1M count=30

拔插 SD 卡,用 lsblk 命令查看分区是否被删除

3,写 MLO 及 u-boot.img

sudo dd if=MLO of=/dev/mmcblk0 count=1 seek=1 bs=128k

sudo dd if=u-boot.img of=/dev/mmcblk0 count=2 seek=1 bs=384k

4,新建分区

$ sudo sfdisk /dev/mmcblk0 <<-EOF

>>4M,,L,*

>>EOF

$ sudo mkfs.ext4 -L GNU/Linux /dev/mmcblk0p1

$ sudo mount /dev/mmcblk0p1 /mnt/

2,放置根文件系统

$ sudo tar xvf ~/Downloads/debian-9.3-minimal-armhf-2017-12-09/armhf-rootfs-debian-stretch.tar -C /mnt/

3,拷贝编译好的 dtbs 及 linux 内核

$ sudo cp arch/arm/boot/zImage /mnt/boot/vmlinuz-4.14.29

$ sudo mkdir -p /mnt/boot/dtbs/4.14.29

$ sudo cp arch/arm/boot/dts/am335x-boneblack*.dtb /mnt/boot/dtbs/4.14.29

$ sudo touch /mnt/boot/uEnv.txt

$ sudo sh -c 'echo "uname_r=4.14.29" >> /mnt/boot/uEnv.txt'

$ sync

$ sudo umount /mnt

5,按住 S2 启动

出现 无法登录 Linux 错误

6,修改权限

$ sudo mount /dev/mmcblk0p1 /mnt

$ sudo chmod 755 /mnt

$ sync

7,再次启动之后成功登录!

8,定制化的根文件系统

上述流程中,debian-9.3-minimal-armhf-2017-12-09 这个根文件系统是制作好的,在定制化产品设计时我们很可能需要自己剪裁制作根文件系统,将不需要的命令,库都剪掉,保证系统的足够的小。以下简述基于 busybox 制作根文件系统的大致流程:

  • 下载 busybox 源码;
  • 配置并编译 busybox;
  • 创建 dev/console、dev/null;
  • 复制 /usr/arm-linux-gnueabi/lib/* 里面的 C 库到 lib 目录;
  • echo "console::askfirst:-/bin/sh" >> etc/inittab;
  • 制作好后根文件系统目录:bin boot dev etc lib linuxrc sbin usr
  1. bin linuxec sbin usr: 编译 busybox 安装以后得到的;
  2. boot: 存放 uEnv.txt,和上述流程中的一致;
  3. dev:  存放 console、null 两个字符设备;
  4. etc:  存放 inittab;
  5. lib:  存放 C 库;

9,再次启动

 

 

10,挂接 proc 文件系统

很多应用程序需要使用到 proc 文件系统,例如 ps、ifconfig 等,因此挂载 proc 文件系统。

mount -t proc proc /proc

11,挂接 NFS 文件系统

NFS (Network File System) 在嵌入式开发中可以极大便利调试过程,目标机器通过 mount 命令将服务器的某个目录(nfs文件系统)挂接到本地,这样就可以在服务器编译开发程序,在目标机器里执行验证程序。以下简述 NFS 的使用:

服务器端:

搭建 NFS Server

sudo apt-get install nfs-kernel-server

cat /etc/exports

/home/user/exportfs 192.168.1.*(rw,sync,no_root_squash,no_subtree_check)

将这个配置填入 /etc/exports 为 nfs server 所用,对 192.168.1 网段的所有客户机开放 /home/user/exportfs 目录 nfs 挂接。

更新 nfs table

sudo exportfs -a

重新加载 nfs 服务

sudo /etc/init.d/nfs-kernel-server reload

目标机端:

/ # mount -t nfs -o nolock 192.168.1.11:/home/gimcuan/exportfs /mnt

这里 192.168.1.11 即为服务器某网卡的 ip 地址。需要注意的是,目标机的网络地址需要和服务器处于同一网段。

12,自动挂接

如何实现自动挂接文件系统?在 init 进程启动时会去 /etc/inittab 遍历需要执行的 actions,因此我们可以在 /etc/inittab 里面添加:

::sysinit:/etc/init.d/rcS

cat /etc/inittab

console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS

内核启动 init 进程后,init 进程会去执行 /etc/init.d/rcS 脚本:

cat /etc/init.d/rcS

mount -t proc none /proc

13,重新挂载根文件系统

根据上述步驟中制作好的根文件系统被挂接为只读,用以下命令重新挂载为可读写

mount -o rw,remount /

14,文件系统格式工具 – mke2fs

mkfs.ext2、mkfs.ext3、mkfs.ext4 均为指向 mke2fs 的软链接,mke2fs 为 e2fsprogs 程序包编译而来

15,eMMC 挂载失败解决办法

错误一:

[ 5706.828042] FAT-fs (mmcblk1p1): codepage cp437 not found

需加载 nls_cp437.ko 内核模块: insmod nls_cp437.ko

错误二:

[ 6199.821599] FAT-fs (mmcblk1p1): IO charset ascii not found

需加载 nls_ascii.ko 内核模块: insmod nls_ascii.ko

mount -t vfat /dev/mmcblk1p1 /tmp/boot/ -o sync

-t vfat 表明 /dev/mmcblk1p1 为 FAT 文件系统格式,可以省略掉

外部链接:

1,Build U-Boot and Linux Kernel for Beaglebone and Beaglebone Black

2,NFS Server setup

Post a Comment

Your email is never published nor shared. Required fields are marked *