dd指令使用
语法格式dd [option] dd指令选项详解if=file:输入文件名,缺省为标准输入
of=file:输出文件名,缺省为标准输出
ibs=bytes:一次读入 bytes 个字节(即一个块大小为 bytes 个字节)obs=bytes:一次写 bytes 个字节(即一个块大小为 bytes 个字节)bs=bytes:同时设置读写块的大小为 bytes ,可代替 ibs 和 obscbs=bytes:一次转换 bytes 个字节,即转换缓冲区大小skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数conv=ASCII:把EBCDIC码转换为ASCIl码。 conv=ebcdic:把ASCIl码转换为EBCDIC码。 conv=ibm:把ASCIl码转换为alternate EBCDIC码。 conv=block:把变动位转换成固定字符。 conv=ublock:把固定位转换成变动位。 conv=ucase:把字母由小写转换为大写。 conv=lcase:把字母由大写转换为小写。 conv=notrunc:不截短输出文件。 conv=swab:交换每一对输入字节。 conv=noerror:出错时不停止处理。 conv=sync:把每个输入记录的大小都调到ibs的大小(用NUL填充)。iflag=FLAGS:指定读的方式FLAGS,参见“FLAGS参数说明”
oflag=FLAGS:指定写的方式FLAGS,参见“FLAGS参数说明”FLAGS参数说明:append -append mode (makes sense only for output; conv=notrunc sug-gested)direct:读写数据采用直接IO方式;directory:读写失败除非是directory;dsync:读写数据采用同步IO;sync:同上,但是针对是元数据fullblock:堆积满block(accumulate full blocks of input )(iflag only);nonblock:读写数据采用非阻塞IO方式noatime:读写数据不更新访问时间 注意:指定数字的地方若以下列字符结尾乘以相应的数字:b=512, c=1, k=1024, w=2, xm=number m,kB=1000,K=1024,MB=1000*1000,M=1024*1024,GB=1000*1000*1000,G=1024*1024*1024 dd使用实例 假设了如下的情况:测试纯写入性能
dd if=/dev/zero of=test bs=8k count=10000 oflag=direct测试纯读取性能dd if=test of=/dev/null bs=8k count=10000 iflag=direct 要备份的数据文件:30720KBblock 0 =8 KB.raw offset 64 KB.设定 bs=8k1、从raw设备备份到raw设备dd if=/dev/rsd1b of=/dev/rsd2b bs=8k skip=8 seek=8 count=3841 2、裸设备到文件系统dd if=/dev/rsd1b of=/backup/df1.dbf bs=8k skip=8 count=3841 3、文件系统到裸设备dd if=/backup/df1.dbf of=/dev/rsd2b bs=8k seek=8 4、文件系统到文件系统,你可以为了提升I/O把bs设为较高的数值dd if=//dbs/df1.dbf of=/backup/df1.dbf bs=1024k 5、备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径(bzip2工具也一样可使用)dd if=/dev/hdx | gzip > /path/to/image.gz6、生成1G的虚拟块设备Sparse File(稀疏文件)
dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0Sparse File是什么,稀疏文件,也就是说,是一个拥有空的空间的文件,磁盘块将并没分配给这些文件。如果这些空的空间填满ASCII的NULL字符,那么文件才会是实际的大小。
7、拷贝光盘数据到backup文件夹下,并保存为cd.iso文件,再进行刻录dd if=/dev/cdrom of=/backup/cd.isocdrecord -v cd.iso 8、将内存里的数据拷贝到backup目录下的mem.bin文件dd if=/dev/mem of=/backup/mem.bin bs=1024 9、将软驱数据备份到当前目录的disk.img文件dd if=/dev/fd0 of=disk.img count=1 bs=1440k 10、将备份文件恢复到指定盘dd if=/backup/df1.dbf of=/dev/rsd1b 11、将压缩的备份文件恢复到指定盘gzip -dc /path/to/image.gz | dd of=/dev/hdx12、测试磁盘写能力
time dd if=/dev/zero of=/test.dbf bs=8k count=300000
因为/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。13、测试磁盘读能力time dd if=/dev/sdb1 of=/dev/null bs=8k 因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。14、测试同时读写能力time dd if=/dev/sdb1 of=/test1.dbf bs=8k 这个命令下,一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb1是读,对/test1.dbf是写),假设他们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力15、备份磁盘开始的512Byte大小的MBR信息到指定文件
dd if=/dev/hdx of=/path/to/image count=1 bs=512 16、恢复MBRdd if=/mnt/windows/linux.lnx of=/dev/hda bs=512 count=117、 得到最恰当的block size。 通过比较dd指令输出中所显示的命令执行时间(选时间最少的那个),即可确定系统最佳的block size大小
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.filedd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.filedd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.fileOracle数据库的dd备份
说明,以下实验操作系统版本为RHEL 5.4没有offset
Raw offset
在一些os上,在裸设备上的文件的开头是被os使用的。这些存储空间被叫做raw offset,Oracle不会备份和恢复这些内容(字节)。因此,备份的时候要跳过含有offset的字节。 目前只有AIX和Tru64系统的裸设备存在offset,详细信息如下UNIX OS Reserved Size------------ ----------------SUN Solaris 0HP-UX 0IBM AIX 4k Tru64 UNIX 64kLinux 0在 Aix环境中,如果是使用了原始VG,或者是Big VG,但是创建LV的时候没有指定-T O标签,创建出来的LV都带有4K保留空间,如果把这些LV作为裸设备使用,则需要注意这个4K的问题。如果是使用了Scalable-type VG,或者是使用Big VG,而且在创建VG的时候使用了-T O标签,则创建的LV没有4K保留空间,称为DS_LVZ类型的LV。
在AIX平台下,我们可以使用$ORACLE_HOME/bin路径下的dbfsize命令确认裸设备是否包含offset
下面是包含offset的裸设备#dbfsize /dev/rlv_data01_10gDatabase file: /dev/rlv_data01_10gDatabase file type:raw device Database file size: 1048448 8192 byte blocks 下面是不包含offset的裸设备#dbfsize /dev/rlv_data01_10gDatabase file: /dev/rlv_data01_10gDatabase file type:raw device without 4K starting offset Database file size: 1048448 8192 byte blocks block 0 在 每个oracle文件的开头,os系统放置了一个块叫做block 0。 这个块的大小和其所在数据文件的oracle块大小相同。 一般的oracle 代码不能识别这个块,但是这个块是包含在os上的文件大小里面的。就是说oracle认为datafile1大小为100块,但是os看来,datafile1大小为101块(100+block 0). 注意,利用dd备份时,需要包含block 0。因为block 0位于offset之后,而block 0是所有数据文件都需要的,无论它是基于裸备还是文件系统,且block 0的大小只与oracle的block size有关,所以,把block 0也dd出来是必要的,不需要skip数据文件的block 0。计算数据文件的占用的实际空间大小
实际的数据文件大小是在dba_data_files中的bytes + 1* blocksizeSQL> select file_name,bytes from dba_data_files;FILE_NAME BYTES BLOCKSIZE---------------------------------------- ---------- ----------/opt/oracle/oradata/test1/system01.dbf 360710144 8192 在操作系统查看文件大小:# ls -l system01.dbf-rw-r--r-- 1 oracle oinstall 360718336 Nov 15 11:53 system01.dbf 360718336 = 360710144 + 8192 (8192是数据文件所在表空间的blocksize)那么一个裸设备的数据文件最多可以是多大?这个和具体的操作系统和数据文件所在表空间的blocksize有关。假设裸设备的大小是r,操作系统裸设备的offset为f,数据文件所在表空间的blocksize是b,则数据文件的最大大小为:d=r – f – b*1 (1为block 0)如裸设备大小为1008k,offset为0,表空间的blocksize为4k,则在此裸设备的数据文件的最大大小为:d=1008-0-1*4=1004(k)实例测试
从裸设备到裸设备拷贝ORACLE数据文件 (如下测试是在上进行)
1、创建裸设备
# fdisk /dev/sdd
The number of cylinders for this disk is set to 25856.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)Command (m for help): nCommand action l logical (5 or over) p primary partition (1-4)lFirst cylinder (4201-4485, default 4201): Using default value 4201Last cylinder or +size or +sizeM or +sizeK (4201-4485, default 4485): +10MCommand (m for help): nCommand action l logical (5 or over) p primary partition (1-4)lFirst cylinder (4212-4485, default 4212): Using default value 4212Last cylinder or +size or +sizeM or +sizeK (4212-4485, default 4485): +20MCommand (m for help): nCommand action l logical (5 or over) p primary partition (1-4)lFirst cylinder (4232-4485, default 4232): Using default value 4232Last cylinder or +size or +sizeM or +sizeK (4232-4485, default 4485): +30MCommand (m for help): nCommand action l logical (5 or over) p primary partition (1-4)lFirst cylinder (4262-4485, default 4262): Using default value 4262Last cylinder or +size or +sizeM or +sizeK (4262-4485, default 4485): +40M
Command (m for help): p
Disk /dev/sdd: 27.1 GB, 27111981056 bytes64 heads, 32 sectors/track, 25856 cylindersUnits = cylinders of 2048 * 512 = 1048576 bytes Device Boot Start End Blocks Id System/dev/sdd1 1 3816 3907568 83 Linux/dev/sdd4 3817 4485 685056 5 Extended/dev/sdd5 3817 3912 98288 83 Linux/dev/sdd6 3913 4008 98288 83 Linux/dev/sdd7 4009 4104 98288 83 Linux/dev/sdd8 4105 4200 98288 83 Linux/dev/sdd9 4201 4211 11248 83 Linux/dev/sdd10 4212 4231 20464 83 Linux/dev/sdd11 4232 4261 30704 83 Linux/dev/sdd12 4262 4300 39920 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.The new table will be used at the next reboot.Syncing disks.# partprobe
# raw /dev/raw/raw3 /dev/sdd9
/dev/raw/raw3: bound to major 8, minor 57# raw /dev/raw/raw4 /dev/sdd10/dev/raw/raw4: bound to major 8, minor 58# raw /dev/raw/raw5 /dev/sdd11/dev/raw/raw5: bound to major 8, minor 59# raw /dev/raw/raw6 /dev/sdd12/dev/raw/raw6: bound to major 8, minor 602、基于裸设备创建表空间
SQL>create tablespace mytest datafile '/dev/raw/raw3' size 5m,'/dev/raw/raw6' size 10m;Tablespace created. 3、从小裸设备到大裸设备# dd if='/dev/raw/raw3' of='/dev/raw/raw4'22496+0 records in22496+0 records out11517952 bytes (12 MB) copied, 104.599 seconds, 110 kB/s 4、从大裸设备到小裸设备,但数据文件比小裸设备小# dd if='/dev/raw/raw6' of='/dev/raw/raw5' bs=1024k count=1212+0 records in12+0 records out12582912 bytes (13 MB) copied, 3.34273 seconds, 3.8 MB/s注意:这里bs*count要大于原裸设备上的数据文件尺寸
5、重启数据库至mount状态
SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 369098752 bytesFixed Size 1219472 bytesVariable Size 125830256 bytesDatabase Buffers 239075328 bytesRedo Buffers 2973696 bytesDatabase mounted. 6、重命名数据文件,并打开数据库SQL> alter database rename file '/dev/raw/raw3' to '/dev/raw/raw4';Database altered. SQL> alter database rename file '/dev/raw/raw6' to '/dev/raw/raw5';Database altered.SQL> alter database open;Database altered. 从这个测试可以看出:1、从小裸设备到大裸设备,只需把小裸设备的所有数据块dd到大裸设备即可2、 是否可以把大裸设备上的数据文件dd到小裸设备,取决于位于大裸设备上的数据文件尺寸(+block 0)是否比小裸设备小。如果数据文件小于小裸设备,则可以把数据文件从大裸设备dd到小裸设备上,在dd过程中不需要太准确计算原来数据文件的大小,只要 保证dd的总量大于数据文件并小于小裸设备的尺寸即可。3、如果数据文件大于小裸设备的尺寸,则肯定不能把它从大裸设备拷贝到小裸设备上4、 裸设备之间拷贝数据文件比裸设备到文件系统之间拷贝的优点在于:不需要精确计算要拷贝多少数据,只需要保证覆盖了数据文件+block 0即可;而从裸设备到文件系统拷贝数据文件时,必须准确计算出要拷贝的数据量(数据文件+block 0),dd多一点或者少一点都会报错。5、 如果有offset的话,在裸设备之间拷贝数据文件的时候都要考虑(skip、seek)从文件系统到裸设备拷贝ORACLE数据文件
继续上面的实验,首先要保证裸设备的大小要大于等于oracle数据文件大小+ block 0,如果裸设备需要offset的话,则要保证更大,然后直接用dd就可以。1、创建表空间,数据文件大小为5mSQL> create tablespace mytest1 datafile '/home/oracle/mytest1.dbf' size 5m;
Tablespace created.# ls -l /home/oracle/mytest1.dbf -rw-r----- 1 oracle oinstall 5251072 Dec 16 21:37 /home/oracle/mytest1.dbf2、dd文件到裸设备上# dd if='/dev/zero' of='/dev/raw/raw3' bs=1024k
dd: writing `/dev/raw/raw3': No space left on device11+0 records in10+0 records out11517952 bytes (12 MB) copied, 7.63555 seconds, 1.5 MB/s# dd if=/home/oracle/mytest1.dbf of=/dev/raw/raw310256+0 records in10256+0 records out5251072 bytes (5.3 MB) copied, 35.9816 seconds, 146 kB/s 注意:从文件系统到裸设备不用设置count 3、重命名数据文件,打开数据库SQL> alter database rename file '/home/oracle/mytest1.dbf' to '/dev/raw/raw3';Database altered.SQL> alter database open;Database altered 从裸设备到文件系统拷贝ORACLE数据文件这里不并不是所有情况都能把整个裸设备拷贝到文件中,要看裸设备是否有offset,如果有offset,则肯定不能全拷贝出来,需要使用skip参数跳过offset,以下演示没有offset的情况
1、在mytest1表空间上创建表,并填充数据,然后将整个裸设备备份到文件系统
SQL> create table test tablespace mytest1
2 as 3 select * from dba_users;Table created.#dd if='/dev/raw/raw3' of='/home/oracle/mytest2.dbf' bs=512k
21+1 records in21+1 records out11517952 bytes (12 MB) copied, 0.804403 seconds, 14.3 MB/s 2、重启数据库,并充命名数据文件SQL> shutdown immediate;
Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 369098752 bytesFixed Size 1219472 bytesVariable Size 134218864 bytesDatabase Buffers 230686720 bytesRedo Buffers 2973696 bytesDatabase mounted.SQL> alter database rename file '/dev/raw/raw3' to '/home/oracle/mytest2.dbf';Database altered.SQL> alter database open;alter database open*ERROR at line 1:ORA-01113: file 9 needs media recoveryORA-01110: data file 9: '/home/oracle/mytest2.dbf'可以看到数据库无法打开,这是因为裸设备已被数据文件使用部分的逻辑块与未使用部分的逻辑块大小不一致。这种情况下,只能拷贝裸设备中数据文件大小 + block 0部分。这里用到两个工具dbfsize 求出在裸设备或者文件系统上的oracle数据文件的大小,由oracle提供。blockdev 求出裸设备的大小,操作系统自带。要计算出要要拷贝的大小,否则报错,如:$ dbfsize /dev/raw/raw3Database file: /dev/raw/raw3Database file type: raw deviceDatabase file size: 640 8192 byte blocks$ blockdev --getsize /dev/raw/raw3
22496一般一个OS BLOCK大小是512字节,所以22496*512/1024/1024= 10.9(m) 就是裸设备的大小。
$ rm /home/oracle/mytest2.dbf
$ dd if='/dev/raw/raw3' of='/home/oracle/mytest2.dbf' bs=8k count=641 SQL> alter database open;Database altered原文链接:https://blog.csdn.net/liqiangyang/article/details/80734997
一、dd命令的解释
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2
参数注释:
1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
8. conv=conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
二、dd应用实例
1.将本地的/dev/hdb整盘备份到/dev/hdd
#dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
#dd if=/dev/hdb of=/root/image
3.将备份文件恢复到指定盘
#dd if=/root/image of=/dev/hdb
4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
#dd if=/dev/hdb | gzip > /root/image.gz
5.将压缩的备份文件恢复到指定盘
#gzip -dc /root/image.gz | dd of=/dev/hdb
6.备份与恢复MBR
备份磁盘开始的512个字节大小的MBR信息到指定文件:
#dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
恢复:
#dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分
7.备份软盘
#dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)
8.拷贝内存内容到硬盘
#dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
9.拷贝光盘内容到指定文件夹,并保存为cd.iso文件
#dd if=/dev/cdrom(hdc) of=/root/cd.iso
10.增加swap分区文件大小
第一步:创建一个大小为256M的文件:
#dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
#mkswap /swapfile
第三步:启用这个swap文件:
#swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
11.销毁磁盘数据
#dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
12.测试硬盘的读写速度
#dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
#dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
13.确定硬盘的最佳块大小:
#dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
#dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
#dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
#dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。
14.修复硬盘:
#dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda
当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据。并且这个过程是安全、高效的。
15.利用netcat远程备份
#dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda
#netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc
#netcat -l -p 1234 | bzip2 > partition.img
#netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2、gzip对数据进行压缩,并将备份文件保存在当前目录。
16.将一个大视频文件的第i个字节的值改成0x41(大写字母A的ASCII值)
#echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc
17.建立linux虚拟盘,用文件模拟磁盘
在进行linux的实验中,如果没有多余的硬盘来做测试。则可以在linux下使用文件来模拟磁盘,以供测试目的。
其模拟过程如下所示,摘录自《Oracle数据库核心技术与实务详解-教你如何成为Oracle 10g OCP》一书。
1)以root用户创建一个ASM磁盘所在的目录。
# mkdir –p /u01/asmdisks
2)通过dd命令创建6个400M大小的文件,每个文件代表一块磁盘。
[root@book u01]# cd asmdisks
[root@book asmdisks]# dd if=/dev/zero of=asm_disk1 bs=1024k count=400
[root@book asmdisks]# dd if=/dev/zero of=asm_disk2 bs=1024k count=400
[root@book asmdisks]# dd if=/dev/zero of=asm_disk3 bs=1024k count=400
[root@book asmdisks]# dd if=/dev/zero of=asm_disk4 bs=1024k count=400
[root@book asmdisks]# dd if=/dev/zero of=asm_disk5 bs=1024k count=400
[root@book asmdisks]# dd if=/dev/zero of=asm_disk6 bs=1024k count=400
3)将这些文件与裸设备关联。
[root@book asmdisks]# chmod 777 asm_disk*
[root@book asmdisks]# losetup /dev/loop1 asm_disk1
[root@book asmdisks]# losetup /dev/loop2 asm_disk2
[root@book asmdisks]# losetup /dev/loop3 asm_disk3
[root@book asmdisks]# losetup /dev/loop4 asm_disk4
[root@book asmdisks]# losetup /dev/loop5 asm_disk5
[root@book asmdisks]# losetup /dev/loop6 asm_disk6
注意:如果要删除通过dd模拟出的虚拟磁盘文件的话,直接删除模拟出的磁盘文件
(也就是asm_disk1、asm_disk2…asm_disk6)还不够,还必须执行losetup -d /dev/loopN,在这里N从1到6。否则,磁盘文件所占用的磁盘空间不能释放
三、/dev/null和/dev/zero的区别
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
/dev/null------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
#if=/dev/zero of=./test.txt bs=1k count=1
#ls –ltotal 4
-rw-r--r-- 1 oracle dba 1024 Jul 15 16:56 test.txt#find / -name access_log 2>/dev/null
3.1使用/dev/null
把/dev/null看作"黑洞", 它等价于一个只写文件,所有写入它的内容都会永远丢失.,而尝试从它那儿读取内容则什么也读不到。然而, /dev/null对命令行和脚本都非常的有用
禁止标准输出
#cat $filename >/dev/null
文件内容丢失,而不会输出到标准输出.
禁止标准错误
#rm $badname 2>/dev/null
这样错误信息[标准错误]就被丢到太平洋去了
禁止标准输出和标准错误的输出
#cat $filename 2>/dev/null >/dev/null
如果"filename"不存在,将不会有任何错误信息提示;如果"
filename"存在, 文件的内容不会打印到标准输出。
因此,上面的代码根本不会输出任何信息。当只想测试命令的退出码而不想有任何输出时非常有用。
#cat $filename &>/dev/null
这样其实也可以, 由 Baris Cicek 指出
自动清空日志文件的内容
Deleting contents of a file, but preserving the file itself, with all attendant permissions (from Example 2-1 and Example 2-3):
#cat /dev/null > /var/log/messages
# : > /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)#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都会丢入黑洞而不会保存在磁盘上了.
3.2使用/dev/zero
像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生的null的流(二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。 /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件
用/dev/zero创建一个交换临时文件
#!/bin/bash
# 创建一个交换文件.
ROOT_UID=0 # Root 用户的 $UID 是 0.
E_WRONG_USER=65 # 不是 root?
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
# 这个脚本必须用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 个块长.
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=FILEbs=
BLOCKSIZE count=$blocks # 把零写入文件.
mkswap FILE
blocks # 将此文件建为交换文件(或称交换分区).
swapon $FILE # 激活交换文件.
echo "Swap file created and activated."
exit $SUCCESS
关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 (loopback device)或"安全地" 删除一个文件
例子创建ramdisk
#!/bin/bash
# ramdisk.sh
# "ramdisk"是系统RAM内存的一段,
#+ 它可以被当成是一个文件系统来操作.
# 它的优点是存取速度非常快 (包括读和写).
# 缺点: 易失性, 当计算机重启或关机时会丢失数据.
#+ 会减少系统可用的RAM.
# 10 # 那么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=DEVICEcount=
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
原文链接:https://blog.csdn.net/weixin_42430824/article/details/81152575