一、问题:
一台Linux开发主机在安装时/home没有独立分区,随着用户不断增多,经常因根分区磁盘空间耗尽而故障频发。
二、方案:
为了解决这些问题,现要新增加一块SCSI 硬盘,并将用户目录“/home”中的数据迁移到该硬盘中。
1.添加一块80GB的SCSI接口的新硬盘,从中划分出一个20GB的主分区。
2.将新划出的20GB的分区格式化为EXT3文件系统,替换掉现有的/home目录。
3.迁移后不影响系统原有用户账号的使用。
4.从其余空间中划出2GB逻辑分区作交换空间、划出10GB逻辑分区作FAT32分区。
三、实现:
1、查看当前磁盘的磁盘分区情况
1)直接通过“fdisk -l”查看
[root@localhost ~]# fdisk -l
Disk /dev/sda: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2563 20482875 83 Linux
/dev/sda3 2564 2818 2048287+ 82 Linux swap / Solaris
/dev/sda4 2819 10443 61247812+ 5 Extended
/dev/sda5 2819 10443 61247781 83 Linux
2)通过“fdisk 磁盘设备”查看
(常用的fdisk交互指令如图所示)
root@localhost ~]# fdisk /dev/sda
然后会进入到fdisk的交互式程序界面,输入指令p可查看分区情况:
The number of cylinders for this disk is set to 10443.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/sda: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2563 20482875 83 Linux
/dev/sda3 2564 2818 2048287+ 82 Linux swap / Solaris
/dev/sda4 2819 10443 61247812+ 5 Extended
/dev/sda5 2819 10443 61247781 83 Linux
关于fdisk交互的操作指令,可根据提示输入指令m获得。
Command (m for help): m //执行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 //已知的分区类型
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)
2,为RHEL5虚拟机添加一块新磁盘
1)添加磁盘
将虚拟机关闭电源,通过“编辑虚拟机设置”-->“添加”-->“硬盘”-->“创建一个新的磁盘”-->“SCSI(建议)”-->“磁盘大小”设为80GB-->“完成”,最终添加一块容量为80GB的SCSI接口的虚拟磁盘,如图所示
2)识别新磁盘
重新打开虚拟机电源,登入Linux系统,执行fdisk -l确认新识别的硬盘。一般是硬盘序号靠后的,没有包含任何分区的空磁盘就是,比如/dev/sdb:
[root@localhost ~]# fdisk -l
Disk /dev/sda: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2563 20482875 83 Linux
/dev/sda3 2564 2818 2048287+ 82 Linux swap / Solaris
/dev/sda4 2819 10443 61247812+ 5 Extended
/dev/sda5 2819 10443 61247781 83 Linux
Disk /dev/sdb: 85.8 GB, 85899345920 bytes //新增加的磁盘
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table //提示没有有效的分区表
3.为新增加的磁盘/dev/sdb规划分区
1)执行“fdisk /dev/sdb”命令进入分区界面:
[root@localhost ~]# fdsik /dev/sdb
bash: fdsik: command not found
[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 10443.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): //等待输入交互指令
输入p指令后按Enter键,可列出当前的分区表,可以看到还没有任何分区:
Command (m for help): p //查看分区表
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
2)创建第一个主分区 /dev/sdb1
执行n指令以新建分区:
Command (m for help): n //n 新建分区
Command action
e extended
p primary partition (1-4)
根据提示执行 p 指令,表示要新建一个主分区(若按e表示新建扩展分区);然后依次输入分区序号 1、起始柱面(默认)、结束柱面 +20G:
p //新建一个主分区
Partition number (1-4): 1
First cylinder (1-10443, default 1): //使用的分区序号
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-10443, default 10443): +20G
设置完毕又回到等待状态,再次执行 p 指令可确认刚新建的分区/dev/sdb1:
Command (m for help): p
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
3)创建第二个主分区/dev/sdb2
再次执行n 指令以新建分区
Command (m for help): n
Command action
e extended
p primary partition (1-4)
根据提示再次执行 p 指令,表示要新建的还是一个主分区;然后依次输入分区序号 2、起始柱面(默认)、结束柱面 +20G:
p
Partition number (1-4): 2
First cylinder (2434-10443, default 2434):
Using default value 2434
Last cylinder or +size or +sizeM or +sizeK (2434-10443, default 10443): +20G
执行p指令确认新的分区结果,可看到新划分出的/dev/sdb2:
Command (m for help): p
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
/dev/sdb2 2434 4866 19543072+ 83 Linux
4)新建扩展分区/dev/sdb4
再次执行p指令以新建分区:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
此时选e表示将选择建扩展分区;接下来分区序号选4(四个主分区位置就只剩下3和4可选,任用其中一个)、起始柱面(默认)、结束柱面(默认),将剩余的全部空间都分给扩展分区:
e
Partition number (1-4): 4 //使用的分区序号
First cylinder (4867-10443, default 4867):
Using default value 4867
Last cylinder or +size or +sizeM or +sizeK (4867-10443, default 10443):
执行p指令确认新的分区结果,可看到新增加的扩展分区 /dev/sdb4:
Command (m for help): p
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
/dev/sdb2 2434 4866 19543072+ 83 Linux
/dev/sdb4 4867 10443 44797252+ 5 Extended
5)新建逻辑分区 /dev/sdb5、/dev/sdb6
再次执行n指令以新建分区:
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
此时因为扩展分区已建立,所以不再提供e可选,而是变为l(逻辑分区),p 虽然还可选,但实际上已经没有可分配空间了,选了也没用。
别无选择,只有选l,表示将要建立一个逻辑分区(容量2GB):
l
First cylinder (4867-10443, default 4867):
Using default value 4867
Last cylinder or +size or +sizeM or +sizeK (4867-10443, default 10443): +2G
继续再建立另一个10GB的逻辑分区:
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (5111-10443, default 5111):
Using default value 5111
Last cylinder or +size or +sizeM or +sizeK (5111-10443, default 10443): +10G
执行 p 指令确认分区结果,可看到新增加的逻辑分区 /dev/sdb5、/dev/sdb6:
Command (m for help): p
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
/dev/sdb2 2434 4866 19543072+ 83 Linux
/dev/sdb4 4867 10443 44797252+ 5 Extended
/dev/sdb5 4867 5110 1959898+ 83 Linux
/dev/sdb6 5111 6327 9775521 83 Linux
6)修改分区 /dev/sdb5、/dev/sdb6 的类型标识
执行 l 指令以列出已知的16进制分区类型代码(EXT为83、交换分区为82、FAT32大分区为c):
Command (m for help): l
0 Empty 1e Hidden W95 FAT1 80 Old Minix bf Solaris
1 FAT12 24 NEC DOS 81 Minix / old Lin c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 82 Linux swap / So c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c7 Syrinx
5 Extended 41 PPC PReP Boot 85 Linux extended da Non-FS data
6 FAT16 42 SFS 86 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set de Dell Utility
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext df BootIt
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi ee EFI GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a6 OpenBSD f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
执行 t 指令以更改分区类型、目标分区序号为5、类型标识改为82:
Command (m for help): t //修改分区类型
Partition number (1-6): 5 //修改/dev/sdb5
Hex code (type L to list codes): 82 //类型改为82(交换分区)
Changed system type of partition 5 to 82 (Linux swap / Solaris)
再次执行 t 指令以更改分区类型、目标分区序号为6、类型标识改为c:
Command (m for help): t //修改分区类型
Partition number (1-6): 6 //修改/dev/sdb6
Hex code (type L to list codes): c
Changed system type of partition 6 to c (W95 FAT32 (LBA))
执行 p 指令确认分区结果,确认各分区的容量、类型:
Command (m for help): p
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
/dev/sdb2 2434 4866 19543072+ 83 Linux
/dev/sdb4 4867 7299 19543072+ 5 Extended
/dev/sdb5 4867 5110 1959898+ 82 Linux swap / Solaris
/dev/sdb6 5111 6327 9775521 c W95 FAT32 (LBA)
7)保存fdisk分区方案
在此前的分区过程中,任何时间发现有错误,可使用d指令删除指定分区后重建;或者直接执行 q 指令放弃修改退出fdisk,重新进fdisk再来过。
如果确认分区结果正确,可以执行 w 将分区表写入磁盘:
Command (m for help): w //保存分区更改,退出fdisk
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
[root@localhost ~]#
为了使Linux系统重新识别磁盘的新分区表,推荐执行一次partprobe(特别是修改现有分区表的情况下):
[root@localhost ~]# partprobe /dev/sdb
重新探测分区表
[root@localhost ~]# fdisk -l /dev/sdb
查看sdb的分区表情况
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2433 19543041 83 Linux
/dev/sdb2 2434 4866 19543072+ 83 Linux
/dev/sdb4 4867 7299 19543072+ 5 Extended
/dev/sdb5 4867 5110 1959898+ 82 Linux swap / Solaris
/dev/sdb6 5111 6327 9775521 c W95 FAT32 (LBA)
4.格式化分区
格式化分区也就是建立文件系统的过程,文件系统的类型决定了如何各种文件数据在磁盘上如何存放、如何访问。
1)创建EXT3文件系统
将主分区 /dev/sdb1 格式化,建立EXT3文件系统,下一步用来替换/home目录:
[root@localhost ~]# mkfs.ext3 /dev/sdb1 //或执行mfs -t ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2443200 inodes, 4885760 blocks
244288 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
150 block groups
32768 blocks per group, 32768 fragments per group
16288 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
2)创建Swap交换文件系统
将逻辑分区 /dev/sdb5 格式化,建立Swap交换文件系统,用来扩展交换空间:
[root@localhost ~]# mkswap /dev/sdb5
Setting up swapspace version 1, size = 2006929 kB
3)创建FAT32文件系统
较早的Windows操作系统、一些U盘和MP4等设备可能还会使用FAT32文件系统。
将逻辑分区 /dev/sdb6 格式化,建立FAT32文件系统:
[root@localhost ~]# mkfs.vfat -F 32 /dev/sdb6
mkfs.vfat 2.11 (12 Mar 2005)
5.扩展当前的交换空间
1)查看原有的交换空间大小
执行 free -m 命令,以MB为单位查看内存和交换空间的使用情况,可以看出当前总共的交换空间为2000MB:
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 999 512 487 0 14 156
-/+ buffers/cache: 341 658
Swap: 2000 0 2000
或者也可以执行 swapon -s 来确认交换设备的组成:
[root@localhost ~]# swapon -s //查看交换设备组成
Filename Type Size Used Priority
/dev/sda3 partition 2048276 0 -1
2)增加新的交换空间
启用此前格式化好的交换分区 /dev/sdb5:
[root@localhost ~]# swapon /dev/sdb5 //启用交换设备/dev/sdb5
3)确认新的交换空间大小
使用free -m查看时 ,总的交换空间已变为3914MB
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 999 513 486 0 14 156
-/+ buffers/cache: 342 657
Swap: 3914 0 3914
改用 swapon -s 的方式确认,可发现新增加的交换设备/dev/sdb5:
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/sda3 partition 2048276 0 -1
/dev/sdb5 partition 1959888 0 -2
4)停用指定的交换设备
在必要的时候,可以使用swapoff来停用指定交换设备,以减少交换空间。比如,将刚刚启用的交换设备 /dev/sdb5 停用,再次确认交换空间:
[root@localhost ~]# swapoff /dev/sdb5 //停用交换设备 /dev/sdb5
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 999 512 486 0 14 156
-/+ buffers/cache: 341 658
Swap: 2000 0 2000
6.使用 /dev/sdb1 替换现有的 /home 文件夹
1)备份原有的 /home 文件夹
原来的 /home 没有独立出来,可通过df工具查看所在文件系统,发现与根目录 / 使用的是同一个分区,一旦 /home 占用空间过大,就很容易影响到根文件系统:
[root@localhost ~]# df -hT /home //查看/home所在的文件系统
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 ext3 19G 3.8G 15G 21% /
对于宿主目录在 /home 下的各用户,如果当前已登录,建议先退出。然后将 /home文件夹改个名暂存备份:
[root@localhost ~]# mv /home /home.old //改名备份
[root@localhost ~]# ls -ld /home /home.old //确认改名后现状
ls: /home: 没有那个文件或目录
drwxr-xr-x 3 root root 4096 08-20 12:56 /home.old
2)将分区/dev/sdb1 挂载到 /home文件夹
重建新的 /home 目录,并使用mount命令将分区 /dev/sdb1装载进来:
[root@localhost ~]# mkdir /home //重建/home目录
[root@localhost ~]# mount /dev/sdb1 /home //挂载独立分区
[root@localhost ~]# ls -ldh /home/* //尚未恢复用户数据
drwx------ 2 root root 16K 09-02 17:24 /home/lost+found //新建的EXT3文件系统会有这个“失物招领”文件夹
再次用df命令检查 /home 所在文件系统,挂载点已变成独立的 /home 了,对应的分区设备为 /dev/sdb1:
[root@localhost ~]# df -hT /home //查看//home所在的文件系统
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 ext3 19G 173M 18G 1% /home
将备份数据复制或移动到新的 /home 目录下:
[root@localhost ~]# cp -rpf /home.old/* /home/ //-p选项保持权限归属不变
[root@localhost ~]# ls -d /home/*
/home/lost+found /home/pengpeng
等新的 /home 目录访问稳定、用户账号使用正常后,就可以删除备份的/home.old文件夹了:
[root@localhost ~]# rm -rf /home.old/