天天看點

關于FreeBSD的fdisk和disklabel

今天對FreeBSD的硬碟分區和存儲方式作了一組實驗,現在記錄下來備案。

首先,由于FreeBSD的分區方式和Linux以及windows的分區方式有很大不同,是以分區和磁盤存儲相關的工具的使用也有很大的不同 .為了描述友善,我将FreeBSD中的slice稱作主分區,而slice中進一步包含的partition稱為邏輯分區。

一,基本概念。

在所有PC體系架構上安裝的作業系統都隻能分四個分區。這四個分區在不同的作業系統中有不同的說法,在windows和linux中,通常被稱為主分區(primary partition),而在BSD風格的UNIX以及Solaris系統中被稱為slice (英文原意為小碎片,不知道有沒有好的翻譯來表述)。slice和主分區是同一個概念,在PC上能安裝的作業系統都能根據MBR中的分區表認出這樣的主分區。在windows和linux中,一個硬碟可以分四個主分區,其中一個可作為擴充分區,再在擴充分區中劃分邏輯分區,而其他三個主分區則隻能作為最小的分區機關了。就是說,隻能選擇一個擴充分區,然後再在擴充分區中劃分邏輯分區。擴充分區中包含的邏輯分區數目可以有很多個,查了資料,一種說法是最多64 個,還沒有具體驗證過,不過反正這個數目比較大,可把硬碟分得足夠細。

而FreeBSD,則可以在每個slice中再劃分更小的分區機關,在FreeBSD中硬碟的slice中,這種更小的分區機關被稱為 partition,其概念和windows和linux中的邏輯分區的概念類似。這種更小的分區機關用小寫字母a-h表示,共有8個,但是其中c分區有特殊含義,c分區表示該分區所在的整個slice(主分區)。就相當于在solaris中/dev/dsk/c0t0d0c2分區一樣,在sparc體系的solaris系統中c0t0d0c2表示的是整個磁盤,因為solaris中沒有其他表示整個磁盤的裝置名稱。從概念上講FreeBSD中的/dev/ad0s1c 等同于 /dev/ad0s1

是以,在FreeBSD中,一個硬碟最多可劃分(8-1)x4 = 28 個分區。原先老的FreeBSD系統中,邏輯分區d也有特殊用途,就是說,在老版本的FreeBSD系統中,每個硬碟最多能分(8-2)X4 = 24 個分區,但是現在這個d分區的特殊用途也已經淡化了,雖然用sysinstall劃分邏輯分區的時候sysinstall會盡量避開使用d分區,但是今天經過實驗驗證,d分區辨別也可以作為一個普通的資料存儲分區辨別。是以,以IDE硬碟為例在freebsd中第一塊硬碟正常情況下可用的分區裝置号為:/dev/ad0s1a /dev/ad0s2a /dev/ad0s3a /dev/ad0s4a /dev/ad0s1b /dev/ad0s2b /dev/ad0s3b /dev/ad0s4b /dev/ad0s1d /dev/ad0s2d /dev/ad0s3d /dev/ad0s4d /dev/ad0s1e /dev/ad0s2e /dev/ad0s3e /dev/ad0s4e /dev/ad0s1f /dev/ad0s2f /dev/ad0s3f /dev/ad0s4f /dev/ad0s1g /dev/ad0s2g /dev/ad0s3g /dev/ad0s4g /dev/ad0s1h /dev/ad0s2h /dev/ad0s3h /dev/ad0s4h

二, FreeBSD下分區工具的使用。

在FreeBSD下最友善的分區方法是使用sysinstall提供的菜單選項,根據提示來完成分主分區(slice)和分邏輯分區(partiton)的劃分工作。 這個方法比較簡單,很容易學會。

今天主要學習了一下指令行工具fdisk 和 disklabel(又名bsdlabel)的使用。

首先,fdisk是用來劃分主分區的,也就是用來劃分slice,這一點和linux系統有很大的不同 .

一般的使用方法:

dd if=/dev/zero of=/dev/ad bs=k count= #目的是先清除硬碟上原有的分區表,新硬碟可跳過這步。
fdisk -BI /dev/ad #在硬碟/dev/ad0上建立一個主分區(slice)。
           

看了一下fdisk的man文檔,參數B表示在硬碟的MBR中寫入一個标準引導記錄,I選項表示将整個硬碟劃分出一個slice.也就是說,指令行的分區工具fdisk隻能在一個硬碟上劃分出一個主分區,應該通過-f參數加配置檔案可以定義并劃分出四個主分區,但是光用fdisk提供的參數,好像隻能劃分出一個來。這一點上來說,FreeBSD的指令行分區工具做得還不夠人性化,還是用sysinstall提供的界面來分區更友善。

disklabel/bsdlabel的使用:

disklabel -B -w /dev/ad0s1 auto disklabel -e /dev/ad0s1

檢視了bsdlabel的man文檔,參數B表示在該主分區中寫入引導程式。按照handbook中關于FreeBSD引導過程的描述,fdisk 的 B參數是表示在硬碟的MBR中寫入boot0(512位元組),而bsdlabel中的B參數則表示在該主分區中寫入該主分區的引導記錄(并非主引導記錄),即boot1(512位元組,寫在主分區的第一個扇區)和boot2(大概8K左右,寫在分區的某個特定區域,并非檔案系統中)。參數w即write,表示寫入,此外還可用r參數讀取。

