红联Linux门户
Linux帮助

Linux下分区大小改变及fdisk应用

发布时间:2015-02-04 15:16:25来源:linux网站作者:linux人

实例解说Linux中fdisk分区使用方法

一、fdisk 的介绍
fdisk - Partition table manipulator for Linux ,译成中文的意思是磁盘分区表操作工具;本人译的不太好,也没有看中文文档;其实就是分区工具。
fdsik 能划分磁盘成为若干个区,同时也能为每个分区指定分区的文件系统,比如linux 、fat32、 linux 、linux swap 、fat16 以及其实类Unix类操作系统的文件系统等;当然我们用fdisk 对磁盘操作分区时,并不是一个终点,我们还要对分区进行格式化所需要的文件系统;这样一个分区才能使用;这和DOS中的fdisk 是类似的。

二、合理规划您的硬盘分区
在操作分区之前,我们要明白硬盘分区一点理论,比如硬盘容量和分区大小的计算;对一个硬盘如何规划分区等。

三、fdisk -l 查看硬盘及分区信息
我们知道主分区(包括扩展分区)的总个数不能超过四个;也不能把扩展分区包围在主分区之间;根据这个原则,我们划分硬盘分区就比较容易的多;也能为以后减少不必要的麻烦。
1、通过fdisk -l 查看机器所挂硬盘个数及分区情况
[root@localhost linuxidc.com]# fdisk -l
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
/dev/hda5 2806 3825 8193118+ 83 Linux
/dev/hda6 3826 5100 10241406 83 Linux
/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris
/dev/hda8 5199 6657 11719386 83 Linux
/dev/hda9 6658 7751 8787523+ 83 Linux
/dev/hda10 7752 9729 15888253+ 83 Linux
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux

通过上面的信息,我们知道此机器中挂载两个硬盘(或移动硬盘),其中一个是hda 另一个是sda ;如果我们想查看单个硬盘情况,可以通过 fdisk -l /dev/hda1 或者fdisk -l /dev/sda1 来操作;以fdisk -l 输出的硬盘标识为准。
其中 hda有三个主分区(包括扩展分区),分别是主分区 hda1 hda2 和hda3(扩展分区) ;逻辑分区是 hda5到hda10。
其中 sda 有两个主分区(包括扩展分区),分别是 sda1 和sda2 (扩展分区);逻辑分区是 sda5 sda6。
硬盘总容量=主分区(包括扩展分区)总容量
扩展分区容量=逻辑分区总容量
通过上面的例子,我们可以得知 hda=hda1+hda2+hda3,其中hda3=hda5+hda6+hda7+hda8+hda9+hda10 …… ……

2、关于fdisk -l 一些数值的说明
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
这个硬盘是80G的,有255个磁面;63个扇区;9729个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280 K(约为)=8.225280M(约为);
分区序列 引导 开始 终止 容量 分区类型ID 分区类型
Device Boot Start End Blocks Id System
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
/dev/hda5 2806 3825 8193118+ 83 Linux
/dev/hda6 3826 5100 10241406 83 Linux
/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris
/dev/hda8 5199 6657 11719386 83 Linux
/dev/hda9 6658 7751 8787523+ 83 Linux
/dev/hda10 7752 9729 15888253+ 83 Linux

说明:
硬盘分区的表示:在Linux 是通过hd*x 或 sd*x 表示的,其中 * 表示的是a、b、c …… …… x表示的数字 1、2、3 …… …… hd大多是IDE硬盘;sd大多是SCSI或移动存储;
引导(Boot):表示引导分区,在上面的例子中 hda1 是引导分区;
Start (开始):表示的一个分区从X cylinder(磁柱)开始;
End (结束):表示一个分区到 Y cylinder(磁柱)结束;
id和System 表示的是一个意思,id看起来不太直观,我们要在fdisk 一个分区时,通过指定id来确认分区类型;比如 7表示的就NTFS 分区;这个在fdisk 中要通过t功能来指定。下面的部份会提到;
Blocks(容量):这是我翻译的,其实不准确,表示的意思的确是容量的意思,其单位是K;一个分区容量的值是由下面的公式而来的;
Blocks = (相应分区End数值 - 相应分区Start数值)x 单位cylinder(磁柱)的容量
所以我们算一下 hda1的 Blocks 的大小 :
hda1 Blocks=(765-1)x8225.280=6284113.92 K = 6284.113.92M
注:换算单位以硬盘厂家提供的10进位算起,如果以操作系统二进制来算,这个分区容量应该更少一些,得出的这个值和我们通过 fdisk -l 看到的 /dev/hda1的值是大体相当的,因为换算方法不一样,所以也不可能尽可能的精确;再加上分区时的一点损失之类,有时或大或小是存在的;
我们查看分区大小或者文件的时候,还是用十进制来计算比较直观;推算办法是 byte 向前推小数点三位就是K ,K单位的值向前推小数点三位就是M,M向前推小数点三位就是G…… …… 一般也差不了多少;这么算就行;

