1、概论 -- 来自维基的解释

/dev/null  :

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

/dev/zero  :

在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD就是通过mmap把/dev/zero映射到虚地址空间实现共享内存的。可以使用mmap将/dev/zero映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。(引自:/dev/zero - 维基百科)

以下是 摘取天上星 个人的谬解,高手略过:

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

2、 /dev/null 的日常使用

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

我们都知道  cat $filename  会输出filename对应的文件内容(输出到标准输出)
而使用         cat $filename >/dev/null 
则不会得到任何信息,因为我们将本来该通过标准输出显示的文件信息重定向到了 /dev/null 中,so what will you get ?
使用  cat $filename 1>/dev/null 也会得到同样的效果,因为默认重定向的 1 就是标准输出。  如果你对 shell 脚本或者重定向比较熟悉的话,应该会联想到 2 ,也即标准错误输出。
我们使用 cat $filename  时如果filename对应的文件不存在,系统肯定会报错: “ cat: filename: 没有那个文件或目录 ” 。

如果我们不想看到错误输出呢?我们可以禁止标准错误:   cat $badname 2>/dev/null

我们可以通过下面这个测试来更加深刻的理解/dev/null :

$cat test.txt 
just for test
$cat test.txt >/dev/null 
$cat test.txt 1>/dev/null 
$cat test2.txt 
cat: test2.txt: 没有那个文件或目录
$cat test2.txt >/dev/null 
cat: test2.txt: 没有那个文件或目录
$cat test2.txt 2>/dev/null 
$

有些时候,我并不想看道任何输出,我只想看到这条命令运行是不是正常,那么我们可以同时禁止标准输出和标准错误的输出:

cat $filename 2>/dev/null >/dev/null

所以:

* 如果"$filename"不存在,将不会有任何错误信息提示,
* 如果"$filename"存在, 文件的内容不会打印到标准输出。
* 因此, 上面的代码根本不会输出任何信息,当只想测试命令的退出码而不想有任何输出时非常有用。

下一步,我们使用 echo $? 查看上条命令的退出码:0为命令正常执行,1-255为有出错。
当然,使用   cat $filename &>/dev/null   也可以达到  cat $filename 2>/dev/null >/dev/null 一样的效果。

$cat test2.txt 2>/dev/null 
$cat test.txt 2>/dev/null >/dev/null 
$echo $?
0
$cat test2.txt 2>/dev/null >/dev/null 
$echo $?
1
$cat test.txt &>/dev/null
$echo $?
0

有时候,我们需要删除一些文件的内容而不删除文件本身:(这个方法可以用来删除日志文件,在我的Debian笔记本上我给 /var 盘配的空间有些过小,有时候就需要手动使用这个操作来清空日志)

# cat /dev/null > /var/log/messages
 # : > /var/log/messages   有同样的效果,但不会产生新的进程。(因为:是内建的)
 
下面的实例中,使用/dev/null 来删除cookie 并且不再使用cookie
  if [ -f ~/.netscape/cookies ]       # 如果存在则删除,删除后才可以添加软链接
then
  rm -f ~/.netscape/cookies
fi

ln -s /dev/null ~/.netscape/cookies

其中,cookies的目录是可以变换的,比如说我自己电脑上的firefox的cookie目录为: ~/.mozilla/firefox/nah4b6di.default/cookies*

3、/dev/zero 的日常使用
像/dev/null一样,/dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件。

比如说,在我的前一篇博客中(《尝试安装Chrome OS的新版本 Vanilla & 安装之后U盘遇到的问题解决》),提到我使用dd 制作的U盘系统,而我的U盘有16G,而制作好后,系统盘只占了2.5G,而其他的空间(将近12G)都无发使用。我只能使用  dd if=/dev/zero of=/dev/sdb bs=4M 来重新给我整个U盘清零。

脚本实例 1. 用/dev/zero创建一个交换临时文件
 #!/bin/bash
# 创建一个交换文件,参数为创建的块数量(不带参数则为默认),一块为1024B(1K)

ROOT_UID=0         # Root 用户的 $UID 是 0.
E_WRONG_USER=65    # 不是 root?

FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

# 这个脚本必须用root来运行,如果不是root作出提示并退出
if [ "$UID" -ne "$ROOT_UID" ]
then
  echo; echo "You must be root to run this script."; echo
  exit $E_WRONG_USER
