day46-系统移植根文件

day46-系统移植根文件

一、根文件目录

目录 说明
/ 根目录,一般只存放子目录,不存放文件
/bin 存放常用的命令和程序,如 ls, cp, rm 等
/boot 存放启动 Linux 时使用的一些核心文件,包括链接文件和镜像文件
/dev 存放 Linux 的外部设备,如 cpu, disk 等
/etc 存放系统的配置文件和子目录
/home 存放普通用户的主目录,以用户的账号命名
/lib 存放系统最基本的动态连接共享库,类似于 Windows 里的 DLL 文件
/lost+found 存放系统非法关机后的一些文件
/media 存放自动识别的设备,如 U 盘,光驱等
/mnt 存放临时挂载的文件系统,如光驱等
/opt 存放额外安装的软件或者服务
/proc 存放当前内核运行状态的一系列特殊文件,是一个虚拟的目录
/root 系统管理员的用户主目录
/run 存放系统启动以来的信息,是一个临时文件系统
/sbin 存放系统管理员使用的高级管理程序和系统守护程序
/selinux 存放 selinux 相关的文件,是一个安全机制
/srv 存放一些服务启动后需要提取的数据
/sys 存放 2.6 内核中新出现的一个文件系统 sysfs ,集成了 proc, devfs 和 devpts 的信息
/tmp 存放一些临时文件
/usr 存放用户的应用程序和文件,类似于 Windows 下的 program files 目录
/var 存放不断扩充的东西,包括各种日志文件

注:
echo $PATH 查看环境变量
ls -l /dev 后”c”代表字符设备,”b”代表块设备。Linux中分主设备号和次设备号

设备节点

设备节点 类型 说明
/dev/console 字符设备 系统控制台,用于显示系统启动信息和内核打印信息
/dev/null 字符设备 空设备,可以向它写入任何数据,但是读取时总是返回 EOF
/dev/zero 字符设备 零设备,可以向它写入任何数据,但是读取时总是返回 0
/dev/random 字符设备 随机数生成器,可以从它读取随机数
/dev/tty 字符设备 终端设备,用于表示当前登录的用户终端
/dev/ttySx 字符设备 串口设备,用于表示串行通信接口,x 是数字编号
/dev/ttyUSBx 字符设备 USB转串口设备,用于表示通过 USB 接口连接的串行通信接口,x 是数字编号
/dev/hdax 块设备 IDE硬盘分区设备,用于表示 IDE 接口的硬盘分区,x 是数字编号
/dev/sdax 块设备 SCSI/SATA/USB硬盘分区设备,用于表示 SCSI/SATA/USB 接口的硬盘分区,x 是数字编号
/dev/mmcblkxp 块设备 MMC/SD卡分区设备,用于表示 MMC/SD 卡的分区,x 是数字编号,p 是分区号

二、根文件系统的制作

1、linuxxrc

用来启动linux的脚本文件,放在根文件系统的根目录下,通过内核命令产生init指令

init = /linuxrc

创建根文件系统步骤

  • 创建根文件系统目录,一般在 /home 目录下创建一个 rootfs 的目录,然后在其中创建各种必要的子目录,如 /bin, /dev, /etc, /lib, /proc, /sys 等。
  • 创建设备文件,一般在 /dev 目录下创建一些常用的设备节点,如 console, null, zero, tty 等,可以使用 mknod 命令或者 udev/mdev 程序来创建。
  • 下载并编译内核源码,一般从 https://www.kernel.org/ 下载自己想要的内核版本,然后解压并进入内核源码目录,使用 make menuconfig 命令进行配置,选择合适的平台和功能选项,然后使用 make 命令编译内核,最后使用 make uImage 命令生成内核镜像文件。
  • 编译并安装内核模块,一般在编译内核后,使用 make modules 命令编译内核模块,然后使用 make modules_install 命令安装内核模块到根文件系统目录下的 /lib/modules 目录中。
  • 下载并编译 busybox,busybox 是一个集成了常用命令和工具的工具集,可以简化根文件系统的制作过程。一般从 https://busybox.net/downloads/ 下载自己想要的 busybox 版本,然后解压并进入 busybox 目录,使用 make menuconfig 命令进行配置,选择合适的平台和功能选项,然后使用 make 命令编译 busybox,最后使用 make install 命令安装 busybox 到根文件系统目录下的 /bin, /sbin, /usr 目录中。
  • 补全动态链接库,一般从交叉编译工具链中拷贝 lib 目录到根文件系统目录下的 /lib 目录中,以便运行时能够找到所需的动态链接库。
  • 生成配置文件,一般在根文件系统目录下的 /etc 目录中创建各种配置文件,如 fstab, inittab, profile, passwd, group, shadow 等。其中 fstab 文件用于指定哪些设备或文件系统需要被挂载到哪些目录上;inittab 文件用于指定 init 进程启动时需要执行哪些脚本或程序;profile 文件用于设置环境变量和命令提示符等;passwd, group, shadow 文件用于设置用户和组的信息和密码等。
  • 烧写和验证根文件系统,一般将根文件系统打包成一个镜像文件,如 ext4 格式或者 cramfs 格式等,然后将其烧写到相应的设备上,如硬盘分区或者 SD 卡等。然后将内核镜像文件也烧写到相应的设备上,如 NAND Flash 或者 SD 卡等。最后使用启动加载程序,如 U-boot 等,来加载内核镜像文件,并指定根文件系统的位置,如 root=/dev/mmcblk0p1 等,然后启动内核并进入根文件系统。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
