天天看點

Linux 磁盤管理1——基礎

一、fdisk 

執行個體解說Linux中fdisk分區使用方法

  fdisk -Partition table manipulator for Linux ,譯成中文的意思是磁盤分區表操作工具;本人譯的不太好,也沒有看中文文檔;其實就是分區工具;

  fdsik 能劃分磁盤成為若幹個區,同時也能為每個分區指定分區的檔案系統,比如linux 、fat32、 linux 、linux swap 、fat16 以及其實類Unix類作業系統的檔案系統等;當然我們用fdisk 對磁盤操作分區時,并不是一個終點,我們還要對分區進行格式化所需要的檔案系統;這樣一個分區才能使用;這和DOS中的fdisk 是類似的;

fdisk -l 檢視硬碟及分區資訊:

  通過《合理規劃您的硬碟分區》,我們知道主分區(包括擴充分區)的總個數不能超過四個;也不能把擴充分區包圍在主分區之間;根據這個原則,我們劃分硬碟分區就比較容易的多;也能為以後減少不必要的麻煩;

     硬碟總容量=主分區(包括擴充分區)總容量

  擴充分區容量=邏輯分區總容量

關于fdisk -l 一些數值的說明:

Disk /dev/hda: 80.0 GB, 80026361856 bytes

255 heads, 63 sectors/track, 9729 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

  這個硬碟是80G的,有255個磁面;63個扇區;9729個磁柱;每個 cylinder(磁柱)的容量是 8225280 bytes=8225.280K(約為)=8.225280M(約為);

分區序列 引導 開始 終止 容量分區類型ID 分區類型

Device Boot Start End Blocks Id System

/dev/hda1 * 1 765 6144831 7 HPFS/NTFS

/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)

/dev/hda3 2806 9729 55617030 5 Extended

/dev/hda5 2806 3825 8193118+ 83 Linux

/dev/hda6 3826 5100 10241406 83 Linux

/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris

/dev/hda8 5199 6657 11719386 83 Linux

/dev/hda9 6658 7751 8787523+ 83 Linux

/dev/hda10 7752 9729 15888253+ 83 Linux

  說明:

  硬碟分區的表示:在Linux 是通過hd*x 或 sd*x 表示的,其中 * 表示的是a、b、c …… …… x表示的數字 1、2、3 …… …… hd大多是IDE硬碟;sd大多是SCSI或移動存儲;

  引導(Boot):表示引導分區,在上面的例子中 hda1 是引導分區;

  Start (開始):表示的一個分區從X cylinder(磁柱)開始;

  End (結束):表示一個分區到 Y cylinder(磁柱)結束;

  id和System 表示的是一個意思,id看起來不太直覺,我們要在fdisk 一個分區時,通過指定id來确認分區類型;比如 7表示的就NTFS 分區;這個在fdisk 中要通過 t 功能來指定。下面的部份會提到;

  Blocks(容量):這是我翻譯的,其實不準确,表示的意思的确是容量的意思,其機關是K;一個分區容量的值是由下面的公式而來的;

  Blocks = (相應分區End數值 - 相應分區Start數值)x 機關cylinder(磁柱)的容量

  是以我們算一下 hda1的 Blocks 的大小 :

  hda1 Blocks=(765-1)x8225.280=6284113.92 K =6284.113.92M

  注:換算機關以硬碟廠家提供的10進位算起,如果以作業系統二進制來算,這個分區容量應該更少一些,得出的這個值和我們通過 fdisk -l 看到的 /dev/hda1的值是大體相當的,因為換算方法不一樣,是以也不可能盡可能的精确;再加上分區時的一點損失之類,有時或大或小是存在的;

  我們檢視分區大小或者檔案的時候,還是用十進制來計算比較直覺;推算辦法是 byte 向前推小數點三位就是K ,K機關的值向前推小數點三位就是M,M向前推小數點三位就是G…… …… 一般也差不了多少;這麼算就行。

fdisk 對硬碟及分區的操作,進入fdisk 對硬碟操作階段:

  我們可以對硬碟進行分區操作,前提是您把fdisk -l 弄明白了;通過fdisk -l ,我們能找出機器中所有硬碟個數及裝置名稱;比如上面的例子,我們會看到兩個裝置一個是/dev/hda ,另一個是/dev/sda ;

  fdisk 操作硬碟的指令格式如下:

  [root@localhost]# fdisk 裝置

  比如我們通過 fdisk -l 得知 /dev/hda 或者 /dev/sda裝置;我們如果想再添加或者删除一些分區,可以用

  [root@localhost]# fdisk /dev/hda

  或

  [root@localhost]# fdisk /dev/sda

  注 在以後的例子中,我們要以 /dev/sda裝置為例,來講解如何用fdisk 來操作添加、删除分區等動作;

  fdisk 的說明:

  當我們通過 fdisk 裝置,進入相應裝置的操作時,會發現有如下的提示;以 fdisk/dev/sda 裝置為例,以下同。