fi 
blocks=${1:-$MINBLOCKS}          # 如果命令行没有指定,则设置为默认的40块.
# 上面这句等同如:
# ----------------------------------------
# if [ -n "$1" ]
# then
#   blocks=$1
# else
#   blocks=$MINBLOCKS
# fi
# -----------------------------------------

if [ "$blocks" -lt $MINBLOCKS ]
then
  blocks=$MINBLOCKS              # 最少要有 40 个块长,如果带入参数比40小,将块数仍设置成40
fi

echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.

mkswap $FILE $blocks             # 将此文件建为交换文件(或称交换分区).
swapon $FILE                     # 激活交换文件.

echo "Swap file created and activated."
exit $SUCCESS

运行效果我们可以看到:

[root@localhost zhaiqutianshangxing/tmp]$ vim testswap.sh
[root@localhost zhaiqutianshangxing/tmp]$ chmod +x testswap.sh    
[root@localhost zhaiqutianshangxing/tmp]$ sudo ./testswap.sh 
[sudo] password for zhaiqutianshangxing:  
[root@localhost zhaiqutianshangxing/tmp]$ ./testswap.sh

You must be root to run this script.

[root@localhost zhaiqutianshangxing/tmp]$ sudo ./testswap.sh           
[sudo] password for zhaiqutianshangxing:     
Creating swap file of size 40 blocks (KB).
记录了40+0 的读入
记录了40+0 的写出
40960字节(41 kB)已复制,0.000904021 秒,45.3 MB/秒
正在设置交换空间版本 1,大小 = 36 KiB
无标签, UUID=3e59eddf-098f-454d-9507-aba55f434a8c
Swap file created and activated.

关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件,如挂载一个文件系统到环回设备 (loopback device) 或"安全地" 删除一个文件。
脚本实例2. 创建ramdisk
 #!/bin/bash
# ramdisk.sh
# "ramdisk"是系统RAM内存的一段,它可以被当成是一个文件系统来操作.
# 优点:存取速度非常快 (包括读和写).
# 缺点: 易失性, 当计算机重启或关机时会丢失数据.
# 会减少系统可用的RAM.
#
# 那么ramdisk有什么作用呢?
# 保存一个较大的数据集在ramdisk, 比如一张表或字典,这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.

E_NON_ROOT_USER=70             # 必须用root来运行.
ROOTUSER_NAME=root

MOUNTPT=/mnt/ramdisk
SIZE=2000                      # 2K 个块 (可以合适的做修改)
BLOCKSIZE=1024                 # 每块有1K (1024 byte) 的大小
DEVICE=/dev/ram0               # 第一个 ram 设备

username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
  echo "Must be root to run ""`basename $0`""."
  exit $E_NON_ROOT_USER
fi

if [ ! -d "$MOUNTPT" ]         # 测试挂载点是否已经存在了,
then                           #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
  mkdir $MOUNTPT               #+ 因为前面已经建立了.
fi

dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # 把RAM设备的内容用零填充.
                                                      # 为何需要这么做?
mke2fs $DEVICE                 # 在RAM设备上创建一个ext2文件系统.
mount $DEVICE $MOUNTPT         # 挂载设备.
chmod 777 $MOUNTPT             # 使普通用户也可以存取这个ramdisk,但是, 只能由root来缷载它.

