LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 865|回复: 0

由手动创建LVM设备文件说开

[复制链接]
发表于 2010-2-28 12:28:27 | 显示全部楼层 |阅读模式
原文地址:http://www.mike.org.cn/blog/?p=1218

发这个帖子先各V高手请教下。有知道下面问题原因的,帮忙指导下


  下午群里有网友问到如何恢复被误删掉的LVM设备文件,顺便重新总结了下mknod的相关资料,整理过程中发现lvm设备文件的缺省主设备号为 109,发现群里@斌的系统/dev/下是有这个设备文件的,但我始终无法在找到/dev/lvm设备文件(有做LVM的,系统是 RHEL4,LVM2)。网上找到的对于/dev/lvm设备文件的资料中,都是手动创建的类似这样:

# LVM device nodes
mknod -m 600 $INITRDDIR/dev/lvm c 109 0
mkdir $INITRDDIR/dev/vg00
mknod -m 640 $INITRDDIR/dev/vg00/group c 109 0
mknod -m 660 $INITRDDIR/dev/vg00/lv00 b 58 0
chown root:disk $INITRDDIR/dev/vg00/*


  研究了一晚上,最后发现其实@斌的也是手动添加的这个设备文件,难道Linux(Kernel 2.6)用UDEV管理设备后,不在/dev下生成对应的设备文件?望高手指点,谢谢!

  下面是总结的mknod相关资料,发出来分享一下。 

  一、用途

  创建特殊文件。

  二、语法

mknod [Option]... Name Type [Major Minor]

  只能由root用户或系统组成员运行

mknod Name {b|c} Major Minor

  创建FIFO(已命名的管道)

mknod Name {p}

  GNU选项(缩写):

[-m mode] [--help] [--version] [--]

  三、描述

  mknod用指定名称产生一个FIFO(命名管道),字符专用或块专用文件。

  文件系统中的一个专用文件存贮着三种信息(布尔型、整型、整型)。布尔型在字符文件与块文件之间作出选择,两个整型是主、次设备号。

  通常,一个专用文件并不在磁盘上占用空间,仅仅是为操作系统提供交流,而不是为数据存贮服务。一般地,专用文件会指向一个硬件设备(如:磁盘、磁带、打印机、虚拟控制台)或者操作系统提供的服务(如:/dev/null, /dev/random)。

  块文件通常类似于磁盘设备(在数据可以被访问的地方赋予一个块号,意味着同时设定了一个块缓存)。所有其他设备都是字符文件。(以前,两种文件类型间是有差别的。比如:字符文件I/O没有缓存,而块文件则有。)

  mknod命令就是用来产生这种类型文件的。

  mknod命令第一个参数是Name项设备的名称。选择一个描述性的设备名称。mknod命令有两种形式,它们有不同的标志。

  mknod命令的第一种形式只能由root用户或系统组成员执行。在第一种形式中,使用了b或c标志。b标志表示这个特殊文件是面向块的设备 (磁盘、软盘或磁带)。c标志表示这个特殊文件是面向字符的设备(其他设备)。

  第一种形式的最后两个参数是Major和Minor分别是主设备号和次设备号(它们可以是十进制或八进制的,GNU版本还允许使用以0x开头的十六进制)。一般来说主设备号用来区分设备的种类;次设备号则是为了作唯一性区分,标明不同属性或理解为主设备号被系统用来确定驱动程序,次设备号被驱动程序用来确定具体的设备。而主次设备号是预先分配好的,具体可以查询设备号分配清单(主设备号定义可详见Kernel源码中/usr/src/linux /Documentation/device.txt文件)。以确保整个系统设备定义的一致性,这是很重要的。

  在mknod命令的第二种形式中,使用了p标志来创建 FIFO(已命名的管道)。

  以下参数指定了所产生文件的类型:

  b 表示特殊文件是面向块的设备(磁盘、软盘或磁带)。
  c 表示特殊文件是面向字符的设备(其他设备)。
  p 创建 FIFO(已命名的管道)。此类型后不可跟主次设备数目。

  GNU版本还允许使用u('unbufferd'非缓冲化),以保持与C语言的一致。

  当创建一个块文件或字符文件时,主、次设备号必须在文件类型参数后给出。(十进制或八进制以0开头;GNU版本还允许使用以0x开头的十六进制)缺省地,所产生的文件模式为0666('a+rw')。

  选项

  -m mode, --mode=mode 为新建立的文件设定模式,就象应用命令chmod一样,以后仍然使用缺省模式建立新目录。

  GNU 标准选项

  --help 在标准输出上显示使用信息并顺利退出。
  --version 在标准输出上显示版本信息并顺利退出
  -- 终端选项列表。

  四、示例

  A、要创建一个新软盘驱动器的特殊文件,输入:

mknod /dev/fd2  b 1 2

  这创建了 /dev/fd2 特殊文件,它是一个特殊块文件,主设备号为 1,次设备号为 2。
[下一页……]
  B、创建一个名为console且权限为600的一个面向字符类设备的特殊文件,且主设备号为5,次设备号为1,为第一个子设备。当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了

mknod -m 600 /dev/console c 5 1

  C、创建一个名为null且权限为666的一个面向字符类设备的特殊文件,且主设备号为1,次设备号为3

mknod -m 666 /dev/null c 1 3

  D、创建一个名为doc的面向块设备的特殊文件,0指的是整个DOC。如果把0换为1,则1指的是DOC的第一个分区。2是第2个,依次类推。

mknod doc b 62 0

  E、创建虚拟设备(dev),日志记录的时候有的选项可能用到它们。在默认情况下,是使用/dev目录下的文件,但是由于我们需要把DNS限制到一个目录,所以必须完全把/dev下用到的文件(或者说设备)模拟过来才可以。

ls -lL /dev/zero /dev/null /dev/random

  看到类似

crw-rw-rw-  1 root   root    1,  3 2003-09-15 /dev/null
crw-r--r--  1 root   root    1,  8 2003-09-15 /dev/random
crw-rw-rw-  1 root   root    1,  5 2003-09-15 /dev/zero

  这样的,将其中的1,3这样的数字记录下来,这表示主设备号和次设备号(),在redhat下,ls加不加-L参数都无所谓,但是在 Solaris下则一定要加上才可以显示。

mknod dev/null c 1 3
mknod dev/zero c 1 5
mknod dev/random c 1 8

  五、其它知识点

  由于上面提到设备文件这个知识点,下面简单说下什么是设备文件和它的作用。

  设备文件

  对于每种硬件设备,系统内核有相应的设备驱动程序负责对它的处理。而在Unix-like中,使用设备文件的方式来表示硬件设备,每种设备驱动程序都被抽象为设备文件的形式,这样就给应用程序一个一致的文件界面,方便应用程序和操作系统之间的通信。

  习惯上,所有的设备文件都放置在/dev目录下。

$ ls -l /dev/rfd0 /dev/fd0

brw-r-----  9 root  operator    2,   0 Nov 12 13:32 /dev/fd0

//系统使用b(block)标识块设备文件。

crw-r-----  9 root  operator    9,   0 Nov 12 13:32 /dev/rfd0

//系统使用c(character)标识一个字符设备文件

  在上面的列表中可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号 (major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number),硬件驱动程序使用它来区分不同的设备和判断如何进行处理。事实上设备文件的名字并不重要,重要的是这两个设备号,操作系统使用它确定硬件驱动程序,并与硬件驱动程序进行通信。

  1)磁盘和块设备文件

  在Unix-like下将设备分为两种,块设备和字符设备,其中块设备主要用于随机存取的目的,磁盘为这一类设备的代表,而字符设备用于顺序存取的目的,例如磁带或终端设备就属于这个类别。

  2)设备文件的创建

  通常情况下,安装系统时已经创建了常用的设备文件,可以直接访问这些设备文件来访问设备。但在用户重新定制内核,并添加了新硬件驱动程序之后,新驱动程序对应的设备文件就可能不存在。最常见的例子就是在内核中增加声卡的驱动程序时,就需要创建相应设备文件。

  创建设备文件的基本方式是使用mknod,但是必须知道该设备的正确设备号才可以。另一种简单的方式是使用/dev目录下的shell程序 makedev来完成,makedev实质上就是记录了很多设备的名字与其设备号之间的关系的程序,因此它能使用正确的设备号来创建设备。

  首先进入/dev目录,然后再执行makedev。

# cd /dev

# sh makedev snd0

  makedev将使用mknod和对应设备的正确参数,包括字符或块设备、主设备号和从设备号来建立相应的设备文件。管理员也可以直接使用 mknod创建设备文件,但这就必须将这些设备参数统统指定正确才行。因此除非对系统中的硬件驱动程序特别熟悉,一般不直接使用mknod来创建设备文件。

  更多详细使用可参考:

  MAKEDEV(8)-Linux man page
  Creating devices  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表