版權申明: 僅限非贏利性組織網站,BBS,以及個人博客收藏,用於其他用途前請先和作者聯系。
今天對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/ad0 bs=1k count=1 #目的是先清除硬盤上原有的分區表,新硬盤可跳過這步。
fdisk -BI /dev/ad0 #在硬盤/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 1.32 (09-NOv-2002)
/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=1k count=1 #目的是先清除硬盤上原有的分區表
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=1024
sleep 2
fdisk -I -B /dev/${DEVICE}
# Install new partition setup
fdisk -f /tmp/fdiskconfig /dev/${device}
sleep 1