echo """$MOUNTPT"" now available for use."
# 现在 ramdisk 即使普通用户也可以用来存取文件了.
# 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
#
# 重启之后, 运行这个脚本再次建立起一个 ramdisk.
# 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.

# 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,以使系统启动时能自动设立一个ramdisk。这样很合适速度要求高的数据库服务器.
exit 0
运行起来效果如下:

[root@localhost zhaiqutianshangxing/tmp]$ vim ramdisk.sh
[root@localhost zhaiqutianshangxing/tmp]$ chmod +x ramdisk.sh
[root@localhost zhaiqutianshangxing/tmp]$ ./ramdisk.sh
Must be root to run ramdisk.sh.
[root@localhost zhaiqutianshangxing/tmp]$ sudo ./ramdisk.sh
记录了2000+0 的读入
记录了2000+0 的写出
2048000字节(2.0 MB)已复制,0.0113732 秒,180 MB/秒
mke2fs 1.42.8 (20-Jun-2013)
Discarding device blocks: 完成
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16384 inodes, 65536 blocks
3276 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=67108864
8 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345

Allocating group tables: 完成
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成
/mnt/ramdisk now available for use.
最后值得一提的是,ELF二进制文件利用了/dev/zero。

今天测试磁盘IO的时候执行命令,突然发现/dev/zero文件莫名奇妙的丢失了,提示找不到文件,错误提示如下:
摘取天上星,一个热爱互联网艺术的人!Email:happy.yin@qq.com
[root@localhost zhaiqutianshangxing]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
dd: 正在打开"/dev/zero": 没有那个文件或目录

误删/dev/zero文件的解决方法如下两条命令进行修复重建文件:

[root@localhost zhaiqutianshangxing]# mknod /dev/zero c 1 5
[root@localhost zhaiqutianshangxing]# chmod 666 /dev/zero
修复完成后用命令测试下是否可用,发现已经可以正常使用磁盘测试了
[root@localhost sq808sq]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
记录了4096+0 的读入
记录了4096+0 的写出
268435456字节(268 MB)已复制,105.086 秒,2.6 MB/秒
至此,/dev/zero 文件的修复重建工作已经完成 (该文件为系统特殊文件丢失后不能从系统盘或其他系统直接复制使用,只能通过重建修复,下文的/dev/null文件也是如此)

误删/dev/null文件的解决方法如下:

[root@localhost zhaiqutianshangxing]# mknod /dev/null c 1 3
[root@localhost zhaiqutianshangxing]# chmod 666 /dev/null
然后执行命令查看/dev/null 文件,如下所示,已经成功修复/dev/null文件
[root@localhost zhaiqutianshangxing]# ls -la /dev/null
crw-rw-rw-. 1 root root 1, 3 12月 12 13:13 /dev/null

利用/dev/zero测试磁盘IO:

[root@localhost zhaiqutianshangxing]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
记录了4096+0 的读入
记录了4096+0 的写出
268435456字节(268 MB)已复制,104.896 秒,2.6 MB/秒
[root@localhost zhaiqutianshangxing]# dd if=/dev/zero of=test bs=8k count=256k conv=fdatasync
记录了262144+0 的读入
记录了262144+0 的写出
2147483648字节(2.1 GB)已复制,28.9346 秒,74.2 MB/秒

更为详细的/dev/zero磁盘IO测试说明:

正常测试的时候可能不止测试一边,可能会需要很多遍求取平均值,这个测试结果在普通的重定向是没有效果的 之后 google 了一下 用下面的方式重定向到一个文件

dd if=/dev/zero of=/var/test bs=8k count=1000000  2>> info

这样测试的结果就到info文件里面了

1. dd if=/dev/zero of=test bs=64k count=16k
  这个很不准确的,因为命令结束的时候数据还没有真正写到磁盘上去

  2. dd if=/dev/zero of=test bs=64k count=16k conv=fsync
  这个还算准确,数据已经写入磁盘

  3. dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
  这个可以当成是模拟数据库插入操作,所以很慢

  接着让我们来看看VPS磁盘性能
  dd if=/dev/zero of=test bs=64k count=16k
  1073741824 bytes (1.1 GB) copied, 2.625317 seconds, 358 MB/s
  上面方法得到的结果看上去似乎很快
  dd if=/dev/zero of=test bs=64k count=16k conv=fsync
  1073741824 bytes (1.1 GB) copied, 12.5891 seconds, 77.1 MB/s
  执行有点慢,不过这次结果比较有参考价值
  dd if=/dev/zero of=test bs=64k count=2k oflag=dsync
  134217728 bytes (134 MB) copied, 176.151 seconds, 755 kB/s
  这个嘛,就是VPS的真正实力,在84的vps上测可是有20M/s

-dsync 可以当成是模拟数据库插入操作,在/dev/zone中读出一条数据就立即写入硬盘
      -fsync 同样也是将数据已经写入磁盘,但是是在经过缓存后最后再写入硬盘

以下几种方式测试磁盘读写速度的区别?
dd bs=1M count=128 if=/dev/zero of=test
dd bs=1M count=128 if=/dev/zero of=test; sync
dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
dd bs=1M count=128 if=/dev/zero of=test oflag=dsync
区别在于内存中写缓存的处理方式。
dd bs=1M count=128 if=/dev/zero of=test
没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,先不要偷着乐。呵呵
dd bs=1M count=128 if=/dev/zero of=test; sync
和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。
dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际的。
dd bs=1M count=128 if=/dev/zero of=test oflag=dsync
加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取1M后就要先把这1M写入磁盘,然后再读取下面这1M,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。
建议使用 dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。

摘取天上星,一个热爱互联网艺术的人!Email:happy.yin@qq.com

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

  1. win7下计划任务schtasks使用详解及错误:无法加载列资源的解决方法1

    win7下计划任务schtasks使用详解及"错误:无法加载列资源"的解决方法1 2011-12-10 20:33 schtasks 命令简述: 安排命令和程序,使其定期运行或在指 ...

  2. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  3. linux启动sql server数据库,SQL Server数据库启动过程详解及启动不起来的问题分析及解决方法...

    第五步.启动系统数据库model model系统数据库同样也是SQL Server启动过程中用到的一个非常关键的数据库,如果这个库损坏,SQL Server启动也会失败,关于model数据不能启动的原 ...

  4. python不是内部或外部命令的解决方法_详解python常见报错--NO MODULE NAMED _SQLITE3解决方法...

    概述 在安装一些基于python的程序时,经常遇到"ImportError: No module named _sqlite3"问题. 下面记录下解决方法. 解决办法 1.编译sq ...

  5. 计算机配置不到百分之百,详解电脑固态硬盘使用率经常出现百分百的解决方法...

    电脑固态硬盘使用率百分百 为了让电脑能够得到更快的处理速度与文件的传输效率,很多用户会选择给自己的电脑配置一块固态硬盘.而近期有用户向小编反馈自己的电脑在安装固态硬盘后,电脑的磁盘使用率经常出现100 ...

  6. 安装了pygame、但是在python无法导入_详解有关PyCharm安装库失败的问题的解决方法...

    最近因为要使用Python的缘故,安装了python IDE+pycharm,如此安装的原因是因为Pycharn 并不像anaconda一样拥有相对完整的依赖库和开发包,可以直接运行python,但因 ...

  7. Windows10下VS2015下载安装详解【附“安装包丢失或损坏“ 错误解决方法】

    目录 一.VS2015安装包下载 二.VS2015安装 1.解压双击安装 2.选择安装位置,并自定义安装 3.安装过程解决 "安装包丢失或损坏" 错误 原创的呀

  8. oracle控制文件都一样么,Oracle控制文件详解

    一.Oracle控制文件 为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 ...

  9. SpringBoot多环境(dev、test、prod)配置详解

    SpringBoot多环境(dev.test.prod)配置详解 我们在开发应用的时候,通常同一套程序会被应用和安装到几个不同的环境中,比如开发.测试.生产等.其中每个环境的数据库地址.服务器端口等配 ...

最新文章

  1. 用python解“用天平找小球”题
  2. PHP 利用 curl 发送 post get del put patch 请求
  3. OpenCV中的模板匹配/Filter2d
  4. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  5. 数据结构与算法分析-第一章Java类(02)
  6. 信息学奥赛一本通 1413:确定进制 | OpenJudge NOI 1.13 34:确定进制 | OpenJudge NOI 2.1 1973:确定进制
  7. 微商分销代理商城源码-代理等级和升级条件
  8. 位运算之左移右移运算之详解
  9. 计算机编程输入3个数排序,汇编语言 输入10个数排序并输出的实现
  10. JQ简单二级导航,加子导航栏
  11. 6.高性能MySQL --- 查询性能优化(2)
  12. mysql导入GP_GP数据库gpload数据导入详细操作
  13. OverFeat,分类、定位、检测
  14. 【ZOJ2750】Idiomatic Phrases Game(最短路)
  15. keil cannot reset target shutting 新解决办法
  16. 【CSDN AI周刊】第16期 | 黄仁勋怒怼TPU 龙之队惜败冷扑大师
  17. 18年美亚杯团体赛内存部分
  18. 2022年废纸价格预测
  19. php——webshell变形总结
  20. 知网论文免费下载,请速度存好!

热门文章

  1. 《白鹿原》读后感(推荐大家细细阅读)
  2. Django MTV
  3. 研究生答辩注意事项及技巧
  4. 如何复制EXE电子书中的文字
  5. IDEA 显示Detects duplicates in source code警告去除办法
  6. 数字签名显示加密服务器显示错误,测试数字签名和加密
  7. 日历android实训报告,EAD万年历实训报告及Verilog HDL源码
  8. 详细介绍 Apache Licence 2.0 协议
  9. 华为服务器网卡激活配置文件,客户端服务器网络配置文件
  10. 文科生的反击——新书《你能做任何工作:“无用”的自由技艺的惊人力量》解读