当Windows系统出现问题的时候,可能需要重装系统,这个时候我们往往会使用系统盘将系统重新安装在C盘上,其他盘上的文件都没有受到重装系统的影响,这就是分区的好处之一。同样,在Linux中也需要分区,但是Linux中对于分区的表示方式与Windows并不一样。下面将以我的电脑为例,讲述Liunx的分区方法并且通过讲述Linux的启动过程来了解Linux系统和挂载。(本文章适合初学Linux的同学学习)
1.基本概念
1.1.分区的概念
分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化。安装操作系统和软件之前,首先需要对硬盘进行分区和格式化,然后才能使用硬盘保存各种信息。各个分区之间是相对独立的,你在一个分区上的操作不会影响到另一个分区。
之前我们都会认为C盘就是第一分区,D盘就是第二分区。其实这种看法是不恰当的,C盘,D盘等都是盘符号,是Windows赋予的名称。在没有启动Windows之前,它们就是一个个分区,而不是具体的盘符。这种盘符的概念,是Windows“内在”的,也就是说就算是硬盘上没有安装Windows系统,硬盘上的分区还是存在的。所以可以这样说:盘符-是软件级的概念;分区-是硬件级的概念。
1.2.Linux文件系统的组织方式
Linux文件系统的组织方式称做文件系统分层标准,即采用层次式的树状目录结构。在此结构的最上层是根目录“/”,然后在此根目录下是其他的目录和子目录。Linux和Windows一样,采用“路径”来表示文件或目录在文件系统中所处的层次。路径由以“/”为分隔符的多个目录名字符串组成,分成绝对路径和相对路径。Linux中所谓绝对路径是指由根目录“/”为起点来表示系统中的某个文件或者目录的位置的方法;相对路径则是以当前目录为起点,表示系统中某个文件或者目录在文件系统中的位置的方法。例如(以我电脑为例):在终端输入pwd(Linux中的显示当前所在位置的命令),终端显示了“/home/csc”,这就是绝对路径。假如csc文件夹下有一个test文件夹,在终端输入"cdtest"(或者cd./test),test或者./test就是相对于csc文件夹的相对路径,其中“./”表示当前目录,通常可以省略。下面介绍一下Linux中部分目录及其功能说明(以便后面讲述Linux分区和启动过程)
/:Linux文件系统的最上层目录,其他所有目录均是该目录的子目录
/bin:Binary的缩写,存放用户的可执行程序,例如cp和mv等;也存放Shell,如bash和csh。不应把该目录放到一个单独的分区中,否则LinuxRescue模式无法使用这些命令。
/boot:内核就放在这里;操作系统启动时所需的文件,包括vmlinuz和initrd.img等,这些文件若损坏常会导致系统无法正常启动,因此最好不要做任意改动
/dev:设备文件目录,例如/dev/sda表示第一块SCSI设备,/dev/hda表示第一块IDE设备(后面会讲到Linux中对SCSI和IDE接口硬盘的表示方法)
/home:普通用户的主目录或FTP站点目录,一般存放在/home目录下。(想要了解Linux中其他默认目录中的功能,请查看:http://www.xtzj.com/read-htm-tid-69582.html)
1.3.Linux中的挂载点
Windows系统下的分区很明了,一个分区就是一个盘符。如果有可以兼容的文件系统,系统也可以读写那个分区。如果是不兼容的文件系统,Windows就会忽略这个分区。
Linux就是把所有的一切都放到一颗“大树”下。如果你有另外的分区或者硬盘,它们就会“挂载”到枝干的子目录中,例如/media或者/mnt目录,这个子目录就是所谓的挂载点,你可以将分区挂载到任意的目录中。
2.分区的建议
分区关系到一个系统的安全性和健壮性,当系统出现问题的时候,我们应该以最小的改动来完成系统的修复,这样就能减少不必要的损失。
在安装Linux系统时候,我将硬盘分为四个分区:第一个分区挂载在“/”目录下,第二个分区挂载在“/boot”下,第三个分区挂载在“/home”下,第四个分区是交换分区(Swap分区)
理由:
(1)一个根分区。根分区是挂载在“/”目录上的。用来存放系统文件。
(2)“/home”分区:这是用户的home目录所在地;它的大小取决于你的Linux系统有多少用户,以及这些用户将存放多少数据。当你系统受损需要重新安装的时候,不会影响到“/home”分区下的文件。
(3)“/boot”分区:包含了操作系统的内核和在启动系统过程中所要用到的文件。独立挂载/boot的好处是可以让多个Linux共享一个/boot。“/boot”目录的大小通常都很小,20MB左右。可以根据自己的硬盘空间分配一块给/boot分区,但是不要太大,否则是种浪费。
(4)一个交换(swap)分区。交换分区用来支持虚拟内存。如果你的计算机内存小于16MB,就必须创建交换分区。即使你有更多的内存,仍然推荐使用交换分区。物理内存小于或等于512MB,建议分配实际物理内存容量2倍大小的swap;物理内存大于512MB,建议分配与物理内存等容量的swap。
3.Linux的启动过程(以我的电脑为例)
系统的启动是从读取grub.cfg开始的(grub一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数)。grub.cfg文件的位置是在/boot/grub目录下。(如果电脑上安装的是双系统的话,也可以通过修改grub文件,来改变系统的启动顺序,等待时间等。)将文件打开后文件中有这么一段:
menuentry'Ubuntu,Linux2.6.32-33-generic' --class ubuntu --class gnu-linux --class gnu--class os {
recordfail
insmodext2
search--no-floppy --fs-uuid --set 089b3e37-bf9b-4811-94f8-b2f73fc313f6
linux /vmlinuz-2.6.32-33-genericroot=UUID=abdb3fa2-45cd-447d-8cc5-83cf326195bd ro quiet splash
initrd /initrd.img-2.6.32-33-generic
}
这是一个标准的ubuntu引导菜单,menuentry那一行显示了该项目的名称,insmod是Linux下的指令,是加载模块的意思。这里涉及到了分区的命名,下面就来了解一下:
Linux系统中存储设备的两种表示方法
(1)对于IDE接口的硬盘的两种表示方法
IDE接口中的整块硬盘在Linux系统中表示为/dev/hd[a-z],比如/dev/hda,/dev/hdb... ... 以此类推。另一种表示方法是hd[0-n],其中n是一个正整数,比如hd0,hd1,hd2... hdn ;如果机器中只有一块硬盘,无论(fdisk-l命令可查看硬盘及硬盘上的分区情况)列出的是/dev/hda还是/dev/hdb,都是hd0;如果机器中存在两个或两个以上的硬盘,第一个硬盘/dev/hda另一种方法表示为hd0,第二个硬盘/dev/hdb,另一种表示是hd1。
(2)IDE接口硬盘分区的两种表示方法
硬盘分区的第一种表示方法/dev/hd[a-z]X,X是一个从1开始的正整数;比如/dev/hda1,/dev/hda2.....,如果X的值是1到4,表示硬盘的主分区(包含扩展分区);逻辑分区从是从5开始的,比如/dev/hda5肯定是逻辑分区。
硬盘分区的第二种表示方法(hd[0-n],y),前面已经说过了整块硬盘也有两种表示方法,一种是/dev/hd[a-z]的,另一种方法是hd[0-n];一个硬盘分区首先要确认在哪个硬盘,然后再确认它所在的位置;所以我们要知道一个硬盘分区,除了知道/dev/hd[a-z]以外,还要知道他在哪个位置,确认了分区在/dev/hd[a-z]后,还要通过X来确认具体位置;y的值是/dev/hd[a-z]X中的X-1。
(3)关于SATA和SCSI接口的硬盘的两种表示方法
方法和IDE接口的硬盘相同,只是把hd换成sd。
下面通过实例来认识一下:在终端下输入fdisk-l命令(要在超级用户下查看):
Disk/dev/sda: 500.1 GB, 500107862016 bytes
255heads, 63 sectors/track, 60801 cylinders
Units= cylinders of 16065 * 512 = 8225280 bytes
Sectorsize (logical/physical): 512 bytes / 512 bytes
I/Osize (minimum/optimal): 512 bytes / 512 bytes
Diskidentifier: 0x48000000
DeviceBoot Start End Blocks Id System
/dev/sda1 * 1 13054 104856223+ 7 HPFS/NTFS
/dev/sda2 13055 60802 383529250+ f W95 Ext'd (LBA)
/dev/sda5 13055 32635 157284351 7 HPFS/NTFS
/dev/sda6 32636 52216 157284351 7 HPFS/NTFS
/dev/sda7 55329 55578 1998848 82 Linux swap / Solaris
/dev/sda8 55578 55640 498688 83 Linux
/dev/sda9 55640 60802 41459712 83 Linux
/dev/sda10 52217 55328 24996864 83 Linux
文件中的第一行:Disk/dev/sda: 500.1 GB, 500107862016 bytes,这个就是表示机器中只有一个硬盘设备/dev/sda,大小为500G;下面的就是硬盘的分区,每个分区都有详细的信息。
讲到这里,我们都会有点奇怪,既然上面说了IDE接口是hd表示,SATA和SCSI接口都是sd表示,那为什么grub文件有一行“setroot='(hd0,8)'”代码呢?不应该是“sd”吗?通过在网上查找的相关资料,对于grub文件来说,硬盘都是用hd表示的,磁盘号是从0开始计算的,分区号是则是从1开始计算的(grub2是从1开始计算的,grub1是从0开始计算的),而对于Linux内核来说,IDE硬盘是hd表示的,SATA硬盘是用sd表示的,磁盘序号从a开始计算的,分区号是从1开始计算的。我电脑中的Linux系统是Ubuntu10.04LTS版本,grub文件是grub2版本。所以grub文件中的(hd0,8)代表的是第一块硬盘上的第八个分区即sda8。
继续讲解上面的grub.cfg文件,search指令是寻找内核的意思,这就真正进入了Linux系统的引导过程,内核的存放位置是在/boot目录下。下面一行中的linux是一个指令,它告诉grub程序使用后面给出的内核,于是这个名为“vmlinuz-2.6.32-33-generic”的内核就被载入内存,并读取“root=UUID=abdb3fa2-45cd-447d-8cc5-83cf326195bd”这个分区的一些必要的文件。上段代码中的最后一行的命令的意思是:用名为“/initrd.img-2.6.32-33-generic”的文件先在内存中构造一个“虚拟”的根文件系统,以便于内核检测完硬件信息后载入必需的模块等等。grub的工作到此结束,下面将由Linux内核接管电脑的控制权,开始初始化阶段。到目前为止还没有挂载根分区。然后Linux系统会读取一个名为fstab的文件,并按照其中的指令逐行的执行,下面来看一下fstab文件(/etc/fstab)。以下是我的电脑中的fstab文件:
#/etc/fstab: static file system information.
#
#Use 'blkid -o value -s UUID' to print the universally uniqueidentifier
#for a device; this may be used with UUID= as a more robust way toname
#devices that works even if disks are added and removed. See fstab(5).
#
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
#/ was on /dev/sda10 during installation
UUID=abdb3fa2-45cd-447d-8cc5-83cf326195bd/ ext4 errors=remount-ro 0 1
#/boot was on /dev/sda8 during installation
UUID=089b3e37-bf9b-4811-94f8-b2f73fc313f6/boot ext4 defaults 0 2
#/home was on /dev/sda9 during installation
UUID=11ec48a8-5ca9-4e39-9bff-fd56b811d58e/home ext4 defaults 0 2
#swap was on /dev/sda7 during installation
UUID=2c80ec4a-769c-40c5-8d87-39a2332661cfnone swap sw 0 0
#号开头的行是注释,是说明性的文字,在执行指令的时候并不会执行它。
linux挂载分区的时候将自上而下,顺序执行。第一个起作用的行是proc,关于proc的介绍请查看http://dqw19880428.blog.163.com/blog/static/2051131620093144735924/
首先要将sda10挂载到”/”下,这就是linux最先被挂载的根分区;然后继续把sda8挂载到“/boot”,sda9挂载到“/home”下,sda7“挂载”到交换分区,这个交换分区有点特殊,因为他并没有被“附属”于/,而是独立使用的。
到此为止,Linux中系统用到的分区都已经挂载完毕。可以使用系统了。
4.手动挂载分区
有人会问,当我需要使用Windows下的分区时怎么办?能不能在Linux下挂载Windows分区呢?答案是肯定的,如果你使用的是桌面版的Ubuntu,并且是双系统,那么点击Linux中的“位置”->"计算机",里面就列出了Windows中的分区,点击右键,选择“挂载”就可以了,默认是挂载在media目录下,我们可以通过命令设定想要挂载的分区及其要挂在到的位置,比如,我想要挂载/dev/sda5分区,其文件系统格式是NTFS,把它挂载在/home/csc/music目录下。具体命令如下:
mount/dev/sda5 /home/csc/music
cd/home/csc/music
ls
执行上述命令,可以在music目录下查看sda5分区中的文件了。
卸载的命令也很简单,执行命令:umount/dev/sda(或者/home/csc/music)就OK了。
参考文献:
细说Linux挂载——mount:http://forum.ubuntu.org.cn/viewtopic.php?t=257333
Linuxproc:http://dqw19880428.blog.163.com/blog/static/2051131620093144735924/
Linux硬盘分区细节详谈:http://blog.csdn.net/freexploit/article/details/961330