分类: BSD
2011-02-25 16:03:13
作者:顾翠文 EMAIL: @163.com">win2@163.com
版权申明: 仅限非赢利性组织网站,BBS,以及个人博客收藏,用于其他用途前请先和作者联系。
关键字: freeBSD 分区 分区工具
今天对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
以上实验说明,在操作系统中,硬盘分区并非必需的,分区是为了更好的管理文件和与其他系统共存。
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 |