dev/null和dev/zero区别 以及换回设备(loopback device)

转自:http://blog.chinaunix.net/uid-20729677-id-765105.html

dev/zero,是一个输入设备,你可你用它来初始化文件。

/dev/zero------该设备无穷尽地提供0(是ASCII 0
就是NULL),可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入NULL。

使用/dev/zero
像/dev/null一样, /dev/zero也是一个伪文件,
但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难,
虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.

例子2: 用/dev/zero创建一个交换临时文件

1 #!/bin/bash
   2 # 创建一个交换文件.
   3

   4 ROOT_UID=0         #
Root 用户的 $UID 是 0.
   5 E_WRONG_USER=65    # 不是
root?
   6
   7 FILE=/swap
   8
BLOCKSIZE=1024
   9 MINBLOCKS=40
10 SUCCESS=0
11
12

13 # 这个脚本必须用root来运行.
14 if [ "$UID" -ne "$ROOT_UID" ]
15
then
16   echo; echo "You must be root to run this script.";
echo
17   exit $E_WRONG_USER
18 fi
19  
20

21
blocks=${1:-$MINBLOCKS}          #
如果命令行没有指定,
22                                 
#+ 则设置为默认的40块.
23 # 上面这句等同如:
24 #
--------------------------------------------------
25 # if [ -n "$1" ]
26
# then
27 #   blocks=$1
28 # else
29 #  
blocks=$MINBLOCKS
30 # fi
31 #
--------------------------------------------------
32
33
34 if [
"$blocks" -lt $MINBLOCKS ]
35 then
36  
blocks=$MINBLOCKS             
# 最少要有 40 个块长.
37 fi
38
39
40 echo "Creating swap file of size
$blocks blocks (KB)."
41 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks
# 把零写入文件.
42
43 mkswap $FILE
$blocks            
# 将此文件建为交换文件(或称交换分区).
44 swapon
$FILE                    
# 激活交换文件.
45
46 echo "Swap file created and activated."
47
48 exit
$SUCCESS

关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 (loopback device)
(参考例子 13-8) 或"安全地" 删除一个文件(参考例子 12-55).

例子3. 创建ramdisk

1 #!/bin/bash
   2 # ramdisk.sh
   3

   4 # "ramdisk"是系统RAM内存的一段,
   5 #+
它可以被当成是一个文件系统来操作.
   6 # 它的优点是存取速度非常快 (包括读和写).
   7 #
缺点: 易失性, 当计算机重启或关机时会丢失数据.
   8
#+       会减少系统可用的RAM.
   9 #
10 #
那么ramdisk有什么作用呢?
11 # 保存一个较大的数据集在ramdisk, 比如一张表或字典,
12 #+ 这样可以加速数据查询,
因为在内存里查找比在磁盘里查找快得多.
13
14
15
E_NON_ROOT_USER=70            
# 必须用root来运行.
16 ROOTUSER_NAME=root
17
18 MOUNTPT=/mnt/ramdisk
19
SIZE=2000                     
# 2K 个块 (可以合适的做修改)
20
BLOCKSIZE=1024                
# 每块有1K (1024 byte) 的大小
21
DEVICE=/dev/ram0              
# 第一个 ram 设备
22
23 username=`id -nu`
24 if [ "$username" !=
"$ROOTUSER_NAME" ]
25 then
26   echo "Must be root to run
""`basename $0`""."
27   exit $E_NON_ROOT_USER
28 fi
29