3、估算一个存储设备是否被完全划分
我们估算一个硬盘是否完全被划分,我们只要看 fdisk -l 输出的内容中的 cylinders(柱体) 上一个分区的End 和下一个分区的Start是不是一个连续的数字,另外要看一下每个硬盘设备的fdisk -l 的开头部份,看一下他的 cylinders(柱体)的值;
比如hda设备,我们看到的是 9729 cylinders ;我们通过 hda的分区表可以看到上一个分区的End的值+1 就是下一个分区的Start 的值;比如 hda2的Start的值是 hda1 的End 的值+1,这证明 hda1 和hda2 中间没有空白分区,是连续的,以此类推;在 hda10,我们看到 End 的值是9729 ,而在fdisk -l头部信息中也有9729 cylinders,证明这个硬盘已经完全划分。
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
我们再看看 sda 移动储是不是被完全划分了;sda有 125个cylinders (柱体),有一个主分区和一个扩展分区构成;在扩展分区中,我们看到End的值为125,而这个移动硬盘的cylinder也是125,这能说明这个硬盘不可能再添加任何主分区了;根据我们上面所说的 sda1 sda2 sda5 sda6 之间未有任何未划分空间,但sda6 的cylinders (柱体)的End值却是 76 ,而 sda总的cylinders (柱体)有125个,由此看来sda 在 sda6后面有未划分区域。
至于sda 有多少未划分空间,我们算一下就知道了;扩展分区总容量是 806400 K ,大约是 806.400M左右,而逻辑分区 sda5 和sda6 的大小加起来是 400M左右,所以还仍有400M左右未划分空间,并且只能划分为链逻辑分区。

四、fdisk 对硬盘及分区的操作,进入fdisk 对硬盘操作阶段
我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了;通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到两个设备一个是/dev/hda ,另一个是/dev/sda ;
fdisk 操作硬盘的命令格式如下:
[root@localhost linuxidc.com]# fdisk 设备
比如我们通过 fdisk -l 得知 /dev/hda 或者 /dev/sda设备;我们如果想再添加或者删除一些分区,可以用
[root@localhost linuxidc.com]# fdisk /dev/hda

[root@localhost linuxidc.com]# fdisk /dev/sda
注 在以后的例子中,我们要以 /dev/sda设备为例,来讲解如何用fdisk 来操作添加、删除分区等动作。

1、fdisk 的说明;
当我们通过 fdisk 设备,进入相应设备的操作时,会发现有如下的提示;以 fdisk /dev/sda 设备为例,以下同。
[root@localhost linuxidc.com]# fdisk /dev/sda
Command (m for help): 在这里按m ,就会输出帮助;
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition 注:这是删除一个分区的动作;
l list known partition types 注:l是列出分区类型,以供我们设置相应分区的类型;
m print this menu 注:m 是列出帮助信息;
n add a new partition 注:添加一个分区;
o create a new empty DOS partition table
p print the partition table 注:p列出分区表;
q quit without saving changes 注:不保存退出;
s create a new empty Sun disklabel
t change a partition's system id 注:t 改变分区类型;
u change display/entry units
v verify the partition table
w write table to disk and exit 注:把分区表写入硬盘并退出;
x extra functionality (experts only) 注:扩展应用,专家功能;

其实我们常用的只有注有中文的,其它的功能我们不常用(呵,主要是我不会用,否则早会卖弄一下了);x扩展功能,也不是常用的;一般的情况下只要懂得 d l m p q t w 就行了;下面以实例操作来详述,没有例子没有办法就,新手也看不懂。

