dd指令使用
語法格式
dd [option]
dd指令選項詳解
if=file:輸入文件名,缺省為標准輸入
of=file:輸出文件名,缺省為標准輸出
ibs=bytes:一次讀入 bytes 個字節(即一個塊大小為 bytes 個字節)
obs=bytes:一次寫 bytes 個字節(即一個塊大小為 bytes 個字節)
bs=bytes:同時設置讀寫塊的大小為 bytes ,可代替 ibs 和 obs
cbs=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
要備份的數據文件:30720KB
block 0 =8 KB.
raw offset 64 KB.
設定 bs=8k
1、從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=/oracle/dbs/df1.dbf of=/backup/df1.dbf bs=1024k
5、備份/dev/hdx全盤數據,並利用gzip工具進行壓縮,保存到指定路徑(bzip2工具也一樣可使用)
dd if=/dev/hdx | gzip > /path/to/image.gz
6、生成1G的虛擬塊設備Sparse File(稀疏文件)
dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
Sparse File是什么,稀疏文件,也就是說,是一個擁有空的空間的文件,磁盤塊將並沒分配給這些文件。如果這些空的空間填滿ASCII的NULL字符,那么文件才會是實際的大小。
7、拷貝光盤數據到backup文件夾下,並保存為cd.iso文件,再進行刻錄
dd if=/dev/cdrom of=/backup/cd.iso
cdrecord -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/hdx
12、測試磁盤寫能力
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、恢復MBR
dd if=/mnt/windows/linux.lnx of=/dev/hda bs=512 count=1
17、 得到最恰當的block size。 通過比較dd指令輸出中所顯示的命令執行時間(選時間最少的那個),即可確定系統最佳的block size大小
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
Oracle數據庫的dd備份
說明,以下實驗操作系統版本為RHEL 5.4沒有offset
Raw offset
在一些os上,在裸設備上的文件的開頭是被os使用的。這些存儲空間被叫做raw offset,Oracle不會備份和恢復這些內容(字節)。因此,備份的時候要跳過含有offset的字節。 目前只有AIX和Tru64系統的裸設備存在offset,詳細信息如下
UNIX OS Reserved Size
------------ ----------------
SUN Solaris 0
HP-UX 0
IBM AIX 4k
Tru64 UNIX 64k
Linux 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_10g
Database file: /dev/rlv_data01_10g
Database file type:raw device
Database file size: 1048448 8192 byte blocks
下面是不包含offset的裸設備
#dbfsize /dev/rlv_data01_10g
Database file: /dev/rlv_data01_10g
Database 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* blocksize
SQL> 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數據文件 (如下測試是在Linux系統上進行)
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): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (4201-4485, default 4201):
Using default value 4201
Last cylinder or +size or +sizeM or +sizeK (4201-4485, default 4485): +10M
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (4212-4485, default 4212):
Using default value 4212
Last cylinder or +size or +sizeM or +sizeK (4212-4485, default 4485): +20M
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (4232-4485, default 4232):
Using default value 4232
Last cylinder or +size or +sizeM or +sizeK (4232-4485, default 4485): +30M
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (4262-4485, default 4262):
Using default value 4262
Last cylinder or +size or +sizeM or +sizeK (4262-4485, default 4485): +40M
Command (m for help): p
Disk /dev/sdd: 27.1 GB, 27111981056 bytes
64 heads, 32 sectors/track, 25856 cylinders
Units = 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 Linux
Command (m for help): w
The 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 60
2、基於裸設備創建表空間
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 in
22496+0 records out
11517952 bytes (12 MB) copied, 104.599 seconds, 110 kB/s
4、從大裸設備到小裸設備,但數據文件比小裸設備小
# dd if='/dev/raw/raw6' of='/dev/raw/raw5' bs=1024k count=12
12+0 records in
12+0 records out
12582912 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 bytes
Fixed Size 1219472 bytes
Variable Size 125830256 bytes
Database Buffers 239075328 bytes
Redo Buffers 2973696 bytes
Database 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、創建表空間,數據文件大小為5m
SQL> 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.dbf
2、dd文件到裸設備上
# dd if='/dev/zero' of='/dev/raw/raw3' bs=1024k
dd: writing `/dev/raw/raw3': No space left on device
11+0 records in
10+0 records out
11517952 bytes (12 MB) copied, 7.63555 seconds, 1.5 MB/s
# dd if=/home/oracle/mytest1.dbf of=/dev/raw/raw3
10256+0 records in
10256+0 records out
5251072 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 in
21+1 records out
11517952 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 bytes
Fixed Size 1219472 bytes
Variable Size 134218864 bytes
Database Buffers 230686720 bytes
Redo Buffers 2973696 bytes
Database 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 recovery
ORA-01110: data file 9: '/home/oracle/mytest2.dbf'
可以看到數據庫無法打開,這是因為裸設備已被數據文件使用部分的邏輯塊與未使用部分的邏輯塊大小不一致。這種情況下,只能拷貝裸設備中數據文件大小 + block 0部分。這里用到兩個工具
dbfsize 求出在裸設備或者文件系統上的oracle數據文件的大小,由oracle提供。
blockdev 求出裸設備的大小,操作系統自帶。
要計算出要要拷貝的大小,否則報錯,如:
$ dbfsize /dev/raw/raw3
Database file: /dev/raw/raw3
Database file type: raw device
Database 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 –l
total 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