在Solaris系统中,每块磁盘默认划分为8个分区,分区编号从0到7。通过format命令可以快速验证这一分区结构——选择硬盘后,分区信息会清晰显示。以Solaris 9系统、Ultra 60平台为例,执行format命令后的输出如下:
# format
Searching for disks...done
A VAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1f,4000/scsi@3/sd@0,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]
Warning: Current Disk has mounted partitions.
FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
sa ve - sa ve new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
!
quit
面对这么多输出信息,无需紧张。最关键的是第一行:0. c0t0d0 。它表明Ultra 60中仅安装了一块硬盘。c0t0d0的具体含义稍后会详细介绍,尖括号内的内容说明了硬盘的容量和柱面参数,最后的物理地址则指定了硬盘在系统中的实际位置。日常运维时,主要关注format检测到的硬盘数量是否与已安装的数量一致——例如,如果你安装了两块硬盘,但这里只显示一块,就需要认真排查硬件或连接问题。
接着看FORMAT MENU,在下方命令列表中,输入了p(即partition的缩写),随后进入了PARTITION MENU:
PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
!
quit
这样一来,就清晰证明了Solaris下每个磁盘包含8个分区(编号0-7)。后面各命令的具体含义可参考英文介绍,具体使用方法将在后续内容中详细展开。下面进入正题。
磁盘分区的三个步骤
在向一块硬盘写入数据之前,必须先进行分区和格式化操作。整个过程通常分为三步:
- 物理格式化(低级格式化,LLF)——硬盘被划分成磁道,磁道再被分成扇区,每个扇区填充随机数据。几乎所有硬盘在出厂前已完成这一步,因此用户只需进行后续两步操作。
- 分区——将硬盘分割成若干部分(分区或分片),每个分区由若干柱面组成。在Solaris中,一个分区通常对应一个文件系统,分区不能包含多个文件系统,文件系统也不能跨越多个分区。分区操作使用的正是前面提到的
format命令。 - 逻辑格式化(高级格式化,HLF)——Solaris使用
newfs命令实现高级格式化,默认文件系统为UNIX文件系统(UFS)。高级格式化会将每个分区分成若干柱面组,每个柱面组包含几个连续柱面。文件系统在这些柱面组中建立文件和目录,尽量将同一文件的数据保存在同一柱面组,从而减少磁头移动,加快读取速度。
UFS文件系统的块类型
UFS使用四种类型的块:
引导块
引导块存储系统启动所需信息,总是位于硬盘的第一个柱面组,占用分区前8KB空间。
超级块
超级块存储文件系统的元信息,包含以下内容:
- 文件系统总块数(大小)
- 数据块数目
- 索引节点数目
- 柱面组数目
- 块大小
- 磁盘碎片大小
- 空闲块个数
- 空闲索引节点个数
超级块极其重要,Solaris采用多个备份确保其安全。当系统未正常关闭或硬盘出现故障时,默认超级块可能损坏或与备份不一致。此时系统重启时会自动调用fsck命令进行修复。若fsck无法自动修复,需要手动执行以下步骤:
- 以单用户模式进入系统(如在PROM的ok状态下执行
boot -s,或通过sync;sync;sync;init 0进入)。 - 若损坏的文件系统已挂载,切换到另一目录并卸载它,例如:
# cd / # umount /var
- 使用
newfs -N命令显示备用超级块的位置:# newfs -N /dev/dsk/c0t0d0s1 /dev/rdsk/c0t0d0s1: 961248 sectors in 204 cylinders of 19 tracks, 248 sectors 469.4MB in 13 cyl groups (16 c/g, 36.81MB/g, 17664 i/g) super-block backups (for fsck -F ufs -o b=#) at: 32, 75680, 151328, 226976, 302624, 378272, 453920, 529568, 605216, 680864, 756512, 832160, 907808,
- 从列出的备用超级块中选取一个,用
fsck命令修复:# fsck -F ufs -o b=453920 /dev/rdsk/c0t0d0s1
索引节点(i节点)
索引节点包含文件除去文件名以外的所有信息,每个i节点占用128字节,包括以下内容:
- 文件类型(普通文件、目录、块设备、字符设备、链接等)
- 文件权限(读、写、执行)
- 硬链接数
- 所有者用户ID
- 所属组ID
- 文件大小(字节)
- 包含15个磁盘块地址的数组
- 最近访问、修改、创建的时间
文件系统创建时,会在每个柱面组中创建一定数量的i节点。当程序产生大量小文件时,i节点可能不够用,此时需要增加i节点数量;反之,若只需存放少数大文件,可减少i节点以节省磁盘空间。使用newfs的-i选项可以调整i节点数量。查看i节点使用情况可用/usr/ucb/df -i命令:
# /usr/ucb/df -i Filesystem iused ifree %iused Mounted on /dev/dsk/c0t0d0s0 131672 1929384 6% /
注意:文件系统一旦创建,就无法改变i节点数目。如果i节点不够用,需要备份数据,创建包含更多i节点的新文件系统,再恢复数据。
存储块(数据块)
存储块占用了文件系统其余所有空间,用于存放实际数据。每个存储块的大小在创建文件系统时确定。对普通文件,存储块存放文件内容;对目录,存储块存放目录中所有文件的i节点号和文件名。
磁盘命名
回到最开始用format看到的c0t0d0,Solaris使用cXtXdXsX格式表示磁盘设备名。具体含义如下:
- cX:逻辑控制器编号。系统检测磁盘时按顺序分配数值,第一个为0,第二个为1,以此类推。IDE系统下,第一个IDE通道为0,第二个为1。
- tX:物理总线目标号,也称为SCSI标识符。每个磁盘有唯一目标号用于寻址。IDE磁盘中主盘为0,从盘为1。
- dX:逻辑单元号(LUN)。在磁盘阵列中,LUN用于区分阵列中的单个磁盘。单个磁盘或IDE磁盘通常设为0。
- sX:分区号,取值0–7,对应磁盘的8个分区。
因此,c0t0d0s0的含义就很清楚了:控制器0、目标0、LUN 0上的第一个分区。这便是系统中第一个硬盘的根分区(boot disk)的典型标识。