1. 安装 BusyBox
1) 将busybox-1.22.1.tar.bz2拷贝到你需要操作的目录
cp busybox-1.22.1.tar.bz2 /home/farsight/workpace/fs4412
2) 解压busybox-1.22.1.tar.bz2
tar xf busybox-1.22.1.tar.bz2
3) 进入到busybox目录中
cd busybox-1.22.1
4) 配置编译信息
make menuconfig //弹出图像界面
Busybox Settings ---> //设置busybox
Build Options ---> //编译选项
[*] Build BusyBox as a static binary (no shared libs) //采用静态编译
(arm-linux-) Cross Compiler prefix //采用的编译器是arm-linux-
Installation Options ("make install" behavior) ---> //设置安装路径
(./rootfs) BusyBox installation prefix //设置安装路径为./rootfs,如果采用默认路径为./_install
5) 编译busybox
make
6) 安装busybox
make install
7) 替换共享目录
rm -r /source/nfs/rootfs
cp -r rootfs /source/nfs

启动开发板,观察现象:
此时的文件系统能够启动,但是缺少文件;

2. 创建缺少的目录
mkdir etc dev tmp mnt proc sys var lib
3. 添加所需要的库代码
sudo cp -a /home/farsight/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/* ./lib/ */
进入lib目录删除无用的库,用来保证rootfs足够小,但是要功能的实训;
sudo rm *.a
sudo chmod 0777 *
arm-none-linux-gnueabi-strip *
4. sudo mknod dev/console c 5 1

5. 添加启动配置信息 {
1)/etc/init.d/rcS
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
2) /etc/inittab
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
3) /etc/fstab
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4) /etc/profile
LD_LIBRARY_PATH=/lib:/usr/lib
export LD_LIBRARY_PAHT
PATH=/bin:/sbin:/usr/bin:/usr:/sbin
export PATH
export HOSTNAME=Farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME:\W]\# "

export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=$QTDIR/bin:$PATH
export QWS_SIZE="1024x600"
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
}

如果根文件系统需要烧写flash里面,需要去制作镜像文件;
制作ramdisk.img
$ cd ~
$ dd if=/dev/zero of=initrd.img bs=1k count=8192 //创建一个8M的空磁盘, 表示把/dev/zero中数据读到initrd.img if--表示输入设备 of--输出 bs--单元 count--数目
$ mkfs.ext2 -F initrd.img //把initrd.img制作成ext2格式的文件
$ mount -t ext2 -o loop initrd.img /mnt/ //把initrd.img挂载到/mnt/ 设备需要挂载后才能拷贝
//如果报错:cp: writing `/mnt/rootfs/lib/libBrokenLocale-2.17.so': No space left on device
//说明根文件太大,需要裁剪一部分
$ cp /nfs/rootfs/* /mnt/ -a */ //把文件系统拷贝到/mnt中,也就是initrd.img中
$ umount /mnt/
$ gzip --best -c initrd.img > initrd.img.gz //压缩之前,确认已umount ,避免数据正被使用,压缩出错
$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d initrd.img.gz ramdisk.img //把根文件系统制作成u-boot能识别的格式
$ cp ramdisk.img /tftpboot

//注意验证根文件系统时,使用的是第一天共享的完全OK的内核
#setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;tftp 43000000 ramdisk.img\;bootm 41000000 43000000 42000000 /*
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信