基礎命令學習目錄首頁html
dd指令使用
語法格式
dd [option]
dd指令選項詳解linux
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填充)。 windows
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使用實例
假設了以下的狀況:bash
測試純寫入性能
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
一、從raw設備備份到raw設備
dd if=/dev/rsd1b of=/dev/rsd2b bs=8k skip=8 seek=8 count=3841
二、裸設備到文件系統
dd if=/dev/rsd1b of=/backup/df1.dbf bs=8k skip=8 count=3841
三、文件系統到裸設備
dd if=/backup/df1.dbf of=/dev/rsd2b bs=8k seek=8
四、文件系統到文件系統,你能夠爲了提高I/O把bs設爲較高的數值
dd if=/oracle/dbs/df1.dbf of=/backup/df1.dbf bs=1024k
五、備份/dev/hdx全盤數據,並利用gzip工具進行壓縮,保存到指定路徑(bzip2工具也同樣可以使用)
dd if=/dev/hdx | gzip > /path/to/image.gz cookie
六、生成1G的虛擬塊設備Sparse File(稀疏文件)
dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0 oracle
Sparse File是什麼,稀疏文件,也就是說,是一個擁有空的空間的文件,磁盤塊將並沒分配給這些文件。若是這些空的空間填滿ASCII的NULL字符,那麼文件纔會是實際的大小。
七、拷貝光盤數據到backup文件夾下,並保存爲cd.iso文件,再進行刻錄
dd if=/dev/cdrom of=/backup/cd.iso
cdrecord -v cd.iso
八、將內存裏的數據拷貝到backup目錄下的mem.bin文件
dd if=/dev/mem of=/backup/mem.bin bs=1024
九、將軟驅數據備份到當前目錄的disk.img文件
dd if=/dev/fd0 of=disk.img count=1 bs=1440k
十、將備份文件恢復到指定盤
dd if=/backup/df1.dbf of=/dev/rsd1b
十一、將壓縮的備份文件恢復到指定盤
gzip -dc /path/to/image.gz | dd of=/dev/hdx app
十二、測試磁盤寫能力
time dd if=/dev/zero of=/test.dbf bs=8k count=300000
由於/dev/zero是一個僞設備,它只產生空字符流,對它不會產生IO,因此,IO都會集中在of文件中,of文件只用於寫,因此這個命令至關於測試磁盤的寫能力。
1三、測試磁盤讀能力
time dd if=/dev/sdb1 of=/dev/null bs=8k
由於/dev/sdb1是一個物理分區,對它的讀取會產生IO,/dev/null是僞設備,至關於黑洞,of到該設備不會產生IO,因此,這個命令的IO只發生在/dev/sdb1上,也至關於測試磁盤的讀能力。
1四、測試同時讀寫能力
time dd if=/dev/sdb1 of=/test1.dbf bs=8k
這個命令下,一個是物理分區,一個是實際的文件,對它們的讀寫都會產生IO(對/dev/sdb1是讀,對/test1.dbf是寫),假設他們都在一個磁盤中,這個命令就至關於測試磁盤的同時讀寫能力
1五、備份磁盤開始的512Byte大小的MBR信息到指定文件
dd if=/dev/hdx of=/path/to/image count=1 bs=512
1六、恢復MBR
dd if=/mnt/windows/linux.lnx of=/dev/hda bs=512 count=1
1七、 獲得最恰當的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系統上進行)
一、建立裸設備
# 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
二、基於裸設備建立表空間
SQL>create tablespace mytest datafile '/dev/raw/raw3' size 5m,'/dev/raw/raw6' size 10m;
Tablespace created.
三、從小裸設備到大裸設備
# 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
四、從大裸設備到小裸設備,但數據文件比小裸設備小
# 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要大於原裸設備上的數據文件尺寸
五、重啓數據庫至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.
六、重命名數據文件,並打開數據庫
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.
從這個測試能夠看出:
一、從小裸設備到大裸設備,只需把小裸設備的全部數據塊dd到大裸設備便可
二、 是否能夠把大裸設備上的數據文件dd到小裸設備,取決於位於大裸設備上的數據文件尺寸(+block 0)是否比小裸設備小。若是數據文件小於小裸設備,則能夠把數據文件從大裸設備dd到小裸設備上,在dd過程當中不須要太準確計算原來數據文件的大小,只要 保證dd的總量大於數據文件並小於小裸設備的尺寸便可。
三、若是數據文件大於小裸設備的尺寸,則確定不能把它從大裸設備拷貝到小裸設備上
四、 裸設備之間拷貝數據文件比裸設備到文件系統之間拷貝的優勢在於:不須要精確計算要拷貝多少數據,只須要保證覆蓋了數據文件+block 0便可;而從裸設備到文件系統拷貝數據文件時,必須準確計算出要拷貝的數據量(數據文件+block 0),dd多一點或者少一點都會報錯。
五、 若是有offset的話,在裸設備之間拷貝數據文件的時候都要考慮(skip、seek)
從文件系統到裸設備拷貝ORACLE數據文件
繼續上面的實驗,首先要保證裸設備的大小要大於等於oracle數據文件大小+ block 0,若是裸設備須要offset的話,則要保證更大,而後直接用dd就能夠。
一、建立表空間,數據文件大小爲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
二、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
三、重命名數據文件,打開數據庫
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的狀況
一、在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
二、重啓數據庫,並充命名數據文件
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
1、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)字符補齊。
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
以上兩條指令是目的主機指令的變化分別採用bzip二、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_disk一、asm_disk2…asm_disk6)還不夠,還必須執行losetup -d /dev/loopN,在這裏N從1到6。不然,磁盤文件所佔用的磁盤空間不能釋放
/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
把/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都會丟入黑洞而不會保存在磁盤上了.
像/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