[auto]表示在該主分區中自動劃分出一個邏輯分區,有點類似于fdisk中的I參數。如果不加auto參數,則用disklabel -e /dev/ad0s1來分區劃分出邏輯分區的時候,disklabel會自動打開一個編輯器,讓你手工輸入邏輯分區大小,偏移量等資訊,然後儲存後更據你編輯的資訊來劃分出邏輯分區。手工編寫邏輯分區的資訊需要對硬碟的知識比較了解,但是好處是可以很自由的安排邏輯分區的起始位置、大小以及分區名稱等資訊,而且可以更據FreeBSD的規則最多化出7個可用分區和一個特殊的c分區。而用auto參數字自動劃分出一個邏輯分區的好處是不需要對硬碟有比較深入的了結,壞處是隻能分一個可用的邏輯分區。

disklabel -e /dev/ad0s1 指令用來在該主分區(slice)中寫入該邏輯分區的起始位置等資訊。

執行完這條指令後,在/dev/目錄下就會自動生成裝置檔案 ad0s1a 和ad0s1c ,如果是手工編輯邏輯分區資訊生成多個分區的話,/dev下會有對應的裝置檔案生成,用newfs建立檔案系統後就可以用該邏輯分區了。

以上指令在handbook中有描述,但是沒有這麼詳細的說明,今天根據實驗和man文檔,以及自己的了解,寫下這些備忘記錄,以上了解應該是正确的。

綜上所述fdisk工具是用來劃分主分區(slice)的,他的操作對象是硬碟的第一個扇區(MBR),在MBR中寫入标準引導程式(boot0),以及主分區的分區資訊。而disklabel/bsdlabel是用來在主分區中劃分邏輯分區的,他的操作對象是硬碟中主分區的第一個扇區,以及一些特殊區域,用來寫入引導程式的第二、第三步(boot1和boot2)以及位于該主分區中的邏輯分區的分區資訊以及辨別号。

一般情況下,用fdisk和disklabel/bsdlabel進行分區不太友善也不直覺,sysinstall應該是一個快速直覺的選擇。

通過閱讀相關文檔和實驗以及和其他作業系統的分區方式和概念的對比,對FreeBSD的分區概念和分區工具的使用有了比較清晰的了解 .

三,一組有趣的實驗

在實驗的過程中,發現一個有趣的現象,即:在FreeBSD中無論是整個硬碟/dev/ad0整個主分區/dev/ad0s1還是主分區中的邏輯分區 /dev/ad0s1a

都可以用newfs直接建立檔案系統然後挂到某個目錄下使用。

首先,我對一個沒有任何分區的硬碟做如下操作:newfs /dev/ad0 mount /dev/ad0 /mnt

發現沒有任何錯誤和警告資訊,該硬碟沒有分區就直接可以用了,實際測試了一下,也确實正确。

然後對硬碟劃分了四個主分區,再分别在四個主分區上建立檔案系統:

newfs /dev/ad0s1 newfs /dev/ad0s2 newfs /dev/ad0s3 newfs /dev/ad0s4

mount /dev/ad0s1 /mnt/1 mount /dev/ad0s2 /mnt/2 mount /dev/ad0s3 /mnt/3 mount /dev/ad0s4 /mnt/4

同樣沒有任何錯誤和警告,這些主分區在沒有進一步劃分邏輯分區的情況下也可直接建立檔案系統後使用。

最後,再在四個主分區中分别劃分出幾個邏輯分區,建立檔案系統後當然也能使用,這是FreeBSD中預設的硬碟使用方式。

我甚至對代表整個主分區的c号邏輯分區上建立檔案系統:newfs /dev/ad0s1c mount /dev/ad0s1c /mnt 這樣也能使用,當然 如果劃分了其他邏輯分區的情況下,這種用法會破壞其他邏輯分區,這種用法和:newfs /dev/ad0s1 mount /dev/ad0s1 /mnt 應該是一緻的。

通過實驗得出結論:在FreeBSD中,硬碟不需要分區,可直接建立檔案系統而使用該硬碟。

建立分區的好處,是可以和其他作業系統共存一個硬碟上。

在FreeBSD系統上做完上述實驗後,本人又想到linux上是否也可以不劃分分區而直接使用整個硬碟呢?

立即做了一下實驗,證明了我的想法是正确的,隻不過linux的建立檔案系統指令mkfs.ext3會發出警告,隻要回答yes就可以直接在一個沒有分區的硬碟上建立檔案系統并mount到系統中使用了。

指令如下:

mkfs.ext3 /dev/sdb mke2fs  (-NOv-)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
mount /dev/sdb /mnt
           

以上實驗說明,在作業系統中,硬碟分區并非必需的,分區是為了更好的管理檔案和與其他系統共存。

摘錄的代碼:

dd if=/dev/zero of=/dev/ad0 bs=k count= #目的是先清除硬碟上原有的分區表

fdisk -BI /dev/ad0 #在硬碟/dev/ad0上建立一個主分區(slice)
disklabel -B -w /dev/ad0s1 auto disklabel -e /dev/ad0s1
for i in `egrep "^(ad|aacd|mlxd|mlyd|amrd|idad|twed|da|ar|ips|)[0-9]:" /var/run/dmesg.boot | cut -d':' -f1 | sort | uniq`
do
LN="`cat /var/run/dmesg.boot | grep ^$i | grep MB`" >/dev/null
echo ${LN}
fdisk /dev/${i} >/tmp/${i}
FOUND="1"
done
           
#!/bin/sh
#Get our Device Name
device=${1}
#Erase any existing bootloader
dd if=/dev/zero of=/dev/${device} count=
sleep 
fdisk -I -B /dev/${DEVICE}
# Install new partition setup
fdisk -f /tmp/fdiskconfig /dev/${device}
sleep 
           

轉載自http://www.linuxdiyf.com/viewarticle.php?id=79059

繼續閱讀