4.5 使用busybox制作根文件系统
4.1. 使用busybox制作文件系统
4.1.1 busybox源码下载:
下载地址:Index of /downloads
4.1.2. busybox源码中修改Makefile
ARCH = arm
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-
4.1.3. make menuconfig配置busybox
(1)静态方式编译busybox
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
(2)命令行vi风格
Busybox Library Tuning--->
[*]vi-style line editing commands
(3)配置模块,在驱动中会使用到
Linux Module Utilities--->
[ ]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
(4)配置mdev,/dev中的驱动设备节点由mdev创建
Linux System Utilities--->[*]mdev
[*]Support /etc/mdev.conf
[*]Support subdirs/symlinks
[*]Support regular expressions substitutions when renaming dev
[*]Support command execution at device addition/removal
[*]Support loading of firmwares
(5)配置安装目录
Busybox Settings--->
Installation Options("make install" behavior)--->
BusyBox installation prefix
(6)然后make编译,make install安装,rootfs文件夹就会有如下结果:
4.1.4. 添加/dev/inittab文件
Linux系统启动之后就会启动init进程,init进程会根据/etc/inittab这个文件来启动在不同的运行级别进程或操作。
inittab的格式: id:runlevels:action:process
id:登记项标识符,用于惟一地标识/etc/inittab文件中的每一个登记项
runlevels:系统运行级别,指定登记项的运行级别,runlevels的级别有:
0 | 让init关闭所有进程并终止系统 |
1 | 单用户模式,单用户模式只能有系统管理员进入,runlevels的编号1也可以用S代替。 |
2 | 允许系统进入多用户的模式,但并不支持文件共享 |
3 | 最常用的运行模式,主要用来提供真正的多用户模式 |
4 | 这个模式保留未用 |
5 | 表示图形用户模式 |
6 | 关闭所有运行的进程并重新启动系统 |
action:用于设置process的运行方式
respawn | init应该监视这个进程,即使其结束后也应该被重新启动 |
wait | init应该运行这个进程一次,并等待其结束后再进行下一步操作 |
once | init只运行一次该进程 |
boot | 系统启动时运行该进程 |
bootwait | 在系统启动时运行,init等待进程完成 |
ctrlaltdel | 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init |
sysinit | 在运行boot或bootwait进程之前运行 |
powerfail | 当init收到SIGPWR信号时运行 |
powerokwait | 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行 |
powerwait | 当收到SIGPWD信号,并且init等待进程结束时运行 |
process:表示所要执行的shell命令
inittap示例:
#first:run the system script file
::sysinit:/etc/init.d/rcS
#::askfirst:-/bin/sh
::sysinit:/bin/login
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
4.1.5. /dev/init.d/rcS文件
#!/bin/sh#环境变量设置,操作系统执行程序默认到PATH指定的目录下寻找该程序
PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S #单用户模式
prevlevel=Numask 022 #指定当前用户在创建文件时的默认权限export PATH runlevel prevlevel #导出环境变量mount -a#调用mdev管理程序动态的创建插拔设备。kernel在每次设备出现变动时调用/sbin/mdev来处理对应的信息
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s/bin/hostname -F /etc/sysconfig/HOSTNAME #设置主机名称ifconfig eth0 192.168.1.10 #设置ip地址
4.1.6. /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /var tmpfs defaults 0 0tmpfs /tmp tmpfs defaults 0 0tmpfs /dev tmpfs defaults 0 0
4.1.7. /etc/profile
用于命令行打印出用户名和主机名称
# Ash profile
# vim: syntax=sh# No core files by default
ulimit -S -c 0 > /dev/null 2>&1USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH
4.1.8. etc/passwd
root:x:0:0:root:/root:/bin/sh
4.1.9. /etc/shadow
root:xoQIkAeyYSSLI:14610:0:99999:7:::
4.1.10. 复制交叉编译工具链动态链接库文件到rootfs
4.2. 制作根文件系统镜像
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 10240
mount -t ext2 /dev/loop1 ./rootfs/
将之前使用busybox制作的rootfs的文件复制过来,然后取消挂载,然后制作镜像
umount /dev/loop1
losetup -d /dev/loop1
inittap参考:Linux根文件系统:/etc/inittab文件分析 - LinFeng-Learning - 博客园