[root@localhost ]# fdisk /dev/sda

Command (m for help): 在這裡按m ,就會輸出幫助;

Command action

   a toggle a bootable flag

   b edit bsd disklabel

   c toggle the dos compatibility flag

   d delete a partition 注:這是删除一個分區的動作;

   l list known partition types 注:l是列出分區類型,以供我們設定相應分區的類型;

   m print this menu 注:m 是列出幫助資訊;

   n add a new partition 注:添加一個分區;

   o create a new empty DOS partition table

   p print the partition table 注:p列出分區表;

   q quit without saving changes 注:不儲存退出;

   s create a new empty Sun disklabel

   t change a partition's system id 注:t 改變分區類型;

   u change display/entry units

   v verify the partition table

   w write table to disk and exit 注:把分區表寫入硬碟并退出;

   x extra functionality (experts only) 注:擴充應用,專家功能;

  其實我們常用的隻有注有中文的,其它的功能我們不常用(呵,主要是我不會用,否則早會賣弄一下了);x擴充功能,也不是常用的;一般的情況下隻要懂得 d l m p q tw 就行了;

  下面以執行個體操作來詳述,沒有例子沒有辦法就,新手也看不懂;

列出目前操作硬碟的分區情況,用p:

Command (m for help): p

Disk /dev/sda: 1035 MB, 1035730944 bytes

256 heads, 63 sectors/track, 125 cylinders

Units = cylinders of 16128 * 512 = 8257536 bytes

   Device Boot Start End Blocks Id System

/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)

/dev/sda2 26 125 806400 5 Extended

/dev/sda5 26 50 201568+ 83 Linux

/dev/sda6 51 76 200781 83 Linux

然後我們根據前面所說通過t指令來改變分區類型;

  最後不要忘記w儲存退出;

 二、df 和 du

常用指令:df –hi

a:顯示全部的檔案系統和各分割區的磁盤使用情形

i:顯示i -nodes的使用量

k:大小用k來表示 (預設值)

t:顯示某一個檔案系統的所有分割區磁盤使用量

x:顯示不是某一個檔案系統的所有分割區磁盤使用量

T:顯示每個分割區所屬的檔案系統名稱

指令 df 可以顯示目前所有檔案系統的最大可用空間及使用情形,請看下列這個例子:

# df –h

Filesystem             Size  Used   Avail    Use%     Mounted on

/dev/mapper/VolGroup00-LogVol00

                      37G  3.6G   32G      11%  /

/dev/sda1              99M  12M   83M     13%  /boot

tmpfs                 506M    0  506M     0%  /dev/shm

du指令詳細用法

常用指令:[b]du[/b] –a

查詢檔案或目錄的磁盤使用空間,我一般用的比較多的就是du -sh (檢視目前目錄的總空間)

a:顯示全部目錄和其次目錄下的每個檔案所占的磁盤空間

b:大小用bytes來表示 (預設值為k bytes)

c:最後再加上總計 (預設值)

s:隻顯示各檔案大小的總合

x:隻計算同屬同一個檔案系統的檔案

L:計算所有的檔案大小

指令 du 能以指定的目錄下的子目錄為機關,顯示每個目錄内所有檔案所占用的磁盤空間大小。使用 -h 參數來顯示 human-readable 的格式。例如:

# du -h /etc

104K /etc/defaults

6.0K /etc/X11

在檢視目錄的使用情形時,我們可以将輸出結果導到 sort 指令進行排序,以了解哪個檔案用了最多的空間:

# du /etc | sort -nr | more

1746 /etc

388 /etc/mail

318 /etc/rc.d

Linux、Unix-Like平台的使用者都可能會發現,du與df的查詢結果會不一緻。最常見的情況就是,df顯示的已使用磁盤占用率比du統計出來的結果要大很多。下面說下兩者結果不同的原因,主要是由于兩者計算結果的方式不同。

