第八章 Linux磁盘与文件系统管理
5.内存置换分区(swap)
当物理内存不足时,系统会将内存中暂不使用的程序和数据挪到swap中,将空出来的内存空间给急需加载的程序和数据使用。当硬件资源充足的情况下,swap分区不会被系统所使用。
5.1 使用物理硬盘分区创建swap
创建步骤:
1. 分区:进行磁盘分区用以作为swap分区。由于 Linux 的 fdisk 默认会将分割槽的 ID 配置为 Linux 的文件系统,所以你可能还得要配置一下 system ID 就是了。
2. 格式化:使用mkwap命令格式化分区。
3. 使用:使用swapon命令启用swap分区。
4. 观察:使用free命令观察一下内存用量。
实践
- 分区
[root@www ~]# fdisk /dev/hdc
Command (m for help): n
First cylinder (2303-5005, default 2303): <==这里按[enter]
Using default value 2303
Last cylinder or +size or +sizeM or +sizeK (2303-5005, default 5005): +256M
Command (m for help): p
Device Boot Start End Blocks Id System
.....中间省略.....
/dev/hdc6 2053 2302 2008093+ 83 Linux
/dev/hdc7 2303 2334 257008+ 83 Linux <==新增的项目
Command (m for help): t <==修改系统 ID
Partition number (1-7): 7 <==从上结果看到的,七号partition
Hex code (type L to list codes): 82 <==改成 swap 的 ID
Changed system type of partition 7 to 82 (Linux swap / Solaris)
Command (m for help): p
Device Boot Start End Blocks Id System
.....中间省略.....
/dev/hdc6 2053 2302 2008093+ 83 Linux
/dev/hdc7 2303 2334 257008+ 82 Linux swap / Solaris
Command (m for help): w
# 此时就将 partition table 升级了!
[root@www ~]# partprobe
# 这个玩意儿很重要的啦!不要忘记让核心升级 partition table 喔!
- 格式化
[root@www ~]# mkswap /dev/hdc7
Setting up swapspace version 1, size = 263172 kB <==非常快速!
- 使用与观察
[root@www ~]# free
total used free shared buffers cached
Mem: 742664 684592 58072 0 43820 497144
-/+ buffers/cache: 143628 599036
Swap: 1020088 96 1019992
# 我有 742664K 的物理内存,使用 684592K 剩余 58072K ,使用掉的内存有
# 43820K / 497144K 用在缓冲/缓存的用途中。
# 至于 swap 已经存在了 1020088K 啰!这样会看了吧?!
[root@www ~]# swapon /dev/hdc7
[root@www ~]# free
total used free shared buffers cached
Mem: 742664 684712 57952 0 43872 497180
-/+ buffers/cache: 143660 599004
Swap: 1277088 96 1276992 <==有添加啰!看到否?
[root@www ~]# swapon -s
Filename Type Size Used Priority
/dev/hdc5 partition 1020088 96 -1
/dev/hdc7 partition 257000 0 -2
# 上面列出目前使用的 swap 装置有哪些的意思!
5.2 使用文件创建swap
创建步骤:
1. 创建大文件:使用dd创建大文件。
2. 格式化:使用mkswap命令格式化用作swap分区的大文件。
3. 使用:使用swapon启用swap。
4. 观察:使用free命令观察一下内存用量。
实践
- 使用 dd 这个命令来新增一个 128MB 的文件在 /tmp 底下
[root@www ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s
[root@www ~]# ll -h /tmp/swap
-rw-r--r-- 1 root root 128M Oct 28 15:33 /tmp/swap
- 使用mkswap格式化/tmp/swap为swap文件格式
[root@www ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 134213 kB
# 这个命令下达时请『特别小心』,因为下错字节控制,将可能使您的文件系统挂掉!
- 使用swapon启动/tmp/swap
[root@www ~]# free
total used free shared buffers cached
Mem: 742664 450860 291804 0 45584 261284
-/+ buffers/cache: 143992 598672
Swap: 1277088 96 1276992
[root@www ~]# swapon /tmp/swap
[root@www ~]# free
total used free shared buffers cached
Mem: 742664 450860 291804 0 45604 261284
-/+ buffers/cache: 143972 598692
Swap: 1408152 96 1408056
[root@www ~]# swapon -s
Filename Type Size Used Priority
/dev/hdc5 partition 1020088 96 -1
/dev/hdc7 partition 257000 0 -2
/tmp/swap file 131064 0 -3
- 使用swapoff停用swap file
[root@www ~]# swapoff /tmp/swap
[root@www ~]# swapoff /dev/hdc7
[root@www ~]# free
total used free shared buffers cached
Mem: 742664 450860 291804 0 45660 261284
-/+ buffers/cache: 143916 598748
Swap: 1020088 96 1019992 <==回复成最原始的样子了!
5.3 swap使用上的限制
- 最多能创建swap的数量为32个
- 目前 x86_64 最大内存寻址到 64GB,因此swap 总量最大仅能 64GB!
6 文件系统的特殊观察与操作
6.1 boot sector与superblock的关系
归纳为2点:
- superblock的大小为1024bytes;
- superblock前面需要为BootLoader保留1024bytes;
区块(block)大小为1014bytes(1K)时:
[root@www ~]# dumpe2fs /dev/hdc1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /boot
....(中间省略)....
First block: 1
Block size: 1024
....(中间省略)....
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-511 (+260)
511 free blocks, 1991 free inodes, 2 directories
Free blocks: 5619-6129
Free inodes: 18-2008
# 看到最后一个特殊字体的地方吗? Group0 的 superblock 是由 1 号 block 开始喔!
区块(block) 大于 1024 bytes (2K, 4K) 时:
[root@www ~]# dumpe2fs /dev/hdc2
dumpe2fs 1.39 (29-May-2006)
....(中间省略)....
Filesystem volume name: /1
....(中间省略)....
Block size: 4096
....(中间省略)....
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-626
Block bitmap at 627 (+627), Inode bitmap at 628 (+628)
Inode table at 629-1641 (+629)
0 free blocks, 32405 free inodes, 2 directories
Free blocks:
Free inodes: 12-32416
本章习题
- 如果由于你的主机磁盘容量不够大,你想要添加一颗新磁盘,并将该磁盘全部分割成单一分割槽,且将该分割槽挂载到 /home 目录, 你该如何处置?
详细的流程可以分为硬件组装、磁盘分区、格式化、数据搬移与挂载等。
安装硬盘:关掉 Linux 主机电源,若为 IDE 接口时,需要处理跳针 (jump) ,放入主机后插好硬盘的扁平电缆与电源线,重新启动电源;
磁盘分区:透过类似上述情境模拟二的动作,将整颗磁盘分区成单一主要分割槽,类似 /dev/sdb1 占有全部容量;
格式化:透过 mkfs -t ext3 来格式化;
数据搬移:由于原本的 /home 还会有数据存在,因此你可以 mount /dev/sdb1 /mnt ,再将 /home 的数据复制到 /mnt/ 中,例如:『 cp -a /home/* /mnt 』即可。复制完毕后卸除 /home 以及 /mnt
重新挂载:编辑 /etc/fstab ,将 /home 所在的 filesystem 装置改为 /dev/sdb1 之类的新分割槽,然后 mount -a测试看看是否正确,如果正确的话,才是顺利结束了这次的动作。
2.如果扇区 /dev/hda3 有问题,偏偏他是被挂载上的,请问我要如何修理此一扇区?
umount /dev/hda3
fsck /dev/hda3
3.我们常常说,启动的时候,『发现硬盘有问题』,请问,这个问题的产生是『filesystem 的损毁』,还是『硬盘的损毁』?
特别需要注意的是,如果您某个 filesystem 里面,由于操作不当,可能会造成
Superblock 数据的损毁, 或者是 inode 的架构损毁,或者是 block area 的记录遗失等等,这些问题当中,其实您的『硬盘』还是好好的, 不过,在硬盘上面的『文件系统』则已经无法再利用!一般来说,我们的 Linux 很少会造成 filesystem 的损毁, 所以,发生问题时,很可能整个硬盘都损毁了。但是,如果您的主机常常不正常断电,那么, 很可能硬盘是没问题的,但是,文件系统则有损毁之虞。此时,重建文件系统 (reinstall) 即可! 不需要换掉硬盘啦!
4.当我有两个文件,分别是 file1 与 file2 ,这两个文件互为 hard link 的文件,请问, 若我将 file1 删除,然后再以类似 vi 的方式重新创建一个名为 file1 的文件, 则 file2 的内容是否会被更动?
这是来自网友的疑问。当我删除 file1 之后, file2 则为一个正规文件,并不会与他人共同分享同一个 inode 与 block ,因此,当我重新创建一个档名为 file1 时,他所利用的 inode 与 block 都是由我们的 filesystem 主动去搜寻 meta data ,找到空的 inode 与 block 来创建的, 与原本的 file1 并没有任何关连性喔!所以,新建的 f