2、列出当前操作硬盘的分区情况,用p
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux

3、通过fdisk的d指令来删除一个分区
Command (m for help): p 注:列出分区情况;
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
Command (m for help): d 注:执行删除分区指定;
Partition number (1-6): 6 注:我想删除 sda6 ,就在这里输入 6 ;
Command (m for help): p 注:再查看一下硬盘分区情况,看是否删除了?
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
Command (m for help):
警告:删除分区时要小心,请看好分区的序号,如果您删除了扩展分区,扩展分区之下的逻辑分区都会删除;所以操作时一定要小心;如果知道自己操作错了,请不要惊慌,用q不保存退出;切记切记!!!!在分区操作错了之时,千万不要输入w保存退出!!!

4、通过fdisk的n指令增加一个分区
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
Command (m for help): n 注:增加一个分区;
Command action
l logical (5 or over) 注:增加逻辑分区,分区编号要大于5;为什么要大于5,因为已经有sda5了;
p primary partition (1-4) 注:增加一个主分区;编号从 1-4 ;但sda1 和sda2都被占用,所以只能从3开始;
p
Partition number (1-4): 3
No free sectors available 注:失败中,为什么失败?
注:我试图增加一个主分区,看来是失败了,为什么失败?因为我们看到主分区+扩展分区把整个磁盘都用光了,看扩展分区的End的值,再看一下 p输出信息中有125 cylinders;最好还是看前面部份;那里有提到;

所以我们只能增加逻辑分区了
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l 注:在这里输入l,就进入划分逻辑分区阶段了;First cylinder (51-125, default 51): 注:这个就是分区的Start 值;这里最好直接按回车,如果您输入了一个非默认的数字,会造成空间浪费。
Using default value 51
Last cylinder or +size or +sizeM or +sizeK (51-125, default 125): +200M 注:这个是定义分区大小的,+200M 就是大小为200M ;当然您也可以根据p提示的单位cylinder的大小来算,然后来指定 End的数值。回头看看是怎么算的;还是用+200M这个办法来添加,这样能直观一点。如果您想添加一个10G左右大小的分区,请输入 +10000M 。
Command (m for help):

5、通过fdisk的t指令指定分区类型
Command (m for help): t 注:通过t来指定分区类型;
Partition number (1-6): 6 注:要改变哪个分区类型呢?我指定了6,其实也就是sda6
Hex code (type L to list codes):L 注:在这里输入L,就可以查看分区类型的id了;
Hex code (type L to list codes): b 注:如果我想让这个分区是 W95 FAT32 类型的,通过L查看得知 b是表示的是,所以输入了b;
Changed system type of partition 6 to b (W95 FAT32) 注:系统信息,改变成功;是否是改变了,请用p查看。
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 75 201568+ b W95 FAT32

6、fdisk 的退出,用q或者 w
其中 q是 不保存退出,w是保存退出。
Command (m for help): w

Command (m for help): q

7、一个添加分区的例子;
本例中我们会添加两个200M的主分区,其它为扩展分区,在扩展分区中我们添加两个200M大小的逻辑分区。
Command (m for help): p 注:列出分区表;
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
Command (m for help): n 注:添加分区;
Command action
e extended
p primary partition (1-4)
p 注:添加主分区;
Partition number (1-4): 1 注:添加主分区1;
First cylinder (1-125, default 1): 注:直接回车,主分区1的起始位置;默认为1,默认就好;
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-125, default 125): +200M 注:指定分区大小,用+200M来指定大小为200M
Command (m for help): n 注:添加新分区;
Command action
e extended
p primary partition (1-4)
p 注:添加主分区
Partition number (1-4): 2 注:添加主分区2;
First cylinder (26-125, default 26):
Using default value 26
Last cylinder or +size or +sizeM or +sizeK (26-125, default 125): +200M 注:指定分区大小,用+200M来指定大小为200M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e 注:添加扩展分区;
Partition number (1-4): 3 注:指定为3 ,因为主分区已经分了两个了,这个也算主分区,从3开始;
First cylinder (51-125, default 51): 注:直接回车;
Using default value 51
Last cylinder or +size or +sizeM or +sizeK (51-125, default 125): 注:直接回车,把其余的所有空间都给扩展分区;
Using default value 125
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ 83 Linux
/dev/sda2 26 50 201600 83 Linux
/dev/sda3 51 125 604800 5 Extended
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l 注:添加逻辑分区;
First cylinder (51-125, default 51):
Using default value 51
Last cylinder or +size or +sizeM or +sizeK (51-125, default 125): +200M 注:添加一个大小为200M大小的分区;
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l 注:添加一个逻辑分区;
First cylinder (76-125, default 76):
Using default value 76
Last cylinder or +size or +sizeM or +sizeK (76-125, default 125): +200M 注:添加一个大小为200M大小的分区;
Command (m for help): p 列出分区表;
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ 83 Linux
/dev/sda2 26 50 201600 83 Linux
/dev/sda3 51 125 604800 5 Extended
/dev/sda5 51 75 201568+ 83 Linux
/dev/sda6 76 100 201568+ 83 Linux
然后我们根据前面所说通过t指令来改变分区类型;最后不要忘记w保存退出。

