【OS】Linux下 /dev 常见特殊设备介绍与应用[loop]
在这里详细介绍一下loop设备。在进行某些测试的时候,往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方便。在这种情况下,可以通过loop伪设备来实现循环挂载,从而达到目的。在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
在Linux中,设备名按照相应设备驱动程序的符号表项进行命名。这些设备被叫做“loop”设备,设备节点通常命名为/dev/loop0、/dev/loop1之类。
默认情况下Linux支持的loop设备是8个。如果需要超过8个的loop设备,那么可能会遇到类似的错误“no such device”或“could not find any free loop device”,这是因为超过了可用loop设置设备的最大限制,此时可以通过修改/etc/modprobe.conf配置文件,增加如下参数的方式进行扩展:
options loop max_loop=20 #此次增加到20个
保存退出即可,如果要马上生效的话,那么可以通过modprobe -v loop命令立即加载该模块。
还有一种扩展loop设备数量办法是,用mknod命令创建loop块设备:
mknod -m 0660 /dev/loopX b 7 X
其中的X代表第X个loop设备。示例如下:
[root@rhel6lhr dev]# ll loop*
brw-rw---- 1 root disk 7, 0 Jul 27 09:39 loop0
brw-rw---- 1 root disk 7, 1 Jul 27 09:39 loop1
brw-rw---- 1 root disk 7, 2 Jul 27 09:39 loop2
brw-rw---- 1 root disk 7, 3 Jul 27 09:39 loop3
brw-rw---- 1 root disk 7, 4 Jul 27 09:39 loop4
brw-rw---- 1 root disk 7, 5 Jul 27 09:39 loop5
brw-rw---- 1 root disk 7, 6 Jul 27 09:39 loop6
brw-rw---- 1 root disk 7, 7 Jul 27 09:39 loop7
[root@rhel6lhr dev]# mknod -m 0660 /dev/loop8 b 7 8
[root@rhel6lhr dev]# ll loop*
brw-rw---- 1 root disk 7, 0 Jul 27 09:39 loop0
brw-rw---- 1 root disk 7, 1 Jul 27 09:39 loop1
brw-rw---- 1 root disk 7, 2 Jul 27 09:39 loop2
brw-rw---- 1 root disk 7, 3 Jul 27 09:39 loop3
brw-rw---- 1 root disk 7, 4 Jul 27 09:39 loop4
brw-rw---- 1 root disk 7, 5 Jul 27 09:39 loop5
brw-rw---- 1 root disk 7, 6 Jul 27 09:39 loop6
brw-rw---- 1 root disk 7, 7 Jul 27 09:39 loop7
brw-rw---- 1 root root 7, 8 Jul 27 19:36 loop8
[root@rhel6lhr dev]# chown root:disk /dev/loop8
[root@rhel6lhr dev]# chown root:disk /dev/loop20
[root@rhel6lhr dev]# ll loop*
brw-rw---- 1 root disk 7, 0 Jul 27 09:39 loop0
brw-rw---- 1 root disk 7, 1 Jul 27 09:39 loop1
brw-rw---- 1 root disk 7, 2 Jul 27 09:39 loop2
brw-rw---- 1 root disk 7, 3 Jul 27 09:39 loop3
brw-rw---- 1 root disk 7, 4 Jul 27 09:39 loop4
brw-rw---- 1 root disk 7, 5 Jul 27 09:39 loop5
brw-rw---- 1 root disk 7, 6 Jul 27 09:39 loop6
brw-rw---- 1 root disk 7, 7 Jul 27 09:39 loop7
brw-rw---- 1 root disk 7, 8 Jul 27 19:36 loop8
使用命令losetup -a可以查询目前被使用的loop设备:
[root@rhel6lhr dev]# losetup -a
/dev/loop0: [0005]:6631 (/dev/sr0)
/dev/loop1: [fd01]:131081 (/u05/oracle/asmdisk/disk1)
/dev/loop2: [fd01]:131080 (/u05/oracle/asmdisk/disk2)
/dev/loop3: [fd01]:131082 (/u05/oracle/asmdisk/disk3)
/dev/loop4: [fd01]:131083 (/u05/oracle/asmdisk/disk4)
使用loop设备可以创建ASM磁盘,通过Faking的方式不需要额外添加磁盘,可以在现有文件系统上分配一些空间用于ASM磁盘,过程如下所示:
mkdir -p /oracle/asmdisk
dd if=/dev/zero of=/oracle/asmdisk/disk1 bs=1024k count=1000
dd if=/dev/zero of=/oracle/asmdisk/disk2 bs=1024k count=1000
/sbin/losetup /dev/loop1 /oracle/asmdisk/disk1
/sbin/losetup /dev/loop2 /oracle/asmdisk/disk2
raw /dev/raw/raw1 /dev/loop1
raw /dev/raw/raw2 /dev/loop2
chmod 660 /dev/raw/raw1
chmod 660 /dev/raw/raw2
chown oracle:dba /dev/raw/raw1
chown oracle:dba /dev/raw/raw2
将以下内容添加到文件/etc/rc.local文件中:
/sbin/losetup /dev/loop1 /oracle/asmdisk/disk1
/sbin/losetup /dev/loop2 /oracle/asmdisk/disk2
raw /dev/raw/raw1 /dev/loop1
raw /dev/raw/raw2 /dev/loop2
chmod 660 /dev/raw/raw1
chmod 660 /dev/raw/raw2
chown oracle:dba /dev/raw/raw1
chown oracle:dba /dev/raw/raw2
这样就可以使用ASM磁盘了。
& 说明:
有关如何创建ASM磁盘的更多内容请参考:http://blog.itpub.net/26736162/viewspace-1401193/。
linux是文件型系统,所有硬件如软件都会在对于的目录下面有相应的文件表示。对于dev这个目录,我们知道它下面的文件,表示的是linux的设备。在windows系统中,设备大家很好理解,象硬盘,磁盘指的是实实在在硬件。而在文件系统的linux下面,都有对于文件与这些设备关联的。访问它们就可以放到实际硬件,想想还是linux灵活了。变成文件,操作该多简单了。不用调用以前com,prt等接口了。直接读文件,写文件就可以向设备发送读或者写操作了。 按照读写存储数据方式,我们可以把设备分为以下几种:字符型设备,块设备,伪设备。
一、设备分类
字符型设备
字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务,它通常不支持随机存取数据。 字符设备在实现时,大多不使用缓存器。系统直接从设备读取/写入每一个字符。例如,键盘这种设备提供的就是一个数据流,当你敲入“cnblogs”这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由七个字符组成的数据流。它们是顺序的,先返回c,最后是s。
块设备
块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘、CD-ROM和内存区域。
块设备通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。它与字符设备不同之处就是,是否支持随机存储。字符型是流形式,逐一存储。
伪设备
在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份经常使用到的伪设备包括: null,zero,full,loop,random,urandom
二、特殊设备及使用
这里说到特殊设备除了硬盘主板等,只是它在linux shell命令里面,有特殊的作用,因此把它们单独拿出来。这些设备分别是:
/dev/stdin
/dev/stdout
/dev/stderr
/dev/null
/dev/zero
/dev/full
/dev/random,urandom
/dev/fd
/dev/tcp|upd
/dev/loop
1、标准输出输入设备
还记得上次说的,linux重定向吗?可以看下:linux shell数据重定向(输入重定向与输出重定向)详细分析 。它们就是与几个特殊文件描述符对应,fd0,fd1,fd2 (stdin,stdout,stderr)
如:
/dev/stdin指的就是键盘设备
/dev/null设备
是个黑洞设备,它丢弃一切写入其中数据,空设备通常被用于丢弃不需要的输出流。记得当年用windows时候,有个类似的设备:NUL ,跟这个功能一样。任何写入该设备数据都会被丢弃掉。从这个里面读取数据返回是空。将一些不用内容经常发送给这个设备,丢弃不需要的数据。
如:
/dev/zero设备
在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。
如:
在linux资源配额限制里面,如果没有现在普通用户的磁盘空间利用,或内存使用。一个普通用户就可以通过上面方法一会就塞满整个磁盘。也可以通过while(true) {fork……}类程序,启动无限线程,耗尽整个系统内存。
/dev/full设备
类Unix系统中,/dev/full(常满设备)是一个特殊设备文件,总是在向其写入时返回设备无剩余空间(错误码为ENOSPC),读取时则与/dev/zero相似,返回无限的空字符(NULL, ASCII NUL, 0x00)。这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为。
如:
/dev/random[urandom]
在类UNIX操作系统中,/dev/random是一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声。常用作随机数发生器。具体参考:linux shell实现随机数多种方法(date,random,uuid)
/dev/fd
记录用户打开的文件描述符
[chengmo@centos5 shell]$ ls /dev/fd/
0 1 2 3
详细参考:
linux shell数据重定向(输入重定向与输出重定向)详细分析 文件描述符介绍。
/dev/tcp[udp]/host/port
读取该类形式设备,将会创建一个连接host主机port端口的tcp[upd]连接。打开一个socket通讯接口。
详细使用可以参考:
linux shell 脚本实现tcp/upd协议通讯(重定向应用)
/dev/loop
在类UNIX操作系统中,Loop设备 可以把loop 文件,作为块设备挂载使用。
如:
[chengmo@centos5 shell]$mount -o loop example.img /home/chengmo/img
#将img镜像文件挂载到/home/chengmo/img目录下面,有了这个设备,我们不需要通过虚拟光驱就可以读虚拟磁盘格式的文件。
说了很多linux 特殊设备,其它象cpu,内存,磁盘,网络,键盘,终端设备。跟我们windows里面常见差不多。有什么问题,欢迎交流!
在日常的后台测试中,经常会在一些诸如dd等操作中用到一些系统的设备类型,如/dev/zero、/dev/null等,接下来我们就将对这些设备类型的具体含义以及其适用场景进行一个简单的介绍,以便于大家在今后的测试工作中可以更好的对其进行了解和使用。
1、/dev/null(可以理解为系统的垃圾桶)
把 /dev/null 看作"黑洞", 它非常等价于一个只写文件, 所有写入它的内容都会永远丢失。而尝试从它那儿读取内容则什么也读不到。然而, /dev/null 对命令行和脚本都非常的有用。
用法1:禁止标准输出
cat $filename > /dev/null
解析:文件内容丢失,而不会输出到标准输出。
用法2:禁止标准错误
rm $badname 2> /dev/null
解析:这样错误信息 [标准错误] 就被直接丢进垃圾桶了。
用法3:禁止标准输出和标准错误的输出
cat $filename 2> /dev/null > /dev/null
解析: 如果"$filename"不存在,将不会有任何错误信息提示;
如果"$filename"存在,文件的内容不会打印到标准输出;
因此Therefore, 上面的代码根本不会输出任何信息,当只想测试命令的退出码而不想有任何输出时非常有用。
用法4:自动清空某些文件内容
cat /dev/null > /var/log/wtmp
解析:自动清空日志文件的内容 (特别适合处理这些由商业Web站点发送的讨厌的"cookies")
--------------------------------------------------------------------------------
例:隐藏cookie而不再使用
if [ -f ~/.netscape/cookies ] # 如果存在则删除.
then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies # 现在所有的cookies都会丢入黑洞而不会保存在磁盘上了。
备注:
/dev/null ------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
2、/dev/zero(空文件)
像 /dev/null 一样,/dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见,而从/dev/zero读出一连串的null 也比较困难,虽然这也能通过od或一个十六进制编辑器来做到。/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。
例:dd一个20G大小的空间,不写入任何内容。
dd if=/dev/zero of=test.img bs=1G count=20
备注:
/dev/zero------该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
3、/dev/random以及/dev/urandom(linux系统中的随机数生成设备)
Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。
他们产生随机数的原理是利用 当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以 通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候, 而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。
这就是为什么会有/dev/urandom和/dev/random这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会 (ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择。/dev/random会阻塞当前的程序,直到根 据熵池产生新的随机字节之后才返回,所以使用/dev/random比使用/dev/urandom产生大量随机数的速度要慢。
举例:
[lxf@sg01 dd]$ dd if=/dev/random of=random.dat bs=1024b count=1
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0.000169 seconds, 757 kB/s
[lxf@sg01 dd]$ dd if=/dev/urandom of=random.dat bs=1024b count=1
1+0 records in
1+0 records out
524288 bytes (524 kB) copied, 0.091297 seconds, 5.7 MB/s
解析:
从上面的测试中,可以看到使用/dev/random产生随机数的速度很慢,而且产生的量很有限,当然,/dev/urandom的随机效果则好很多。
/dev/loop与设备文件系统
摘要:在进行测试的时候,我们往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方面。这种情况下,我们可以通过伪设备来实现循环挂载,从而达到目的。本文主要为你讲解什么是循环挂载,什么是虚拟设备,设备和文件系统有什么关系。
1.循环挂载
在类Unix系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
2.可用性
在各种操作系统中循环设备的命名存在着一些混乱。各种类Unix操作系统中,功能性的循环设备被以不同的名字命名。
在Linux中,设备名按照相应设备驱动程序的符号表项进行命名。这些设备被叫做”loop“设备,设备节点通常命名为/dev/loop0, /dev/loop1之类。 静态设备目录可以用makedev脚本创建,或者动态地由设备文件系统(udev)设施创建。 循环设备的管理界面是 losetup,这是util-linux软件包的一部分。
有时,循环设备被错误地认为是回环设备,但是这个术语在Linux内核中是为网络设备保留的(参见回环设备)。循环设备的概念和回环设备不同,虽然在名字上有相似的地方。
在NetBSD和OpenBSD等BSD所派生的系统中,循环设备被称为“虚拟节点设备”或“vnd”,并且设备被置于 /dev/vnd0, /dev/rvnd0 或/dev/svnd0等处。在文件系统中,使用vnconfig程序来进行配置。
FreeBSD在发行版5之前和其他BSD系统一样遵守约定,之后循环设备便被纳入记忆磁盘设备("md")。目前使用mdconfig[1]程序进行配置。
在Solaris/OpenSolaris中,循环设备被称为 "回环文件接口" 或 lofi,[2] 位于 /dev/lofi/1等处。SunOS 拥有 lofiadm 配置程序。"lofi"驱动程序支持只读压缩和可读写的加密。 自从1988年夏季开始更有SunOS/Solaris平台的第三方驱动 "fbk"[3] (文件模拟块设备,英文:File emulates Blockdevice)
Mac OS X实现了一个本地的镜像挂载机制并作为其随机访问磁盘设备的抽象。这些设备如同普通设备一样出现在 /dev 中,读写操作被送往一个用户模式的辅助进程,并由辅助进程负责读取和写入的操作。在用户界面中当打开磁盘镜像的时候自动被启用。这可以处理多种格式的盘片、CD-ROM 或 DVD 镜像。
在Microsoft Windows操作系统上并不能原生支持循环挂载(直到Windows 7,这个功能才被原生实现,并通过工具diskpart进行工作)。 [4] 然而,这项能力经常通过第三方程序得以实现,例如Daemon Tools 和 Alcohol 120% VMware的免费工具以及LTR Data (ImDisk)都可以实现类似的功能
3.实例
在目录上挂载包含文件系统的文件一般需要两步:
- 用一个循环设备节点连接文件。
- 在目录上挂载该循环设备
这两个操作既可以用两条命令来完成,也可以通过加上特殊的挂载符号的挂载命令来完成。第一个操作可以通过如Linux平台下的losetup[5]或者是SunOS上的lofiadm[6]命令完成。
例如,如果 example.img 是一个包含文件系统的常规文件,并且 /home/you/dir 是 Linux用户的目录,超级用户(root)或许可以通过执行如下的命令来将文件挂载在目录上:
losetup /dev/loop0 example.img mount /dev/loop0 /home/you/dir
其中第二条命令将设备挂载于目录 /home/you/dir。执行上述语句的效果便是文件被作为文件系统挂载,文件的内容出现在被挂载的目录中(以被挂载的目录作为根目录)。
此外 mount 工具常常可以胜任整个挂载的程序:
mount -o loop example.img /home/you/dir
之后设备便能用下列命令实现卸载:
umount /home/you/dir # 或者通过诸如 mount | grep "/home/you/dir" # 或是 losetup -a | grep example.img 的查找找到与文件相关联的loop设备号码 # 并执行下列命令:(代表设备号) umount /dev/loop
在较底层的应用程序接口中,文件的关联与解除关联通过在循环设备上的ioctl 系统调用来实现。
4.设备文件
在类Unix操作系统中,设备文件系统允许软件通过标准输入输出系统调用与驱动程序交互,从而简化了许多任务。
设备文件系统包括设备文件、设备节点、设备特定文件,它们是驱动程序的接口,而在文件系统中,它们就像是普通文件。
5.设备
5.1块设备
块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘、CD-ROM和内存区域。
块设备通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。
5.2字符设备
字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器之类设备提供流通信服务,它通常不支持随机存取数据。
字符设备在实现时,大多不使用缓存器。系统直接从设备读取/写入每一个字符。
5.3伪设备
在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份經常使用到的偽設備包括:
/dev/null 接受和丟棄所有輸入;即不產生任何輸出。 /dev/full 永遠在被填滿狀態的設備。 /dev/loop Loop設備 /dev/zero 產生連續的NUL字元的串流(數值為0)。 /dev/random 產生一個虛假隨機的任意長度字元串流。(Blocking) /dev/urandom 產生一個虛假隨機的任意長度字元串流。(Non-Blocking)
6.两个相关的linux命令
6.1dd命令
dd - convert and copy a file
bs=BYTES
read and write up to BYTES bytes at a time
if:inputfile
of:outputfile
6.2losetup命令
losetup - set up and control loop devices
Delete loop:
losetup -d loopdev...
Print name of first unused loop device:
losetup -f