先來看看兩者是如何計算的

  df指令:

  df是從檔案系統考慮,通過檔案系統中未配置設定的空間來确定檔案系統中已配置設定空間的大小。例如:如果一個檔案系統中有8192個512-byte 塊,并且4000個塊沒有被配置設定出去,那麼已配置設定的空間就是4192個512-byte 的塊。

  已配置設定空間=空間總數-未配置設定空間

  df中的used還包含了程式申請的、被程式占用的空間等等。因為基于檔案系統總體來計算,是以df指令是報告檔案系統空間使用情況最可靠的指令。

  du指令:

  du是面向檔案的指令,它計算配置設定給指定檔案或者目錄的空間。du指令必須跟着目的參數,而且不能隔離檔案系統。

  例如:運作 #du /指令将計算所有在/檔案系統下所有檔案的空間配置設定資訊。其中包括/檔案系統所有的檔案和安裝在/下面的,例如/tmp, /var和/usr下面的其他檔案系統的檔案。可以用du指令帶-x參數來限制僅在檔案系統内進行操作。但是有時候會導緻輸出結果不完全。

  du指令隻計算被檔案占用的空間。不計算檔案系統metadata 占用的空間,如inodes, inode maps, 或者disk maps。

  du指令隻計算那些可以通路的檔案所占用的存儲空間。

  下面兩種情況du指令不會計算已經配置設定給檔案的空間。

  Case1:

  檔案被隐藏了。

  例如:如果一個檔案存放在/bobby 目錄下, 接着有檔案系統安裝(mount)在/bobby目錄下, 那麼du 指令将不會計算 /bobby 目錄下的檔案所占用的存儲空間。

  Case2:

  檔案被其他的應用的打開了,接着檔案被删除了(rm指令删除)。 在這種情況下,檔案所占用的存儲空間将維持着被配置設定的狀态直到所有對這個檔案的通路都被關閉。由于目錄中沒有這個檔案的相關紀錄,du指令将不會計算這個檔案的被配置設定空間,但df指令将計算這部分已配置設定的空間。

  除rm外,有些不明顯的操作也會産生類似的問題。

  例如gzip指令,其對某個檔案xxx.log進行壓縮時,會産生一個新的xxx.log.gz檔案,完成後,會把原來的xxx.log删除。這時,若仍有程序在使用xxx.log檔案。那麼,實際上該檔案還是隻會标記為deleted,其空間也不會釋放,問題與上面提到的情況是相同的。是以,在編寫腳本時,可先判斷是否仍有程序正在使用該檔案,然後再進行gzip操作。

  通俗點講,du就是周遊某個目錄,把所有檔案的大小加起來,都是那看得見的東西的和

  簡單的模拟測試實驗(以下實驗屬引用,未測試。看了下輸出,結果應該沒問題。呵呵!)

  實驗情況

1、建立并删除檔案

  建立檔案:?View Code BASH

  現在的磁盤情況:?View Code BASH

  模拟某個程序正在使用該檔案:?View Code BASH

三、dd 指令

dd 是 Linux/UNIX 下的一個非常有用的指令,作用是用指定大小的塊拷貝一個檔案,并在拷貝的同時進行指定的轉換。 

1、指令簡介

dd 的主要選項: 

指定數字的地方若以下列字元結尾乘以相應的數字: 

b=512, c=1, k=1024, w=2, xm=number m 

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=conversion[,conversion...]          用指定的參數轉換檔案。 

轉換參數: 

ascii 轉換 EBCDIC 為 ASCII。 

ebcdic 轉換 ASCII 為 EBCDIC。 

ibm 轉換 ASCII 為 alternate EBCDIC. 

block 把每一行轉換為長度為 cbs 的記錄,不足部分用空格填充。 

unblock 使每一行的長度都為 cbs ,不足部分用空格填充。 

lcase 把大寫字元轉換為小寫字元。 

ucase 把小寫字元轉換為大寫字元。 

swab 交換輸入的每對位元組。  

noerror 出錯時不停止。 

notrunc 不截短輸出檔案。 

sync 把每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。 

2、執行個體分析 :

2.1.資料備份與恢複 

2.1.1整盤資料備份與恢複 

備份: 

恢複: 

dd if=/path/to/image of=/dev/hdx   ——将備份檔案恢複到指定盤

2.1.2.利用netcat遠端備份 

2.1.3.備份MBR 

2.1.4.備份軟碟 

2.1.5.拷貝記憶體資料到硬碟 

2.1.6.從CD光牒拷貝iso鏡像 

2.2.增加Swap分區檔案大小 