五、对分区进行格式化,以及加载
先提示一下;用 mkfs.bfs mkfs.ext2 mkfs.jfs mkfs.msdos mkfs.vfatmkfs.cramfs mkfs.ext3 mkfs.minix mkfs.reiserfs mkfs.xfs 等命令来格式化分区,比如我想格式化 sda6为ext3文件系统,则输入:
[root@localhost linuxidc.com]# mkfs.ext3 /dev/sda6
如果我想加载 sda6到目前系统来存取文件,应该有mount 命令,但首先您得建一个挂载目录;比如 /mnt/sda6 ;
[root@localhost linuxidc.com]# mkdir /mnt/sda6
[root@localhost linuxidc.com]# mount /dev/sda6 /mnt/sda6
[root@localhost linuxidc.com]# df -lh
Filesystem 容量 已用 可用 已用% 挂载点
/dev/hda8 11G 8.4G 2.0G 81% /
/dev/shm 236M 0 236M 0% /dev/shm
/dev/hda10 16G 6.9G 8.3G 46% /mnt/hda10
/dev/sda6 191M 5.6M 176M 4% /mnt/sda6

这样我们就能进入 /mnt/sda6目录,然后存取文件了,具体的权限方法,以及mount 更详细的用法,在以后我会专门写一个帖子;在一帖中放下所有的内容实在有点为难。

Linux的swap分区大小的调整
添加swap 空间:通过创建swap文件的方法,通过分区来扩建。
方法1:通过创建swap文件的方法
1.创建swap 文件
#dd if=/dev/zero of=/swap/swapfile bs=1024 count=500000 (创建500M大小的swap文件,swap文件存放在of的位置)。

2.格式化交换分区文件
#mkswap /swap/swapfile

3.启用交换分区文件
#swapon /swap/swapfile

4.查看相关的状态
#swapon -s

5.在/etc/fstab中增加以下内容,以便系统每次启动都把/swap/swapfile 作为swap 使用
/swap/swapfile     swap      swap     default    0  0
关闭刚开辟的swap空间,只需命令:#swapoff

方法2:使用分区作为swap
1.使用fdisk 命令把/sdd1 分区转换为swap分区
# fdisk /dev/sdd1   t -》82 -》w

2.格式化分区
#mkswap /dev/sdd1

3.在/etc/fstab 中加载分区
/dev/sdd1     swap    swap   defaults 0 0

4.启用交换分区
#Swapon –a

5.检查swap情况
#swapon –s

