第6章 磁盘管理
Linux操作系统对磁盘的管理方式与Windows相比,有着显著的区别。Ubuntu作为Linux家族的一员,有着所有Linux系统对磁盘管理的共有特点,也有着自己的独特之处。Ubuntu对磁盘的管理方式和策略方便了计算机用户更有效、更合理、更方便地使用磁盘空间,并且从系统安全的角度出发,Ubuntu比Windows有着更加强健的安全策略。
本章第1节介绍Ubuntu磁盘管理基础知识,包括分区的基本概念,分区的规划方案,磁盘管理的方法等。
第2节介绍在Ubuntu中如何挂载和卸载分区,掌握这一方法,读者可以从本质上形成对Ubuntu及其他Linux操作系统的分区管理的概念。
6.1 磁盘管理基础
Ubuntu有着自己相对独特的磁盘管理体系,这和其他Linux类系统非常相似,与Windows操作系统有较大的区别。本节对比Ubuntu和Windows两种操作系统在管理磁盘设备时的异同,介绍在Ubuntu中规划磁盘分区的方案,讲解在进行磁盘管理的过程中常用的shell命令。
6.1.1 硬盘分区基本知识
对于熟悉Windows操作系统的用户而言,经常会遇到“分区”的概念。然而,在任何“类Linux”操作系统中,如Ubuntu,并没有如同Windows中的“分区”这个概念,它们采用“挂载点”取代“分区”的概念。
“挂载点”的意思就是:把一部分硬盘容量“分”成一个文件夹的形式,用来干一些事情,这个文件夹的名字就叫做“挂载点”。所以,Linux和Windows有着本质上的区别。在任何一个Linux发行版系统里,用户绝对不会看到C盘、D盘、E盘这样的标识符,能看到的只有“文件夹”形式存在的“挂载点”。
本书第4章在讲解文件系统管理时,已经介绍过Ubuntu主要的几个目录,如/、/boot、/home、/root等,其实每个文件夹对应的就是一个挂载点。
在Windows中,同一张硬盘可以被划分为不同的分区。一般人通常都喜欢把硬盘分割成C区和D区,若需要重新安装系统,就会把所有的数据和文件都放在D区,只要把系统C区格式化刪除,再重装系统,数据就不用备份,可以很容易地完成重装且保存数据。在Ubuntu中也是一样,不同的挂载点分别存放着不同的文件,这对于系统的安全和可维护性都有好处。
硬盘在记录所谓“分区”的情况时,会在主扇区创建一张硬盘分区表,这一点Ubuntu和Windows是相同的。分区的类型实质上有两种:一个是主分区(Primary),另一个是扩展分区(Extend)。
主分区最多可以有3个,而扩展分区最多只能规划为1个,其实扩展分区并不能直接使用,它还需要被划分为若干个逻辑分区(Logic),逻辑分区的个数最多可以存在12个。因此,一张硬盘可划分为15个分区,即15个挂载点。表6-1解释了不同类型挂载点的功能。
通过查看配置文件/etc/fstab,可以详细了解Ubuntu中硬盘分区的情况及别名,如下所示:
root@jacky-desktop:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
# /dev/sda1
UUID=da0ad461-4b12518ab1bb9 / ext3 relatime,errors=remount-ro 0 1
# /dev/sda5
UUID=6fec-d4b7-b67e-673152afe115 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
/root/swapfile none swap sw default 0 0
由于本书使用的Ubuntu是运行于虚拟机中的,因此看到的该文件信息与直接将Ubuntu安装在硬盘上的用户不同。但无论如何,其表示方法是类似的,都是以/dev/文件夹下的一个文件夹表示一个分区。
使用虚拟机安装的用户,根据本书第1章的方法安装后,看到的/etc/fstab文件信息如上所示。这里并没有实际的硬盘,而主分区或称为主挂载点的别名是/dev/sda1,即“/”挂载点。文件信息中的/dev/sda5表示逻辑分区,此处有两个虚拟的设备,一个是/dev/scd0,表示光驱;另一个是/dev/fd0,表示软驱。SWAP交换分区被挂载至/root/swapfile。
直接将Ubuntu安装在硬盘上的用户,可以看到硬盘分区的别名格式如下所示:
/dev/hda1
/dev/hda2
/dev/hda3
/dev/hda4
/dev/hda5
/dev/sdb1
其中,/dev/后面的部分表示一个具体的分区,hd表示IDE硬盘,sd表示SATA硬盘或者其他的外部设备,had中的第3位字母a表示这是该类型接口上的第1个设备。每一个IDE接口可以允许有两个设备,一个为主设备,另一个为从设备,可以分别用hda、hdb表示第1个IDE接口上的两个设备。
/dev/hda1~/dev/hda4都表示主分区,/dev/hda5表示该硬盘上的第1个逻辑分区。在Ubuntu中为了避免出现不必要的混乱,分区的顺序是不能随意改变的,分区的别名或标识由它们在硬盘中的位置决定。
6.1.2 磁盘分区规划方案
根据机器的不同使用领域,或要完成不同的主要任务,在规划磁盘空间的时候可以有多种方案。本小节对几种常用类型作一个推荐方案,读者可以根据自己的实际需要参考配置。
在介绍方案前,以IDE硬盘空间为80GB、内存为512MB的机器为例,读者根据自己电脑的硬件配置情况,按比例增减即可。以下介绍入门级、进阶使用、服务器常用的硬盘空间分区规划方案,这些都只是推荐方案,也就是目前用得比较多的配置方案,读者可以根据自己的需求来决定。
表6-2为入门级系统对硬盘分区规划的方案,表6-3为进阶级系统对硬盘分区规划的方案,表6-4为服务器系统对硬盘分区规划的方案。
6.1.3 磁盘管理方法
本小节讲解与磁盘管理相关的一系列shell命令的使用方法,其中有些命令是可以用在安装Ubuntu时进行分区控制和格式化分区的。
1.磁盘分区命令fdisk
用于硬盘分区,它采用传统的问答式界面。
语法:fdisk [参数]。
主要参数。
-b<分区大小>:指定每个分区的大小。
-l:列出指定的外围设备的分区表状况。
-s<分区编号>:将指定的分区大小输出到标准输出上,单位为区块。
-u:搭配“-l”参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址。
在安装Ubuntu时,可以用该命令对硬盘进行分区,如下所示:
root@jacky-desktop:~# fdisk /dev/hda //对IDE硬盘进行分区
root@jacky-desktop:~# fdisk /dev/sdb //对SCSI硬盘进行分区
在进行分区时,常用的子命令如下。
p:显示现有分区。
n:建立分区。
t:更改分区类型。
d:删除分区。
a:更改分区启动标志。
w:对分区的更改写入硬盘并退出。
q:不保存更改退出。
此外,该命令还常常用于列出磁盘分区信息,如下所示:
root@jacky-desktop:~# fdisk –l //列出当前操作系统的磁盘分区信息
Disk /dev/sda: 8589 MB, 8589934592 bytes //主分区大小为8589MB
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b8bf5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 993 7976241 83 Linux
/dev/sda2 994 1044 409657+ 5 Extended
/dev/sda5 994 1044 409626 82 Linux swap / Solaris
对于不同的机器,使用该命令看到的信息不一致。以笔者的机器为例,当前的主设备是/dev/sda,大小为8589MB,共有3个分区:sda1、sda2、sda5。
2.建立文件系统命令mkfs
该命令类似于Windows中的format,也就是针对某一分区,在它上面创建一个新的文件系统,或者可以看作是将该分区的文件系统格式化为指定的格式。在安装Ubuntu时,常常用在fdisk命令之后。在使用Ubuntu的过程中,如果要改变某一分区的文件系统格式,就必须先做好目标分区的文件的备份工作,再使用该命令。
语法:mkfs [参数] [-t 文件系统类型] [分区名称]。
主要参数。
fs:指定建立文件系统时的参数。
-V:显示版本信息和简要的使用方法,主要用于测试。
-v:显示版本信息和详细的使用方法。
如下所示:
root@jacky-desktop:~# mkfs –v //显示命令使用方法
Usage: mkfs.ext2 [-c|-l filename] [-b block-size] [-f fragment-size]
[-i bytes-per-inode] [-I inode-size] [-J journal-options]
[-N number-of-inodes] [-m reserved-blocks-percentage] [-o creator-os]
[-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
[-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
[-T fs-type] [-jnqvFSV] device [blocks-count]
root@jacky-desktop:~# mkfs –V //显示版本信息
mkfs (util-linux-ng )
root@jacky-desktop:~# mkfs -t ext3 /dev/sda3 //将/dev/sda3的文件系统建立为ext3类型
3.设置交换分区命令mkswap
语法:mkswap [参数] [设备或分区名称] [交换分区大小]。
主要参数。
-c:在建立交换分区前,检查块设备是否有损坏,如果有,将打印出来。
-f:在SPARC机器上建立交换分区时使用。
-v0:建立旧式的交换分区。
-v1:建立新式的交换分区。
[交换分区大小]的单位是1KB字节,即1024字节。
如下所示:
root@jacky-desktop:~# mkswap -c -v1 /dev/sda5 102400 //在/dev/sda5建立大小为100MB的交换分区,建立前先检查是否有损坏的区块
4.显示磁盘信息命令df
语法:df [参数] [设备或区块]。
主要参数。
-a:包含全部的文件系统。
--block-size=<区块大小>:以指定的区块大小来显示区块数目。
-h:以可读性较高的方式来显示信息。
-H:与-h参数相同,但在计算时是以1000 Bytes为换算单位,而非1024 Bytes。
-i:显示inode的信息。
-k:指定区块大小为1024字节。
-l:仅显示本地端的文件系统。
-m:指定区块大小为1048576字节。
-P:使用POSIX的输出格式。
-t <文件系统类型>:仅显示指定文件系统类型的磁盘信息。
-T:显示文件系统的类型。
-x <文件系统类型>:不要显示指定文件系统类型的磁盘信息。
--help 显示帮助。
如下所示:
root@jacky-desktop:~# df –a //显示所有的磁盘信息
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda1 7913216 2519676 4994728 34% /
proc 0 0 0 - /proc
/sys 0 0 0 - /sys
varrun 257788 108 257680 1% /var/run
varlock 257788 0 257788 0% /var/lock
udev 257788 44 257744 1% /dev
devshm 257788 12 257776 1% /dev/shm
devpts 0 0 0 - /dev/pts
lrm 257788 38684 219104 16% /lib/modules/-19-generic/volatile
securityfs 0 0 0 - /sys/kernel/security
gvfs-fuse-daemon 0 0 0 - /home/jacky/.gvfs
root@jacky-desktop:~# df –l //仅显示本地的文件系统信息
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda1 7913216 2519676 4994728 34% /
varrun 257788 108 257680 1% /var/run
varlock 257788 0 257788 0% /var/lock
udev 257788 44 257744 1% /dev
devshm 257788 12 257776 1% /dev/shm
lrm 257788 38684 219104 16% /lib/modules/-19-generic/volatile
root@jacky-desktop:~# df –i //显示索引结点信息
文件系统 Inode (I)已用 (I)可用 (I)已用% 挂载点
/dev/sda1 499712 113866 385846 23% /
varrun 64447 59 64388 1% /var/run
varlock 64447 1 64446 1% /var/lock
udev 64447 2819 61628 5% /dev
devshm 64447 2 64445 1% /dev/shm
lrm 64447 19 64428 1% /lib/modules/-19-generic/volatile
root@jacky-desktop:~# df -t ext3 //显示系统中ext3类型的分区信息
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda1 7913216 2519676 4994728 34% /
5.显示目录的容量du
语法:du [参数] [目标目录]。
主要参数。
-a:显示目录中所有文件的大小。
-b:显示目录或文件大小时,以Byte为单位。
-c:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-D:显示指定符号连接的源文件大小。
-h:以K、M、G为单位,提高信息的可读性。
-H:与-h参数相同,但是K、M、G是以1000为换算单位。
-k:以1024字节为单位。
-l:重复计算硬件连接的文件。
-L:显示选项中所指定符号连接的源文件大小。
-m:以1MB为单位。
-s:仅显示总计。
-S:显示个别目录的大小时,并不包含其子目录的大小。
-x:以一开始处理时的文件系统为准,若遇上其他不同的文件系统目录则略过。
-X:在<文件>指定目录或文件。
如下所示:
root@jacky-desktop:~# du -a /root //显示/root目录下每个文件的大小,以K为单位
4.0K /root/.recently-used.xbel
0 /root/.gconfd/saved_state
4.0K /root/.gconfd
4.0K /root/.gconf
8.0K /root/.bash_history
4.0K /root/.mozilla
4.0K /root/a.c
4.0K /root/.chewing/uhash.dat
8.0K /root/.chewing
8.0K /root/.viminfo
4.0K /root/b.c
4.0K /root/.synaptic/synaptic.conf
0 /root/.synaptic/lock.non-interactive
4.0K /root/.synaptic/log/.230901.log
4.0K /root/.synaptic/log/.030414.log
4.0K /root/.synaptic/log/.011620.log
16K /root/.synaptic/log
0 /root/.synaptic/lock
0 /root/.synaptic/options
24K /root/.synaptic
4.0K /root/.wapi
4.0K /root/.profile
4.0K /root/.rnd
4.0K /root/.scim/pinyin/pinyin_phrase_index
0 /root/.scim/pinyin/pinyin_phrase_lib
204K /root/.scim/pinyin/pinyin_table
0 /root/.scim/pinyin/phrase_lib
212K /root/.scim/pinyin
4.0K /root/.scim/sys-tables
220K /root/.scim
4.0K /root/.dbus/session-bus/a980aa904e30fe8d-0
8.0K /root/.dbus/session-bus
12K /root/.dbus
4.0K /root/.bashrc
4.0K /root/.gnome2_private
4.0K /root/.gnome2/accels
4.0K /root/.gnome2/yelp
4.0K /root/.gnome2/network-admin-locations
16K /root/.gnome2
344K /root
root@jacky-desktop:~# du -s /root //仅仅显示/root目录的总大小
344 /root