dd if=/dev/zero of=/swapfile bs=1024 count=262144       ——建立一個足夠大的檔案(此處為256M) 

2.3.銷毀磁盤資料 

2.4磁盤管理 

2.4.1.得到最恰當的block size 

通過比較dd指令輸出中所顯示的指令執行時間,即可确定系統最佳的block size大小 

2.4.2測試硬碟讀寫速度 

通過上兩個指令輸出的執行時間,可以計算出測試硬碟的讀/寫速度 

2.4.3.修複硬碟 

當硬碟較長時間(比如1,2年)放置不使用後,磁盤上會産生magnetic flux point。當磁頭讀到這些區域時會遇到困難,并可能導緻I/O錯誤。當這種情況影響到硬碟的第一個扇區時,可能導緻硬碟報廢。上邊的指令有可能使這些資料起死回生。且這個過程是安全,高效的

2.4.4.清空硬碟或者某分區 

dd if=/dev/zero of=/dev/raw/raw1         ——對裸裝置raw1進行清空。

四、dumpe2fs, e2fsck,e2image,e2label, tune2fs:

dumpe2fs用于顯示ext2/ext3檔案系統的資訊。如:顯示指定檔案系統的超級塊資訊:dumpe2fs -h /dev/sda7;

e2fsck用于檢查ext2/ext3檔案系統,根據其傳回值來判斷具體出錯原因,如傳回0代表沒有錯誤,傳回1代表發生檔案系統錯誤。2系統應該重新啟動,4不正常退出錯誤,8操作錯誤,16,32.128.。。;

e2image 用于備份檔案系統的源資料到指定的映像檔案。如: e2image  /dev/sda7 sda7.bak  這樣就生成了一個映像檔案sda7.bak 可以用file指令探測檔案的類型,測得是data類型。

e2label用于設定ext2/ext3檔案系統标簽。如: e2label /dev/sda7 music  好了這就給sda7設定了music這個标簽,如果這個指令不加任何參數,那就顯示這個标簽,如:e2label /dev/sda7. 顯示 music。。。

tune2fs用于調整ext2/ext3檔案系統參數,這是一個很強的指令,tune2fs -l /dev/sda. 顯示檔案系統超級塊的内容。

tune2fs用法小結

為了保證檔案系統的完整,系統每隔幾天或重新啟動幾次之後就要完整地檢查一次,這對于工作站及伺服器确實很有必要。但對于個人及家用系統,可以用Tune2fs工具作一些調整。假設根檔案系統在/dev/hda1上,如調整每2次完整地檢查根檔案系統的裝載次數為100次: 

        # tune2fs -c 100 /dev/hda1 

        tune2fs 1.10, 24-Apr-97 for EXT2 FS 0.5b, 95/08/09 

       Setting maximal mount count to 100 

調整每2次完整地檢查根檔案系統的時間間隔為5周: 

        # tune2fs -i 5w /dev/hda1 

  tune2fs 1.10, 24-Apr-97 for EXT2 FS 0.5b, 95/08/09 

  Setting interval between check 3024000 seconds 

另外,系統保留白間也可用tune2fs調整,如調整根檔案系統保留白間為40000個磁盤塊: 

  # tune2fs -r 40000 /dev/hda1 

  Setting reserved blocks count to 40000 

mknod,hdparm:

hdparm:用于設定硬碟的參數,

  五、對分區進行格式化,以及加載;

  先提示一下;用 mkfs.bfsmkfs.ext2 mkfs.jfs mkfs.msdos mkfs.vfatmkfs.cramfs mkfs.ext3 mkfs.minixmkfs.reiserfs mkfs.xfs 等指令來格式化分區,比如我想格式化 sda6為ext3檔案系統,則輸入;

  [root@localhost]# mkfs.ext3 /dev/sda6

  如果我想加載 sda6到目前系統來存取檔案,應該有mount 指令,但首先您得建一個挂載目錄;比如 /mnt/sda6 ;

[root@localhost ]# mkdir /mnt/sda6

[root@localhost ]# mount /dev/sda6 /mnt/sda6

[root@localhost ]# df -lh

Filesystem 容量 已用 可用 已用% 挂載點

/dev/hda8 11G 8.4G 2.0G 81% /

/dev/shm 236M 0 236M 0% /dev/shm

/dev/hda10 16G 6.9G 8.3G 46% /mnt/hda10

/dev/sda6 191M 5.6M 176M 4% /mnt/sda6

這樣我們就能進入 /mnt/sda6目錄,然後存取檔案了

繼續閱讀