测试试境为RH AS4
如果你不清楚swap到底是什么,或分区的概念,那么下面的过程对你来讲可能会有一定的风险。自己扩大Swap也是比较方便的。你必须有root权限,过程中一定要很小心,一不小心就破坏了整个硬盘的数据,执行下面的过程之前你需要三思而行,错误后的后果由执行者自己承担,我这个script只是作为参考。
1.以root进入控制台
2. #swapoff -a             #停止交换分区
3. #fdisk /dev/hda         #swap所在硬盘的硬盘设备文件,可能会有所不同,你最好察看/etc/fstab 将有swap这一行的hd*后面的数字去掉
4. 在fdisk里自己操作,用d先删除swap分区,然后再n添加分区(添加时硬盘必须要有可用空间,空间大小的参数是柱面数cylinders,不是字节,你需要自己计算,p命令可以看到每柱面的字节数),然后再用t将新添的分区id改为82(linux swap类型),每一步后都用w将操作实际写入硬盘(没用w之前你的操作无效)。再说一遍,这步必须非常小心,一弄错你的系统可能就坏了,数据丢失。
5. #mkswap /dev/hda6         #格式化swap分区,这里的hda6要看你加完后p命令显示的实际分区设备名
6. #swapon /dev/hda6         #看是否可以启动新的swap分区
7. 修改/etc/fstab 中swap这一行的设备名如/dev/hda6(如果你没改变位置,一般是和以前一样的),让它启动时自己加载。需要注意的是,如果你这里原来是一个 LABEL=SWAP-hda6这样的东西,那么你有两个选择:第一.将它改成实际的设备名,如:/dev/hda6。第二.不改变/etc /fstab,在第5步中用的命令行需要稍有不同 #mkswap -L SWAP-hda6 /dev/hda6 就是说格式化时为swap分区加上LABEL,该功能只有在新的发行中才支持,可以用mkswap --help察看它是否支持-L option.
8.重启,一切ok

改变Linux分区大小
一般来说,Linux系统根分区(一般是Ext2、Ext3、ReiserFS格式)是无法改变容量的,这一点与Windows下的FAT32、NTFS 颇有不同。我曾经试了一下,不但改变容量不行,移动分区位置更是不行,启动时无法进入系统,或者在GDM处出错。但有一种方法可以却实现上述目的,我在 Ubuntu 7.04下试验成功:
1、用Ghost工具将Linux根分区备份为镜像。ghost是windows下常用的软件,其备份效率和压缩比都比较高,一般来说 ghost8.0以上的版本对linux分区支持较好,推荐使用ghost11。用ghost备份linux分区速度比备份windows分区要慢一半,用最高压缩比一般在400M/S左右,还可以接受,等待10几分钟也就完成了。用linux的人最喜欢的还是直接用tar命令备份重要数据,但个人觉得还是用ghost彻底备份比较好,免得硬盘损坏无法恢复全部数据。
2、用paragon patition mamager 调整linux根分区容量,无论是从前面还是从后面增减都可以,一般来说保留10G刚好。当然你也可以用PQmagic来执行调整,我没试过,不过应该没有什么问题。其实因为要移动数据,采用调整的方式速度很慢,而且事实上调整之后也不能进入系统,所以不如干脆删除,重建更快,但要注意别误操作,删除 windows分区就叫天天不应了。

3、用Ghost将以前备份的镜像还原到调整后的新分区,重新启动,结果顺利引导进入Ubuntu,但你会发现一个新的问题,就是Ubuntu自动挂载的windows分区有可能不见了。其实不变linux分区,调整windows分区也会导致挂载失效。
4、由于Ubuntu是工具硬盘分区的UUID进行挂载的,因而,硬盘分区的位置发生变化,挂载就自然失效了,别着急,可以重新挂载。打开终端,输入 “sudo ls -l /dev/disk/by-uuid”,可以显示当前硬盘各个分区的UUID,再在终端里输入“sudo gedit /etc/fstab”打开fstab,将不能挂载的分区UUID替换成刚得到的UUID,保存并关闭fstab,重启系统就可以了。

这个方法比较安全、实用,使你辛辛苦苦配置起来的系统不至于要重新安装,而且备份的ghost镜像随时可用来恢复系统,一点无用功都没有做。
查看系统中的 LABEL/ UUID
使用 blkid 命令:
用法(LABEL):

# blkid -s LABEL
/dev/hda3: LABEL="/"
/dev/hda1: LABEL="/boot1"
/dev/hda2: LABEL="SWAP-hda2"
/dev/hdc1: LABEL="/boot9"
/dev/hdc2: LABEL="/vm"
/dev/hdc3: LABEL="/home9"
/dev/hdc5: LABEL="/9"
/dev/hdc6: LABEL="/var/ftp/pub9"
/dev/hdc8: LABEL="/boot"
/dev/hdc9: LABEL="/1"

