基于sysvinit,udev的根文件系统构建

sysvinit版本:sysvinit-2.86-.tar.gz
udev版本:udev-126.tar.bz2
busybox版本:busybox-1.15.3.tar.gz
交叉编译工具:arm-linux-gcc(version:4.3.3)
根文件系统路径:/opt/linux/rootfs
#sysvinit
资源下载:http://download.csdn.net/detail/pengrui18/9320575
编译过程:

tar xvzf sysvinit-2.86.tar.gz -C./
cd sysvinit-2.86
vim src/Makefile                                                      
修改如下:
11,   
>CC = arm-linux-gcc
15,                                 
+INSTALL_DIR = $(shell pwd)/../install
54,57
>#ifneq ($(wildcard /usr/lib/libcrypt.a),)
>#LCRYPT     =-L/usr/local/arm/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib -lcrypt 
+LCRYPT      =-lcrypt 
>#endif
112,133
install:
	+rm -fr $(INSTALL_DIR)/*
	+mkdir $(INSTALL_DIR)/bin
	+mkdir $(INSTALL_DIR)/sbin
	+mkdir $(INSTALL_DIR)/dev
	+mkdir $(INSTALL_DIR)/usr
	+mkdir $(INSTALL_DIR)/usr/bin
	+mkdir $(INSTALL_DIR)/usr/sbin
	+mkdir $(INSTALL_DIR)/usr/share
	+mkdir $(INSTALL_DIR)/usr/include
	+mkdir $(INSTALL_DIR)/usr/man
	+mkdir $(INSTALL_DIR)/usr/man/man1
	+mkdir $(INSTALL_DIR)/usr/man/man5
	+mkdir $(INSTALL_DIR)/usr/man/man8
	+mkdir $(INSTALL_DIR)/usr/share/man
	+mkdir $(INSTALL_DIR)/usr/share/man/man1 
	+mkdir $(INSTALL_DIR)/usr/share/man/man5 
	+mkdir $(INSTALL_DIR)/usr/share/man/man8
114,
	>$(INSTALL) -m 755 $$i $(INSTALL_DIR)/bin/; \
117,	
	>$(INSTALL) -m 755 $$i $(INSTALL_DIR)/sbin/; \
120,	
	>$(INSTALL) -m 755 $$i $(INSTALL_DIR)/usr/bin/; \
122,128	
	># $(INSTALL) -m 755 etc/initscript.sample $(INSTALL_DIR)/etc/
	>ln -sf halt $(INSTALL_DIR)/sbin/reboot
	>ln -sf halt $(INSTALL_DIR)/sbin/poweroff
	>ln -sf init $(INSTALL_DIR)/sbin/telinit
	>ln -sf ../sbin/killall5 $(INSTALL_DIR)/bin/pidof
	>if [ ! -f $(INSTALL_DIR)/usr/bin/lastb ]; then \
	>ln -sf last $(INSTALL_DIR)/usr/bin/lastb; \
130,
	>$(INSTALL) -m 644 initreq.h $(INSTALL_DIR)/usr/include/
132,	
	>$(INSTALL) -m 644 ../man/$$i $(INSTALL_DIR)$(MANDIR)/man1/; \
135,	
	>$(INSTALL) -m 644 ../man/$$i $(INSTALL_DIR)$(MANDIR)/man5/; \
138,	
	>$(INSTALL) -m 644 ../man/$$i $(INSTALL_DIR)$(MANDIR)/man8/; \
140,	
	>#ifeq ($(INSTALL_DIR),)
145,148	
	>echo "Creating $(INSTALL_DIR)/dev/initctl"; \
	>mknod -m 600 $(INSTALL_DIR)/dev/initctl p; fi
	>#endif

make&&make install
cp -a install/* /opt/linux/rootfs
rm -fr /opt/linux/rootfs/sbin/sulogin

#udev
资源下载:http://download.csdn.net/detail/pengrui18/9320579
编译:

tar xvjf udev-126.tar.bz2 -C./
cd udev-126
vim udev/udev_config.c
修改代码如下:
	167,168
	>strcpy(udev_config_filename,"/etc/udev/udev.conf");
	>strcpy(udev_root, "/dev");
	vim /udev/udev_rules_parse.c
	745
	>add_matching_files(&name_list, "/lib/udev/rules.d", ".rules");
	748
	>add_matching_files(&sort_list, "/etc/udev/rules.d", ".rules");
./configure --prefix=/opt/linux/rootfs --host=arm-linux
make&&make install
cp -a install/* /opt/linux/rootfs

#busybox
去除如下编译项:
Init Utilities->init
Init Utilities->poweroff, halt, and reboot
Miscellaneous Utilities->mountpoint
Miscellaneous Utilities->runlevel
Process Utilities->pidof
Process Utilities->killall5
其他选项根据需要选择配置。
make&&make install
#udev介绍
##udev 主配置文件
主要的udev 主配置文件是 /etc/udev/udev.conf。这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项:

#udev_root=/dev/  # 设置的绝对路径,相当于创建 chroot 的根,udev默认为/dev/目录。
#udev_rules=/etc/udev/rules.d/ #规则的存放地址,udev-126已经默认为/lib/udev/rules.d和/etc/udev/rules.d/这两个地方
udev_log=err      # 日志的输入级别
默认的规则配置文件存放在 /etc/udev/rules.d/和/lib/udev/rules.d 中,我们进入这个可以看到 RedHat 默认对设备建好的一些规则和一些硬件公司写好的规则。
进入目录,可以见到以二位数字开头的前缀的配置文件,可以使用 vi 进入配置文件中查看,一行是一条规则,默认是从小数字到大数字,这些表示生效的顺序。
我们在使用 udev 写规则前,先来看一个例子

KERNEL==sd*, PROGRAM=/lib/udev/scsi_id -g -s %p, RESULT==123456, SYMLINK=%k_%c
该规则的执行:如果有一个内核设备名称以 sd 开头,且 SCSI ID 为 123456,则为设备文件产生一个符号链接“sda_123456”. %p %k %c 请看后面的“udev 的值和可调用的替换操作符 ”
在规则文件里,除了以“#”开头的行(注释),所有的非空行都被视为一条规则,但是一条规则不能扩展到多行。规则都是由多个 键值对(key-value pairs)组成,并由逗号隔开,键值对可以分为 条件匹配键值对( 以下简称“匹配键 ”) 和 赋值键值对( 以下简称“赋值键 ”),一条规则可以有多条匹配键和多条赋值键。匹配键是匹配一个设备属性的所有条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。
规则文件里的规则有一系列的键/值对组成,键/值对之间用逗号(,)分割。
##udev规则
通过上面例子中也能看出,这些配置,但我想大家可能会产生疑惑,为什么 KERNEL 是匹配键,而 NAME 和 MODE 是赋值键呢?这由中间的操作符 (operator) 决定。
仅当操作符是“==”或者“!=”时,其为匹配键;若为其他操作符时,都是赋值键。
匹配键和赋值键操作符解释见下表:
操作符 匹配或赋值t 解释
----------------------------------------
== 匹配 相等比较
!= 匹配 不等比较
= 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值。
+= 赋值 追加特定的值给已经存在的键
:= 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它。

udev 规则的匹配键 :
键 含义
----------------------------------------
ACTION 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
KERNEL 在内核里看到的设备名字,比如sd表示任意SCSI磁盘设备
DEVPATH 内核设备录进,比如/devices/

SUBSYSTEM 子系统名字,例如:sda 的子系统为 block。
BUS 总线的名字,比如IDE,USB
DRIVER 设备驱动的名字,比如ide-cdrom
ID 独立于内核名字的设备名字
SYSFS{ value} sysfs属性值,他可以表示任意
ENV{ key} 环境变量,可以表示任意
PROGRAM 可执行的外部程序,如果程序返回0值,该键则认为为真(true)
RESULT 上一个PROGRAM调用返回的标准输出。
NAME 根据这个规则创建的设备文件的文件名。
注意:仅仅第一行的NAME描述是有效的,后面的均忽略。
如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
SYMLINK 为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,
所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
OWNER 设备文件的属组
GROUP 设备文件所在的组。
MODE 设备文件的权限,采用8进制
RUN 为设备而执行的程序列表
LABEL 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
GOTO 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
IMPORT{ type} 导入一个文件或者一个程序执行后而生成的规则集到当前文件
WAIT_FOR_SYSFS 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。
PTIONS 特定的选项:
last_rule 对这类设备终端规则执行;
ignore_device 忽略当前规则;
ignore_remove 忽略接下来的并移走请求。
all_partitions 为所有的磁盘分区创建设备文件。
##udev 的值和可调用的替换操作符
在键值对中的键和操作符都介绍完了,最后是值 (value)。Linux 用户可以随意地定制 udev 规则文件的值。
例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:
----------------------------------------
$kernel, %k:设备的内核设备名称,例如:sda、cdrom。
$number, %n:设备的内核号码,例如:sda3 的内核号码是 3。
$devpath, %p:设备的 devpath路径。
$id, %b:设备在 devpath里的 ID 号。
$sysfs{file}, %s{file}:设备的 sysfs里 file 的内容。其实就是设备的属性值。
例如:

$sysfs{size} 表示该设备 ( 磁盘 ) 的大小。
$env{key}, %E{key}:一个环境变量的值。
$major, %M:设备的 major 号。
$minor %m:设备的 minor 号。
$result, %c:PROGRAM 返回的结果
$parent, %P:父设备的设备文件名。
$root, %r:udev_root的值,默认是 /dev/。
$tempnode, %N:临时设备名。
%%:符号 % 本身。
$$:符号 $ 本身。

#udev命令
udevadm udev 管理工具
概要:
udevadm [–debug] [–version] [–help]
udevadm info options
udevadm trigger [options]
udevadm settle [options]
udevadm control command
udevadm monitor [options]
udevadm test [options] devpath

描述:
udevadm 后接一个命令和命令指定选项。它控制了udev运行的行为,处理内核事件,控制事件队列,并且提供简单的调试机制。
选项:
–debug 打印错误信息
–version 打印版本信息
–help 帮助文档

udevadm info options
查询udev数据库中的设备信息。也可以从sysfs文件系统中查询到设备的属性以辅助创建udev规则。
–query=type
从数据库中查询指定类型的设备。需要–path和–name来指定设备。合法的查询文件是:设备名,链接,路径,属性
–path=devpath
设备的路径
–name=file
设备节点或者链接
–attribute-walk
打印指定设备的所有sysfs记录的属性,以用来udev规则匹配特殊的设备。该选项打印链上的所有设备信息,最大可能到sys目录。
–device-id-of-file=file
打印主/从设备号
–export-db
输出udev数据库中的内容
–version
输出版本信息
–help
打印帮助文档

udevadm trigger [options]
接收内核发送来的设备事件。主要用于重放coldplug事件信息
(译者补充:内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件系统导出。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。)
–verbose 输出将要被触发的设备列表。
–dry-run 不真的触发事件
–type=type 触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices
–action=action
被触发的事件,默认是change
–subsystem-match=subsystem
触发匹配子系统的设备事件。这个选项可以被多次指定,并且支持shell模式匹配。
–attr-match=attribute=value
触发匹配sysfs属性的设备事件。如果属性值和属性一起指定,属性的值可以使用shell模式匹配。如果没有指定值,会重新确认现有属性。这个选项可以被多次指定。
–attr-nomatch=attribute=value
不要触发匹配属性的设备事件。如果可以使用模式匹配。也可以多次指定
–property-match=property=value
匹配属性吻合的设备。可以多次指定支持模式匹配
–tag-match=property
匹配标签吻合的设备。可以多次指定。
–sysname-match=name
匹配sys设备名相同的设备。可以多次指定支持模式匹配。

udevadm settle [options]
查看udev事件队列,如果所有事件全部处理完就退出。
–timeout=seconds
等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。
–seq-start=seqnum
只等待到给定的顺序号。
–seq-end=seqnum
只等待到给定顺序号之前。
–exit-if-exists=file
如果文件存在就退出
–quiet
不输出任何信息
–help
输出帮助文档

udevadm monitor [options]
监听内核事件和udev发送的events事件。打印事件发出的设备。可以通过比较内核或者udev事件的时间戳来分析事件时序。
–kernel
输出内核事件
–udev
输出udev规则执行时的udev事件
–property
输出事件的属性
–subsystem-match=string
通过子系统或者设备类型过滤事件。只有匹配了子系统值的udev设备事件通过。
–tag-match=string
通过属性过滤事件,只有匹配了标签的udev事件通过。
–help

udevadm test [options] devpath
模拟一个udev事件,打印出debug信息。
–action=string
–subsystem=string
–help
#udev规则编写实例
执行这两条命令之后,/dev/目录下的设备文件就会自动生成
此处以挂载U盘为例:

cd /opt/linux/lib/udev/rules.d
touch 96-udisk.rules
vim 96-udisk.rules
添加如下内容:
# mount udisk and umount udisk automatically
ACTION!="add", GOTO="udisk_add_end"
KERNEL=="sda[0-9]", RUN+="/lib/udev/mount.sh /dev/sda%n"
LABEL="udisk_add_end"
ACTION!="remove", GOTO="udisk_remove_end"
KERNEL=="sda[0-9]" RUN+="/lib/udev/umount.sh"
LABEL="udisk_remove_end"

cd ../
touch mount.sh
添加如下内容:
#!/bin/sh 
if [ -n "$1" ];then
	/bin/echo "mount -t vfat $1 /mnt/udisk" > /dev/console
	/bin/mount -t vfat $1 /mnt/udisk
fi
touch umount.sh
添加如下:
umount /mnt/udisk

#udev设备管理实例
udev启动设备管理:
/sbin/udevd --daemon
/sbin/udevadm trigger
#制作好的测试根文件系统
资源下载:http://download.csdn.net/detail/pengrui18/9320589

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值