30 if [ ! -d "$MOUNTPT" ]         #
测试挂载点是否已经存在了,
31
then                          
#+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
32   mkdir
$MOUNTPT              
#+ 因为前面已经建立了.
33 fi
34
35 dd if=/dev/zero of=$DEVICE count=$SIZE
bs=$BLOCKSIZE #
把RAM设备的内容用零填充.
36                                                      
# 为何需要这么做?
37 mke2fs
$DEVICE                
# 在RAM设备上创建一个ext2文件系统.
38 mount $DEVICE
$MOUNTPT         # 挂载设备.
39 chmod 777
$MOUNTPT            
#
使普通用户也可以存取这个ramdisk.
40                               
# 但是, 只能由root来缷载它.
41
42 echo """$MOUNTPT"" now available for use."
43
# 现在 ramdisk 即使普通用户也可以用来存取文件了.
44
45 # 注意, ramdisk是易失的,
所以当计算机系统重启或关机时ramdisk里的内容会消失.
46 #
47 # 拷贝所有你想保存文件到一个常规的磁盘目录下.
48

49 # 重启之后, 运行这个脚本再次建立起一个 ramdisk.
50 # 仅重新加载 /mnt/ramdisk
而没有其他的步骤将不会正确工作.
51
52 # 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,
53 #+
以使系统启动时能自动设立一个ramdisk.
54 # 这样很合适速度要求高的数据库服务器.
55
56 exit 0

/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!

/dev/null------它是空设备,也称为位桶(bit
bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

使用/dev/null
把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失.
而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

禁止标准输出.    cat $filename
>/dev/null            
   --文件内容丢失,而不会输出到标准输出.

禁止标准错误   rm $badname
2>/dev/null             
--这样错误信息[标准错误]就被丢到太平洋去了.

禁止标准输出和标准错误的输出.    1 cat $filename 2>/dev/null
>/dev/null
   --如果"$filename"不存在,将不会有任何错误信息提示.
  
-- 如果"$filename"存在, 文件的内容不会打印到标准输出.
--因此Therefore,
上面的代码根本不会输出任何信息.
   --当只想测试命令的退出码而不想有任何输出时非常有用。

Deleting contents of a file, but preserving the file itself, with all
attendant permissions :

cat /dev/null > /var/log/messages      
--> /var/log/messages   有同样的效果, 但不会产生新的进程.
cat /dev/null >
/var/log/wtmp     -- 自动清空日志文件的内容
(适合处理由Web站点发送的讨厌的"cookies")

例子1:隐藏cookie而不再使用

1 if [ -f ~/.netscape/cookies ] # 如果存在则删除.
   2
then
   3   rm -f ~/.netscape/cookies
   4
fi
   5
   6 ln -s /dev/null
~/.netscape/cookies
   --现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.

环回设备 (loopback device)

Linux内核用结构体struct
net_device表示一个网络设备接口,该结构体的成员hard_start_xmit是个函数指针,用于完成数据报在网络上的发送工作,其原型是:
    int (*hard_start_xmit)(
struct sk_buff *skb, struct net_device *dev );

   
skb是待发送的数据缓冲区,dev是该网络设备接口本身的一个指针。
    环回设备接口由于是把数据报发给本机,所以其发送数据报函数比较特别,他把skb稍加处理后,又转回给协议栈的数据报接收函数netif_rx。其发送函数的函数名是loopback_xmit。

首先,loopback_xmit调用skb_orphan把skb孤立,使他跟发送socket和协议栈不再有任何联系,也即对本机来说,这个skb的数据内容已发送出去了,而skb相当于已被释放掉了。skb_orphan所做的实际事情是,首先从skb->sk(发送这个skb的那个socket)的sk_wmem_alloc减去skb->truesize,也即从socket的已提交发送队列的字节数中减去这个skb,表示这个skb已发送出去了,同时,假如有进程在这个socket上写等待,则唤醒这些进程继续发送数据报,然后把socket的引用计数减1,最后,令sk->destructor和skb->sk都为NULL,使skb完全孤立。实际上,对于环回设备接口来说,数据的发送工作至此已全部完成,接下来,只要把这个实际上还未被释放的skb传回给协议栈的接收函数即可。
 
  在传回去之前,还需要做一些工作,因为协议栈在发送数据报时,为数据报打以太网首部时,skb->data是指向以太网首部的开始位置的,网络设备接口传回的数据报是需要已剥离了以太网首部的,所以令skb->data加上ETH_HLEN(14),令skb->mac.raw指向原来data的位置,即以太网首部。然后,需要确定skb->pkt_type的值,即该数据报的类型,假如以太网首部中的目的mac地址是个组播或广播地址,则skb->pkt_type为PACKET_BROADCAST或PACKET_MULTICAST,关于MAC地址类型的判断方法以后再周详分析。否则,假如目的mac地址不等于本接口设备的mac地址,则skb->pkt_type为PACKET_OTHERHOST,否则就为默认值PACKET_HOST。最后,配置skb->protocol(ETH_P_IP,ETH_P_ARP或其他),配置skb->dev,再更新一下统计值,把skb交回给协议协栈即可。
    struct net_device更有一些跟协议栈的处理流程关系比较密切的成员函数,下面一一介绍。
    hard_header,该成员被以太网设备驱动程式用于为每一个待发送数据报构建以太网首部,系统中任何以太网设备驱动程式共享一个函数即eth_header。任何数据报在传递给该函数之前,其skb头部预留了以太网首部的空间,data成员指向网络层首部,eth_header将data成员指向以太网首部,并为以太网首部填入目的以太网地址,源以太网地址和网络层协议类型(ETH_P_IP或ETH_P_ARP),该函数在协议栈中主要有两处被用到,一是ARP模块中,发送ARP请求或应答前,构建以太网首部用;另一处是在IP数据发送过程中,构建以太网首部用。
    hard_header_cache,用于创建以太网首部的高速缓冲,每一个邻居节点都有一个struct
hh_cache
*hh成员,用于缓冲该邻居节点的以太网首部,有了这个缓冲,以后再向这个邻居发数IP数据的时候,不必再调用hard_header构建以太网首部,而是直接从hh中拷贝即可。

dev/null和dev/zero区别 以及换回设备(loopback device),布布扣,bubuko.com

时间: 2024-08-08 05:38:12

dev/null和dev/zero区别 以及换回设备(loopback device)的相关文章

Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别

默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入).标准输出(输出到屏幕).标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 .那么我们来看看下面的几种重定向方法的区别: >/dev/null 2>&1  //  实际上,应该等同于这样: 1>/dev/null 2>/dev/null ,默认情况下就是1,标准输出,所以一般都省略. 而&符号,后面接的是必须的文件描述符.不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,

Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别

默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入).标准输出(输出到屏幕).标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 .那么我们来看看下面的几种重定向方法的区别: >/dev/null 2>&1  //  实际上,应该等同于这样: 1>/dev/null 2>/dev/null ,默认情况下就是1,标准输出,所以一般都省略. 而&符号,后面接的是必须的文件描述符.不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,

/dev/null与/dev/zero区别

/dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件.该设备无穷尽地提供0,可以使用任何你需要的数目--设备提供的要多的多.他可以用于向设备或文件写入字符串0. /dev/null--它是空设备,也称为位桶(bit bucket).任何写入它的输出都会被抛弃.如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶. if=/dev/zero of=./

特殊文件: /dev/null和/dev/tty

转自:http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做.如果你需要的是命令的退出状态,而非它的输出,此功能会非常有用,见如下Shell代码:    /> vi test

Linux系统中有关/dev/null和/dev/zero文件说明及实践

Linux系统中有关/dev/null和/dev/zero文件说明 提示:这个题目完全可以作为一个面试题考考运维的应聘者: 面试题:请解释Linux中/dev/null和/dev/zero两个文件的作用和区别. 在类Unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备被称之为伪设备.操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/dev/urandom./dev/tty等. 先检查下/dev/null和/dev/zer

关于/dev/null 和 /dev/zero文件详解以及误删/dev/null和/dev/zero的解决方法和利用/dev/zero进行磁盘IO测试方法

1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole).空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件.这些操作通常由重定向完成. /dev/zero  : 在类UNIX 操作系统中, /dev/zero 是

Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole).空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件.当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00). 其中的一个典型用法

2>&1 >/dev/null & 与/dev/null 2>&1含义

/dev/null 代表空设备文件 > 代表重定向到哪里,例如:echo "123" > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到

辛星解读/dev/null和/dev/zero

在类Unix系统中,/dev/null称为空设备,它是一个特殊的设备文件,它丢弃一切写入其中的数据,不过他会报告写入成功,读取它的话会立即得到一个EOF.在程序员行话中,尤其是Unix行话中,/dev/null被称为位桶,也就是bit   bucket,也可以称之为黑洞,即black  hole.这个空设备通常被用于丢弃不需要的输出流,或者作为用于输入流的空文件.这些操作通常由重定向完成. 当我们使用cat  $filename 的时候,如果对应的文件不存在,那么系统会产生错误信息,我们就可以禁