用法(UUID):
# blkid -s UUID
/dev/hda3: UUID="440612e0-9cea-4751-8e59-07ebffc589c2"
/dev/hda1: UUID="027ecc62-d346-411d-ae6c-c3eaa87fb195"
/dev/hdc1: UUID="fdbe6b52-755f-4e14-b970-b3be01543acc"
/dev/hdc2: UUID="e61f4197-5f00-4f4f-917c-290922a85339"
/dev/hdc3: UUID="06679282-4973-476a-98ae-4986f504816f"
/dev/hdc5: UUID="51f7e9a4-5154-4e29-a7a6-208417290b85"
/dev/hdc6: UUID="4bf4855e-96b9-43c4-89d7-b3d0087560e1"
/dev/hdc8: UUID="5a15d9d7-5a17-4d71-a2b6-eb978e6905cd"
/dev/hdc9: UUID="dc348785-9acb-4484-b52a-da000ffba601"

改变 LABEL 名称
Ext2 或 Ext3
打「e2label 装置档案 [label]」,例如把 /dev/sda1 命名为 /boot:
e2label /dev/sda1 /boot
或者使用「tune2fs -L label 装置档案」,例如把 /dev/sda1 命名为 /boot:
tune2fs -L /boot /dev/sda1

在 mount 命令中使用 LABEL/UUID
mount LABEL=/boot1 /boot
mount UUID="51f7e9a4-5154-4e29-a7a6-208417290b85" /mnt/
在 /etc/fstab 中使用 LABEL/UUID
档案/etc/fstab
LABEL=/                                        /        ext3    defaults   1   1
LABEL=/boot1                                   /boot    ext3    defaults   1   2
UUID="e61f4197-5f00-4f4f-917c-290922a85339"   /usr     ext3    defaults   1   12

debain中的fstab和grub的变化,使用了UUID
代码:
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
#             
proc            /proc           proc    defaults        0       0
# /dev/sda1 -- converted during upgrade to edgy
UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c / reiserfs defaults 0 1
# /dev/sda3 -- converted during upgrade to edgy
UUID=6b4fad21-6ce4-40d1-9042-f7894420d2ba /boot ext3 defaults 0 2
# /dev/sda4 -- converted during upgrade to edgy
UUID=c9946833-d79a-49d2-a565-2eb5f81b1340 /home reiserfs defaults 0 2
# /dev/sdb1 -- converted during upgrade to edgy
UUID=6884DF8584DF5462 /media/sdb1 ntfs defaults,nls=utf8,umask=007,gid=46 0 1
# /dev/sdb2 -- converted during upgrade to edgy
UUID=6f796414-ca8c-467a-8bdf-8690eee8a147 /media/sdb2 xfs defaults 0 2
# /dev/sdb3 -- converted during upgrade to edgy
UUID=4466-DBF1 /media/sdb3 vfat defaults,utf8,umask=007,gid=46 0 1
# /dev/sda2 -- converted during upgrade to edgy
UUID=52fac974-9ebd-4355-8bca-82a8e6763ba3 none swap sw 0 0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0

代码:
$ cat /boot/grub/menu.lst
# menu.lst - See: grub(8), info grub, update-grub(8)
#            grub-install(8), grub-floppy(8),
#            grub-md5-crypt, /usr/share/doc/grub
#            and /usr/share/doc/grub-doc/.

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default         0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout         10

## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
#hiddenmenu

## password ['--md5'] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line)  and entries protected by the
# command 'lock'
# e.g. password topsecret
#      password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret

#
# examples
#
# title         Windows 95/98/NT/2000
# root          (hd0,0)
# makeactive
# chainloader   +1
#
# title         Linux
# root          (hd0,1)
# kernel        /vmlinuz root=/dev/hda2 ro
#

#
# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST
### BEGIN AUTOMAGIC KERNELS LIST
## lines between the AUTOMAGIC KERNELS LIST markers will be modified
## by the debian update-grub script except for the default options below

## DO NOT UNCOMMENT THEM, Just edit them to your needs

## ## Start Default Options ##
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
##      kopt_2_6_8=root=/dev/hdc1 ro
##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro

## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,2)

## should update-grub create alternative automagic boot options
## e.g. alternative=true
##      alternative=false
# alternative=true

## should update-grub lock alternative automagic boot options
## e.g. lockalternative=true
##      lockalternative=false
# lockalternative=false

## additional options to use with the default boot option, but not with the
## alternatives
## e.g. defoptions=vga=791 resume=/dev/hda5
# defoptions=quiet splash

## should update-grub lock old automagic boot options
## e.g. lockold=false
##      lockold=true
# lockold=false

## altoption boot targets option
## multiple altoptions lines are allowed
## e.g. altoptions=(extra menu suffix) extra boot options
##      altoptions=(single-user) single
# altoptions=(recovery mode) single

## controls how many kernels should be put into the menu.lst
## only counts the first occurence of a kernel, not the
## alternative kernel options
## e.g. howmany=all
##      howmany=7
# howmany=all

## should update-grub create memtest86 boot option
## e.g. memtest86=true
##      memtest86=false
# memtest86=true

## should update-grub adjust the value of the default booted system
## can be true or false
# updatedefaultentry=false

## ## End Default Options ##

title           Ubuntu, kernel 2.6.17-10-386
root            (hd0,2)
kernel          /vmlinuz-2.6.17-10-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro quiet splash
initrd          /initrd.img-2.6.17-10-386
savedefault
boot

title           Ubuntu, kernel 2.6.17-10-386 (recovery mode)
root            (hd0,2)
kernel          /vmlinuz-2.6.17-10-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro single
initrd          /initrd.img-2.6.17-10-386
boot

title           Ubuntu, kernel 2.6.17-10-generic
root            (hd0,2)
kernel          /vmlinuz-2.6.17-10-generic root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro quiet splash
initrd          /initrd.img-2.6.17-10-generic
savedefault
boot

title           Ubuntu, kernel 2.6.17-10-generic (recovery mode)
root            (hd0,2)
kernel          /vmlinuz-2.6.17-10-generic root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro single
initrd          /initrd.img-2.6.17-10-generic
boot

title           Ubuntu, kernel 2.6.15-27-386
root            (hd0,2)
kernel          /vmlinuz-2.6.15-27-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro quiet splash
initrd          /initrd.img-2.6.15-27-386
savedefault
boot

title           Ubuntu, kernel 2.6.15-27-386 (recovery mode)
root            (hd0,2)
kernel          /vmlinuz-2.6.15-27-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro single
initrd          /initrd.img-2.6.15-27-386
boot

title           Ubuntu, kernel 2.6.15-26-386
root            (hd0,2)
kernel          /vmlinuz-2.6.15-26-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro quiet splash
initrd          /initrd.img-2.6.15-26-386
savedefault
boot

title           Ubuntu, kernel 2.6.15-26-386 (recovery mode)
root            (hd0,2)
kernel          /vmlinuz-2.6.15-26-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro single
initrd          /initrd.img-2.6.15-26-386
boot

title           Ubuntu, kernel 2.6.16-28-386
root            (hd0,2)
kernel          /vmlinuz-2.6.16-28-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro quiet splash
initrd          /initrd.img-2.6.16-28-386
savedefault
boot

title           Ubuntu, kernel 2.6.16-28-386 (recovery mode)
root            (hd0,2)
kernel          /vmlinuz-2.6.16-28-386 root=UUID=d72fd170-80fb-43da-b079-e51cd1a06a7c ro single
initrd          /initrd.img-2.6.16-28-386
boot

title           Ubuntu, memtest86+
root            (hd0,2)
kernel          /memtest86+.bin
boot

### END DEBIAN AUTOMAGIC KERNELS LIST
# This is a divider, added to separate the menu items below from the Debian
# ones.
title           Other operating systems:
root

# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/sdb1
title           Microsoft Windows XP Professional
root            (hd1,0)
savedefault
makeactive
map             (hd0) (hd1)
map             (hd1) (hd0)
chainloader     +1

Linux使用UUID

在Ubuntu中可以发现
proc /proc proc defaults 0 0
# Entry for /dev/sda2 :
UUID=0e4aa4fb-46cf-4b5e-9dad-cc9e7eeda693 / reiserfs defaults 0 1
# Entry for /dev/sda1 :
UUID=a56f8c86-92b7-4de8-a9dd-f959bacce64e /boot reiserfs notail 0 2
# Entry for /dev/sda3 :
UUID=abd8bfbe-006c-44f9-aa91-720bc9b4ab5c /home reiserfs defaults 0 2
# Entry for /dev/sda4 :
UUID=c26ad5ec-652d-48aa-a33c-bcafde4451f7 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0

本来device被对应成UUID,那么如何取得UUID呢?
ls -l /dev/disk/by-uuid

接着可能下一个疑问就是,为何要用UUID,请参考
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/zh_tw/admin-guide/s1-storage-rhlspec.html
底下是部份节录,如果你使用随身硬盘,里面装的是过去window$的分割区,你会发现,你可能会有auto-mount顺序的问题,如果改写fstab,然后用UUID。由于新增或移除储存装置,会导致现有装置的文件名称跟着变动,所以当系统重开机之后,可能会面临储存装置无法存取的命运。底下一连串动作,就有可能导致这样的结果:
1.系统管理者加装一张 SCSI 控制卡,并在上面接了两颗新的硬盘(现有的 SCSI 卡已经接满了)。
2.旧的 SCSI 硬盘(包括卡上接的第一颗硬盘 /dev/sda)不做任何更动。
3.重开机
4.因为新 SCSI 适配卡上的第一颗硬盘叫做 /dev/sda,所以先前叫做 /dev/sda 的 SCSI 硬盘得有个新名字

理论上,这听起来是个大问题;不过事实上不会那么严重。第一,这种硬件变动很少出现。第二,系统管理者多半会停机一阵子,好更动系统;停机时间需要事先仔细规划,以免超出预计的时间,影响正常运作。这事先规划的好处,则是让管理者评估任何装置名称改变,可能带来的问题。然而有些企业与系统设定就可能遇到这麻烦。常常更动储存环境,以符合某些需求的公司,有时候就不容许任何停机时间。像「热插拔(hotpluggable)」这种硬件就很容易安装或移除;但在这种环境下,装置的命名问题,就常常会带来问题。幸好 Red Hat Enterprise Linux 的功能,可以降低这类问题发生的机会。

档案系统的卷标
有些档案系统(这部份将在第 5.9.2 节讨论)包含一组独一无二的「标签(label)」 — 用来分辨档案系统所储存的数据。当挂载档案系统时,就可以利用这卷标,减低使用装置名称的需求。
档案系统卷标用起来不错;不过这标签一定要独一无二。如果同一台计算机里,有两个以上的重复标签,您就没办法用这方式存取硬盘。同时要注意的是,有些系统设定并不使用档案系统(例如某些数据库),就不能享受标签的好处。

使用 devlabel
devlabel 指令会以另一种方式解决装置的命名问题。Red Hat Enterprise Linux 开机时(以及使用者新增或移除热插拔装置时),会自动执行 devlabel。
devlabel 执行时,会从设定文件(/etc/sysconfig/devlabel)读取装置清单。每个清单上的装置,都有个(由系统管理者所选定的)symbolic link,以及该装置的 UUID(通用唯一识别码,Universal Unique IDentifier)。
devlabel 指令能确保 symbolic link 永远指向原始的装置 — 即使装置名称改变也没关系。这样一来,系统管理者就能使用像 /dev/projdisk 之类的名称,而不是 /dev/sda12。
因为 UUID 直接来自硬件,所以 devlabel 只要在系统中,寻找相符合的 UUID,并更新 symbolic link 即可。
要了解更多 devlabel 的信息,请参阅《Red Hat Enterprise Linux 系统管理手册》。
不过话说回来,人们对于使用UUID的褒贬不一,有人说以前的/dev/sda之类的方式还很清楚,改成UUID这一串长长的字符串,反而不容易辨识。
--------------------------------------------
Command (m for help):
按m是显示命令帮助

出现如下界面
Command action
a  toggle a bootable flag                      设置引导扇区
b  edit bsd disklabel                          编辑卷标(linux下使用的卷标bsd通用)
c  toggle the dos compatibility flag       
d  delete a partition                          删除一个分区
l  list known partition types                  列出已知分区类型
m  print this menu                            显示该菜单
n  add a new partition                        添加一个新分区
o  create a new empty DOS partition table   
p  print the partition table                  显示分区表
q  quit without saving changes                保存不退出
s  create a new empty Sun disklabel     
t  change a partition's system id              修改分区类型
u  change display/entry units           
v  verify the partition table
w  write table to disk and exit                写入磁盘退出分区程序
x  extra functionality (experts only)