目录
10.10 修改/etc/fstab文件出错导致Linux不能启动,该怎么办?
10.11 Linux卸载文件系统(umount命令)
10.12 Linux检测和修复文件系统(fsck命令)
10.13 Linux查看文件系统详细信息(dumpe2fs命令)
10.14 Linux给硬盘分区(fdisk命令)
10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)
fdisk命令创建主分区
fdisk命令创建扩展分区
fdisk命令创建逻辑分区
10.16 Linux对大容量硬盘分区(parted命令)
10.17 linux格式化分区(mkfs命令)
10.18 Linux格式化分区(mke2fs命令)
10.19 Linux虚拟内存和物理内存
10.20 Linux如何建立交换分区(swap分区)?
建立swap分区第一步:分区
建立 swap 分区第二步:格式化
使用swap分区
如果把 /etc/fstab 文件修改错了,也重启了,系统崩溃启动不了了,那该怎么办?比如:
[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 ext4 defaults 1 1
UUID=0b23d315-33a7-48a4-bd37-9248e5c44345 boot ext4 defaults 12
UUID=4021be19-2751-4dd2-98cc-383368c39edb swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5, mode=620 00
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sdb5 /disk5 ext4 defaults 1 2
/dev/sdb /disk6 ext4 defaults 1 2
#故意把/dev/sdb6写成了 /dev/sdb
我们重新启动系统,真的报错了,如图 1 所示。
先别急,仔细看看,系统提示输入 root 密码,我们输入密码试试,如图 2 所示。
我们又看到了系统提示符,赶快把 /etc/fstab 文件修改回来吧。又报错了,如图 3 所示。
别慌,分析一下原因提示是没有写权限,那么只要把 / 分区重新挂载上读写权限不就可以修改了吗?命令如下:
[root@localhost ~]#mount-oremount, rw/
再去修改 /etc/fstab 文件,把它改回来就可以正常启动了。
前面介绍了如何将光盘和 U 盘挂载在系统中,而在使用完成后,需要先将其与挂载点取消关联,然后才能成功卸载。不过,硬盘分区是否需要卸载,取决于你下次是否还需要使用,一般不对硬盘分区执行卸载操作。
umount 命令用于卸载已经挂载的硬件设备,该命令的基本格式如下:
[root@localhost ~]# umount 设备文件名或挂载点
注意,卸载命令后面既可以加设备文件名,也可以加挂载点,不过只能二选一,比如:
[root@localhost ~]# umount /mnt/usb
#卸载U盘
[root@localhost ~]# umount /mnt/cdrom
#卸载光盘
[root@localhost ~]# umount /dev/sr0
#命令加设备文件名同样是可以卸载的
如果加了两个(如下所示),从理论上分析,会对光驱卸载两次,当然,卸载第二次的时候就会报错。
[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/
另外,我们在卸载时有可能会出现以下情况:
[root@localhost ~]# cd /mnt/cdrom/
#进入光盘挂载点
[root@localhost cdrom]# umount /mnt/cdrom/
umount: /mnt/cdrom: device is busy.
#报错,设备正忙
这种报错是因为我们已经进入了挂载点,因此,如果要卸载某硬件设备,在执行 umount 命令之前,用户须退出挂载目录。
卸载硬件设备成功与否,除了执行 umount 命令不报错之外,还可以使用 df 命令或 mount -l
来查看目标设备是否还挂载在系统中。
计算机难免会由于某些系统因素或人为误操作(突然断电)出现系统异常,这种情况下非常容易造成文件系统的崩溃,严重时甚至会造成硬件损坏。这也是我们一直在强调的“服务器一定要先关闭服务再进行重启”的原因所在。
那么,如果真出现了文件系统损坏的情况,有办法修复吗?可以的,对于一些小问题,使用 fsck 命令就可以很好地解决。
fsck 命令用于检查文件系统并尝试修复出现的错误。该命令的基本格式如下:
[root@localhost ~]# fsck [选项] 分区设备文件名
表 1 罗列出了该命令常用的选项以及各自的功能。
选项 | 功能 |
---|---|
-a | 自动修复文件系统,没有任何提示信息。 |
-r | 采取互动的修复模式,在修改文件前会进行询问,让用户得以确认并决定处理方式。 |
-A(大写) | 按照 /etc/fstab 配置文件的内容,检查文件内罗列的全部文件系统。 |
-t 文件系统类型 | 指定要检查的文件系统类型。 |
-C(大写) | 显示检查分区的进度条。 |
-f | 强制检测,一般 fsck 命令如果没有发现分区有问题,则是不会检测的。如果强制检测,那么不管是否发现问题,都会检测。 |
-y | 自动修复,和 -a 作用一致,不过有些文件系统只支持 -y。 |
此命令通常只有身为 root 用户且文件系统出现问题时才会使用,否则,在正常状况下使用 fsck 命令,很可能损坏系统。另外,如果你怀疑已经格式化成功的硬盘有问题,也可以使用此命令来进行检查。
使用 fsck 检查并修复文件系统是存在风险的,特别是当硬盘错误非常严重的时候,因此,当一个受损文件系统中包含了非常有价值的数据时,务必首先进行备份!
需要注意的是,在使用 fsck 命令修改某文件系统时,这个文件系统对应的磁盘分区一定要处于卸载状态,磁盘分区在挂载状态下进行修复是非常不安全的,数据可能会遭到破坏,也有可能会损坏磁盘。
这里,给大家举个例子,如果想要修复某个分区,则只需执行如下命令:
[root@localhost ~]#fsck -r /dev/sdb1
#采用互动的修复模式
fsck 命令在执行时,如果发现存在没有文件系统依赖的文件或目录,就会提示用户是否把它们找回来,因为这些没有文件系统依赖的文件或目录对用户来说是看不到的,换句话说,用户根本无法使用,这通常是由文件系统内部结构损坏导致的。如果用户同意找回(输入 y),fsck 命令就会把这些孤立的文件或目录放到 lost+found 目录中,并用这些文件自己对应的 inode 号来命名,以便用户查找自己丢失的文件。
因此,当用户在利用 fsck 命令修复磁盘分区以后,如果发现分区中有文件丢失,就可以到对应的 lost+found 目录中去查找,但由于无法通过文件名称分辨各个文件,这里可以利用 file 命令查看文件系统类型,进而判断出哪个是我们需要的文件。
了解文件系统之后,我们可以使用 dumpe2fs 命令来查看文件系统的详细信息,此命令的基本格式如下:
[root@www ~]# dumpe2fs [-h] 文件名
-h 选项的含义是仅列出 superblock(超级块)的数据信息;
例如,通过 df 命令找到根目录硬盘的文件名,然后使用 dump2fs 命令观察文件系统的详细信息,执行命令如下:
[root@localhost ~]# df <==这个命令可以叫出目前挂载的装置
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3822848 5585708 41% /
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm
[root@localhost ~]# dumpe2fs /dev/hdc2
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /1 <==这个是文件系统的名称(Label)
Filesystem features: has_journal ext_attr resize_inode dir_index
filetype needs_recovery sparse_super large_file
Default mount options: user_xattr acl <==默认挂载的参数
Filesystem state: clean <==这个文件系统是没问题的(clean)
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 2560864 <==inode的总数
Block count: 2560359 <==block的总数
Free blocks: 1524760 <==还有多少个 block 可用
Free inodes: 2411225 <==还有多少个 inode 可用
First block: 0
Block size: 4096 <==每个 block 的大小啦!
Filesystem created: Fri Sep 5 01:49:20 2008
Last mount time: Mon Sep 22 12:09:30 2008
Last write time: Mon Sep 22 12:09:30 2008
Last checked: Fri Sep 5 01:49:20 2008
First inode: 11
Inode size: 128 <==每个 inode 的大小
Journal inode: 8 <==底下这三个与下一小节有关
Journal backup: inode blocks
Journal size: 128M
Group 0: (Blocks 0-32767) <==第一个 data group 内容, 包含 block 的启始/结束号码
Primary superblock at 0, Group descriptors at 1-1 <==超级区块在 0 号 block
Reserved GDT blocks at 2-626
Block bitmap at 627 (+627), Inode bitmap at 628 (+628)
Inode table at 629-1641 (+629) <==inode table 所在的 block
0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了!
Free blocks:
Free inodes: 12-32416 <==剩余未使用的 inode 号码
Group 1: (Blocks 32768-65535)
#由于数据量非常的庞大,这里省略了一部分输出信息
可以看到,使用 dumpe2fs 命令可以查询到非常多的信息,以上信息大致可分为 2 部分。前半部分显示的是超级块的信息,包括文件系统名称、已使用以及未使用的 inode 和 block 的数量、每个 block 和 inode 的大小,文件系统的挂载时间等。
另外,Linux 文件系统(EXT 系列)在格式化的时候,会分为多个区块群组(block group),每 个区块群组都有独立的 inode/block/superblock 系统。此命令输出结果的后半部分,就是每个区块群组的详细信息(如 Group0、Group1)。
我们在安装操作系统的过程中已经对系统硬盘进行了分区,但如果新添加了一块硬盘,想要正常使用,难道需要重新安装操作系统才可以分区吗?
当然不是,在 Linux 中有专门的分区命令 fdisk 和 parted。其中 fdisk 命令较为常用,但不支持大于 2TB 的分区;如果需要支持大于 2TB 的分区,则需要使用 parted 命令,当然 parted 命令也能分配较小的分区。我们先来看看如何使用 fdisk 命令进行分区。
fdisk 命令的格式如下:
[root@localhost ~]# fdisk ~l
#列出系统分区
[root@localhost ~]# fdisk 设备文件名
#给硬盘分区
注意,千万不要在当前的硬盘上尝试使用 fdisk,这会完整删除整个系统,一定要再找一块硬盘,或者使用虚拟机。这里给大家举个例子:
[root@localhost ~]# fdisk -l
#查询本机可以识别的硬盘和分区
Disk /dev/sda:32.2 GB, 32212254720 bytes
#硬盘文件名和硬盘大小
255 heads, 63 sectors/track, 3916 cylinders
#共255个磁头、63个扇区和3916个柱面
Units = cylinders of 16065 *512 = 8225280 bytes
#每个柱面的大小
Sector size (logical/physical): 512 bytes/512 bytes
#每个扇区的大小
I/O size (minimum/optimal): 512 bytes/512 bytes
Disk identifier: 0x0009e098
Device Boot Start End Blocks ld System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
#分区1没有占满硬盘
/dev/sda2 26 281 2048000 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary
#分区2没有占满硬盘
/dev/sda3 281 3917 29203456 83 Linux
#设备文件名启动分区 起始柱面 终止柱面容量 ID 系统
Disk /dev/sdb: 21.5 GB, 21474836480 bytes #第二个硬盘识别,这个硬盘的大小
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes/512 bytes Disk identifier: 0x00000000
使用 "fdisk -l" 查看分区信息,能够看到我们添加的两块硬盘(/dev/sda 和 /dev/sdb)的信息。我们解释一下这些信息,其上半部分态是硬盘的整体状态,/dev/sda 硬盘的总大小是 32.2 GB,共有 3916 个柱面,每个柱面由 255 个磁头读/写数据,每个磁头管理 63 个扇区。每个柱面的大小是 8225280 Bytes,每个扇区的大小是 512 Bytes。
信息的下半部分是分区的信息,共 7 列,含义如下:
如果这个分区并没有占满整块硬盘,就会提示 "Partition 1 does not end on cyl inder boundary",表示第一个分区没有到硬盘的结束柱面。大家发现了吗?/dev/sda 已经分配完了分区,没有空闲空间了。而第二块硬盘 /dev/sdb 已经可以被识别了,但是没有可分区。
我们以硬盘 /dev/sdb 为例来做练习,命令如下:
[root@localhost ~]# fdisk /dev/sdb
#给/dev/sdb分区
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xed7e8bc7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated.it's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').
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
I 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 verity the partition table
w write table to disk and exit
x extra functionality (experts only)
注意这里的分区命令是 "fdisk /dev/sdb",这是因为硬盘并没有分区,使用 fdisk 命令的目的就是建立分区。
在 fdisk 交互界面中输入 m 可以得到帮助,帮助里列出了 fdisk 可以识别的交互命令,我们来解释一下这些命令,如表 1 所示。
命令 | 说 明 |
---|---|
a | 设置可引导标记 |
b | 编辑 bsd 磁盘标签 |
c | 设置 DOS 操作系统兼容标记 |
d | 删除一个分区 |
1 | 显示已知的文件系统类型。82 为 Linux swap 分区,83 为 Linux 分区 |
m | 显示帮助菜单 |
n | 新建分区 |
0 | 建立空白 DOS 分区表 |
P | 显示分区列表 |
q | 不保存退出 |
s | 新建空白 SUN 磁盘标签 |
t | 改变一个分区的系统 ID |
u | 改变显示记录单位 |
V | 验证分区表 |
w | 保存退出 |
X | 附加功能(仅专家) |
前面讲过,硬盘是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,因为它保存着主引导记录和分区表信息。
在第一个扇区中,主引导记录需要占用 446 字节,分区表占用 64 字节,还有 2 个字节供结束符使用。而分区表是本节所关心的,在分区表中,每记录一个分区信息就需要占用 16 字节,这样一来,整个分区表最多只能记录 4 个分区信息,这 4 个分区就称为 4 个主分区。
因此,第一个扇区中的总体情况,如图 1 所示。
那么,第一个扇区最多只能创建出 4 个分区吗?不是的,为了解决分区个数不够的问题,还可以进一步将第一个扇区的分区表中 16 个字节(原本要写入主分区信息)的空间,用来存储另外一个分区的信息,通常将这 16 个字节的空间称为扩展分区。
注意,扩展分区并不是一个真正的分区,而可以看做是一个占用 16 字节分区表空间的指针,它用来指向另一个分区。
通常情况下,用户会选择使用 3 个主分区外加 1 个扩展分区的方法,然后在扩展分区中再创建出多个逻辑分区,从而来满足多分区(大于 4 个)的需求(如图 2 所示)。
因此总的来说,硬盘分区有 3 种,分别是主分区、扩展分区和逻辑分区。对于一个硬盘来说,主分区至少有 1 个,最多有 4 个;扩展分区可以没有,最多只能有 1 个,且主分区+扩展分区总共不能超过 4 个;逻辑分区可以有若干个。
前面我们已经学习了 fdisk 命令的基本用法,本节就来用它给硬盘分区。
首先,我们要建立一个主分区,看看过程是什么样子的。命令如下:
[root@localhost ~]# fdisk /dev/sdb
…省略部分输出…
Command (m for help): p
#显示当前硬盘的分区列表
Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 *512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb4b0720c
Device Boot Start End Blocks id System
#目前一个分区都没有
Command (m for help): n
#那么我们新建一个分区
Command action
#指定分区类型
e extended
#扩展分区
p primary partition (1-4)
#主分区
p
#这里选择p,建立一个主分区
Partition number (1-4): 1
#选择分区号,范围为1~4,这里选择1
First cylinder (1 -2610, default 1):
#分区的起始柱面,默认从1开始。因为要从硬盘头开始分区,所以直接回车
Using default value 1
#提示使用的是默认值1
Last cylinder, +cylinders or +size{K, M, G}(1-2610, default 2610): +5G
#指定硬盘大小。可以按照柱面指定(1-2610)。我们对柱面不熟悉,那么可以使用size{K, M, G}的方式指定硬盘大小。这里指定+5G,建立一个5GB大小的分区
Command (m for help):
#主分区就建立了,又回到了fdisk交互界面的提示符
Command (m for help): p
#查询一下新建立的分区
Disk /dev/sdb: 21.5GB, 21474836480 bytes
255 heads,63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes 1512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb4b0720c
Device Boot Start End Blocks id System
/dev/sdb1 1 654 5253223+ 83 Linux
#dev/sdb1已经建立了吧
可以看到,建立主分区的过程是:"fdisk 硬盘名 -> n(新建)->p(建立主分区) -> 1(指定分区号) -> 回车(默认从 1 柱面开始建立分区)-> +5G(指定分区大小)"。当然,我们的分区还没有格式化和挂载,所以还不能使用。
接下来给大家展示如何建立一个扩展分区。还记得吗?主分区和扩展分区加起来最多只能建立 4 个,而扩展分区最多只能建立 1 个。
扩展分区的建立命令如下:
[root@localhost ~]# fdisk /dev/sdb
…省略部分输出…
Command (m for help): n
#新建立分区
Command action
e extended
p primary partition (1-4)
e
#这次建立扩展分区
Partition number (1-4): 2
#给扩展分区指定分区号2
First cylinder (655-2610, default 655):
#扩展分区的起始柱面。上节建立的主分区1已经占用了1~654个柱面,所以我们从655开始建立,注意:如果没有特殊要求,则不要跳开柱面建立分区,应该紧挨着建立分区
Using default value 655
提示使用的是默认值655
Last cylinder, +cylinders or +size{K, M, G} (655-2610, default 2610):
#这里把整块硬盘的剩余空间都建立为扩展分区
Using default value 2610
#提示使用的是默认值2610
这里把 /dev/sdb 硬盘的所有剩余空间都建立为扩展分区,也就是建立一个主分区,剩余空间都建立成扩展分区。要知道,扩展分区是不能被格式化和直接使用的,所以还要在扩展分区内部再建立逻辑分区。
最后,我们来看看逻辑分区的建立过程,命令如下:
[root@localhost ~]# fdisk /dev/sdb
…省略部分输出…
Command (m for help): n
#建立新分区
Command action
l logical (5 or over)
#由于在前面章节中,扩展分区已经建立,所以这里变成了l(logic)
p primary partition (1-4)
l
#建立逻辑分区
First cylinder (655-2610, default 655):
#不用指定分区号,默认会从5开始分配,所以直接选择起始柱面
#注意:逻辑分区是在扩展分区内部再划分的,所以柱面是和扩展分区重叠的
Using default value 655
Last cylinder, +cylinders or +size{K, M, G} (655-2610, default 2610):+2G
#分配2GB大小
Command (m for help): n
#再建立一个逻辑分区
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (917-2610, default 917):
Using default value 917
Last cylinder, +cylinders or +size{K, M, G} (917-2610, default 2610):+2G
Command (m for help): p
#查看一下已经建立的分区
Disk /dev/sdb: 21.5GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 *512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb4b0720c
Device Boot Start End Blocks id System
/dev/sdb1 1 654
5253223+ 83 Linux
#主分区
/dev/sdb2 655 2610 15711570
5 Extended
#扩展分区
/dev/sdb5 655 916
2104483+ 83 Linux
#逻辑分区 1
/dev/sdb6 917 1178
2104483+ 83 Linux
#逻辑分区2
Command (m for help): w
#保存并退出
The partition table has been altered!
Calling ioctl。to re-read partition table.
Syncing disks.
[root@localhost -]#
#退回到提示符界面
注意,所有的分区立过程中如果不保存并退出是不会生效的,所以建立错了也没有关系,使用 q 命令不保存退出即可。如果使用了 w 命令,就会保存退出。有时因为系统的分区表正忙,所以需要重新启动系统才能使新的分区表生效。命令如下:
Command (m for help): w
#保存并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16:
Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
#要求重新启动,才能格式化
Syncing disks.
看到了吗?必须重新启动!可是重新启动很浪费时间。如果不想重新启动,则可以使用 partprobe 命令。这个命令的作用是让系统内核重新读取分区表信息,这样就可以不用重新启动了。命令如下:
[root@localhost ~]# partprobe
如果这个命令不存在,则请安装 parted-2.1-18.el6.i686 这个软件包。partprobe 命令不是必需的,如果没有提示重启系统,则直接格式化即可。
虽然我们可以使用 fdisk命令对硬盘进行快速的分区,但对高于 2TB 的硬盘分区,此命令却无能为力,此时就需要使用 parted 命令。
parted 命令是可以在命令行直接分区和格式化的,不过 parted 交互模式才是更加常用的命令方式,进入交互模式的方法如下:
[root@localhost ~]# parted 硬盘设备文件名
#进入交互模式
例如:
[root@localhost ~]# parted /dev/sdb
#打算继续划分/dev/sdb硬盘
GNU Parted 2.1
使用/dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) <--parted 的等待输入交互命令的位置,输入 help,可以看到在交互模式下支持的所有命令
parted 交互命令比较多,我们介绍常见的命令,如表 1 所示。
parted交互命令 | 说 明 |
---|---|
check NUMBER | 做一次简单的文件系统检测 |
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER | 复制文件系统到另一个分区 |
help [COMMAND] | 显示所有的命令帮助 |
mklabel,mktable LABEL-TYPE | 创建新的磁盘卷标(分区表) |
mkfs NUMBER FS-TYPE | 在分区上建立文件系统 |
mkpart PART-TYPE [FS-TYPE] START END | 创建一个分区 |
mkpartfs PART-TYPE FS-TYPE START END | 创建分区,并建立文件系统 |
move NUMBER START END | 移动分区 |
name NUMBER NAME | 给分区命名 |
print [devices|free|list,all|NUMBER] | 显示分区表、活动设备、空闲空间、所有分区 |
quit | 退出 |
rescue START END | 修复丢失的分区 |
resize NUMBER START END | 修改分区大小 |
rm NUMBER | 删除分区 |
select DEVICE | 选择需要编辑的设备 |
set NUMBER FLAG STATE | 改变分区标记 |
toggle [NUMBER [FLAG]] | 切换分区表的状态 |
unit UNIT | 设置默认的单位 |
Version | 显示版本 |
【例 1】查看分区表
(parted) print
#进入print指令
Model: VMware, VMware Virtual S (scsi)
#硬盘参数,是虚拟机
Disk/dev/sdb: 21.5GB
#硬盘大小
Sector size (logical/physical): 512B/512B
#扇区大小
Partition Table: msdos
#分区表类型,是MBR分区表
Number Start End Size Type File system 标志
1 32.3kB 5379MB 5379MB primary
2 5379MB 21.5GB 16.1GB extended
5 5379MB 7534MB 2155MB logical ext4
6 7534MB 9689MB 2155MB logical ext4
#看到了我们使用fdisk命令创建的分区,其中1分区没被格式化;2分区是扩展分区,不能被格式化
使用 print 命令可以査看分区表信息,包括硬盘参数、硬盘大小、扇区大小、分区表类型和分区信息。分区信息共有 7 列,分别如下:
【例 2】修改成 GPT 分区表
(partcd) mklabel gpt
#修改分区表命令
警告:正在使用/dev/sdb上的分区。由于/dev/sdb分区已经挂载,所以有警告。注意,如果强制修改,那么原有分区及数据会消失
忽略/Ignore/放弃/Cancel? ignore
#输入ignore忽略报错
警告:The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
是/Yes/否/No? yes
#输入 yes
警告:WARNING: the kernel failed to re-read the partition table on /dev/sdb (设 备或资源忙).As a result, it may not reflect all of your changes until after reboot.
#下次重启后才能生效
(parted) print
#查看一下分区表
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
#分区表已经变成 GPT
Number Start End Size File system Name 标志
#所有的分区都消失了
修改了分区表,如果这块硬盘上已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才能生效。
另外,我们转换分区表的目的是支持大于 2TB 的分区,如果分区并没有大于 2TB,那么这一步是可以不执行的。
注意,一定要把 /etc/fstab 文件和原有分区中的内容删除才能重启,否则会报错。
【例 3】建立分区
因为修改过了分区表,所以/dev/sdb硬盘中的所有数据都消失了,我们就可以重新对这块硬盘分区了。不过,在建立分区时,默认文件系统就只能是 ext2 了。命令如下:
(parted)mkpart
#输入创建分区命令,后面不要参数,全部靠交互
指定
分区名称? []?disk1
#分区名称,这里命名为disk 1
文件系统系统? [ext2]?
#文件系统类型,直接回车,使用默认文件系统ext2
起始点? 1MB
#分区从1MB开始
结束点?5GB分区到5GB结束
#分区完成
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B Partition Table: gpt
Number Start End Size Rle system Name 标志
1 1049kB 5000MB 4999MB disk1
#分区1已经出现
不知道大家有没有注意到,我们现在用 print 查看的分区和第一次查看 MBR 分区表的分区时有些不一样了,少了 Type 这个字段,也就是分区类型字段,多了 Name(分区名)字段。分区类型是用于标识主分区、扩展分区和逻辑分区的,不过这种标识只在 MBR 分区表中使用,现在已经变成了 GPT 分区表,所以就不再有 Type 类型了。
【例 4】建立文件系统
分区分完后,还需要进行格式化。我们知道,如果使用 parted 交互命令格式化,则只能格式化成 ext2 文件系统。我们在这里要演示一下 parted 命令的格式化方法,所以就格式化成 ext2 文件系统。命令如下:
(parted) mkfs
#格式化命令(很奇怪,也是mkfs,但是这只是parted的交互命令)
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
警告:The existing file system will be destroyed and all data on the partition will be lost. Do you want to continue?
是/Yes/否/No? yes
#警告你格式化丟失,没关系,已经丢失过了
分区编号? 1
文件系统类型 [ext2]?
#指定文件系统类型,写别的也没用,直接回车
(parted) print #格式化完成,查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21,5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name标志
1 1049kB 5000MB 4999MB ext2 diski
#拥有了文件系统
如果要格式化成 ext4 文件系统,那么请 mkfs 命令帮忙吧(注意:不是 parted 交互命令中的 mkfs,而是系统命令 mkfs)。
【例 5】调整分区大小
parted 命令还有一大优势,就是可以调整分区的大小(在 Windows 中也可以实现,不过要么需要转换成动态磁盘,要么需要依赖第三方工具,如硬盘分区魔术师)。起始 Linux 中 LVM 和 RAID 是可以支持分区调整的,不过这两种方法也可以看成动态磁盘方法,使用 parted 命令调整分区更加简单。
注意,parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说,数据不会丢失。但是一定要先卸载分区,再调整分区大小,否则数据是会出现问题的。另外,要调整大小的分区必须已经建立了文件系统(格式化),否则会报错。
命令如下:
(parted) resize
分区编号? 1
#指定要修改的分区编号
起始点? [1049kB]? 1MB
#分区起始位置
结束点? [5000MB]? 6GB
分区结束位置
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21,5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name标志
1 1049kB 6000MB 5999MB ext2 diski
#分区大小改变
【例 6】删除分区
命令如下:
(parted) rm
#删除分区命令
分区编号? 1
#指定分区编号
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志 #分区消失
要注意的是,parted 中所有的操作都是立即生效的,没有保存生效的概念。这一点和 fdisk 交互命令明显不同,所以做的所有操作大家要加倍小心。
那么,到底是使用 fdisk 命令,还是使用 parted 命令进行分区呢?这完全看个人习惯,我们更加习惯使用 fdisk 命令。
分区完成后,如果不格式化写入文件系统,则是不能正常使用的。这时就需要使用 mkfs 命令对硬盘分区进行格式化。
mkfs 命令格式如下:
[root@localhost ~]# mkfs [-t 文件系统格式] 分区设备文件名
-t 文件系统格式:用于指定格式化的文件系统,如 ext3、ext4;
前面章节中,我们建立了 /dev/sdb1(主分区)、/dev/sdb2(扩展分区)、/dev/sdb5(逻辑分区)和 /dev/sdb6(逻辑分区)这几个分区,其中 /dev/sdb2 不能被格式化。剩余的三个分区都需要格式化之后使用,这里我们以格式化 /dev/sdb6 分区作为演示,其余分区的格式化方法一样。
格式化 /dev/sdb6 分区的执行命令如下:
[root@localhost ~]# mkfs -t ext4 /dev/sdb6
mke2fs 1.41.12 (17-May-2010)
Filesystem label= <--这里指的是卷标名,我们没有设置卷标
OS type:Linux
Block size=4096 (log=2) <--block 的大小配置为 4K
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks <--由此配置决定的inode/block数量
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216 17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks):done
Writing superblocks and filesystem accounting information:done
This filesystem will be automatically checked every 39 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
# 这样就创建起来所需要的 Ext4 文件系统了!简单明了!
虽然 mkfs 命令非常简单易用,但其不能调整分区的默认参数(比如块大小是 4096 Bytes),这些默认参数除非特殊清况,否则不需要调整。如果想要调整,就需要使用 mke2fs 命令重新格式化,此命令会在下一节做详细介绍。
前面讲到,mkfs 命令为硬盘分区写入文件系统时,无法手动调整分区的默认参数(比如块大小是 4096 Bytes),如果想要调整,就需要使用本节介绍的 mke2fs 命令。
mke2fs 命令的基本格式如下:
[root@localhost ~]# mke2fs [选项] 分区设备文件名
表 1 罗列出了 mke2fs 命令常用的几个选项及各自的功能。
选项 | 功能 |
---|---|
-t 文件系统 | 指定格式化成哪个文件系统, 如 ext2、ext3、ext4; |
-b 字节 | 指定 block 的大小; |
-i 字节 | 指定"字节 inode "的比例,也就是多少字节分配一个 inode; |
-j | 建立带有 ext3 日志功能的文件系统; |
-L 卷标名 | 给文件系统设置卷标名,就不使用 e2label 命令设定了; |
为了更好的对比 mkfs 命令,这里我们依旧以格式化 /dev/sdb6 为例,不过,这次使用的是 mke2fs 命令,执行命令如下:
[root@localhost ~]# mke2fs -t ext4 -b 2048 /dev/sdb6
#格式化分区,并指定block的大小为2048 Bytes
mke2fe 1.41.12 (17-May-2010)
Filesystem label=
OS type:Linux
Block size=2048 (log=1) <--block 的大小配置为 2K
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks 131560
inodes,1052240 blocks 52612 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=538968064 65 block groups
16384 blocks per group, 16384 fragments per group
2024 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816
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.
如果没有特殊需要,建议使用 mkfs 命令对硬盘分区进行格式化。
我们都知道,直接从内存读写数据要比从硬盘读写数据快得多,因此更希望所有数据的读取和写入都在内存中完成,然而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称 swap 空间)。
作为物理内存的扩展,Linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样一来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
要深入了解 Linux 内存运行机制,需要知道下面提到的几个方面:
有时我们会看到这么一个现象,Linux 物理内存还有很多,但是交换空间也使用了很多,其实这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。
最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。
因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,但大致遵循这样一个基本原则:
关于如何建立 swap 分区,可阅读《Linux swap分区及作用》一节做详细了解。
我们在安装系统的时候已经建立了 swap 分区。swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。
也就是说,当内存不够用时,我们使用 swap 分区来临时顶替。这种“拆东墙,补西墙”的方式应用于几乎所有的操作系统中。
使用 swap 交换分区,显著的优点是,通过操作系统的调度,应用程序实际可以使用的内存空间将远远超过系统的物理内存。由于硬盘空间的价格远比 RAM 要低,因此这种方式无疑是经济实惠的。当然,频繁地读写硬盘,会显著降低操作系统的运行速率,这也是使用 swap 交换分区最大的限制。
相比较而言,Windows 不会为 swap 单独划分一个分区,而是使用分页文件实现相同的功能,在概念上,Windows 称其为虚拟内存,从某种意义上将,这个叫法更容易理解。因此,初学者将 swap 交换分区理解为虚拟内存是没有任何问题的。
具体使用多大的 swap 分区,取决于物理内存大小和硬盘的容量。一般来讲,swap 分区容量应大于物理内存大小,建议是内存的两倍,但不超过 2GB。但是,有时服务器的访问量确实很大,有可能出现 swap 分区不够用的情况,所以我们需要学习 swap 分区的构建方法。
建立新的 swap 分区,只需要执行以下几个步骤。
下面我们来逐一实现。
命令如下:
[root@localhost ~]# fdisk /dev/sdb
#以/dev/sdb分区为例
WARNING: DOS-compatible mode is deprecated.It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').
Command (m for help): n
#新建
Command action e extended p primary partition (1-4)
P
#主分区
Partition number (1-4): 1
#分区编号
First cylinder (1-2610, default 1):
#起始柱面
Using default value 1
Last cylinder, +cylinders or +size{K, M, G} (1-2610, default 2610): +500M
#大小
Command (m for help): p
#查看一下
Disk /dev/sdb: 21.5GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 *512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes 1512 bytes
Disk identifier: OxOOOOOebd
Device Boot Start End Blocks Id System
/dev/sdb1 1 65 522081 83 Linux
#刚分配的分区ID是83,是Linux分区,我们在这里要分配swap分区
Command (m for help): t
#修改分区的系统ID
Selected partition 1
#只有一个分区,所以不用选择分区了
Hex code (type L to list codes): 82
#改为swap分区的ID
Changed system type of partition 1 to 82 (Linux swap / Solaris)
Command (m for help): p
#再查看一下
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 *512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes 1512 bytes Disk identifier: OxOOOOOebd
Device Boot Start End Blocks Id System
/dev/sdb1 1 65 522081 82 Linux swap / Solaris
#修改过来了
Command (m for help): w
#记得保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
仍以 /dev/sdb 分区作为实验对象。不过,如果分区刚刚使用 parted 命令转变为 GPT 分区表,则记得转换回 MBR 分区表,fdisk 命令才能识别,否则干脆新添加一块硬盘做实验。
因为要格式化成 swap 分区,所以格式化命令是 mkswap。命令如下:
[root@localhost ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 522076 KiB
no label, UUID=c3351 dc3-f403-419a-9666-c24615e170fb
在使用 swap 分区之前,我们先来说说 free 命令。命令如下:
[root@localhost ~]#free
total used free shared buffers cached
Mem: 1030796 130792 900004 0 15292 55420
-/+ buffers/cache: 60080 970716
Swap: 2047992 0 2047992
free 命令主要是用来查看内存和 swap 分区的使用情况的,其中:
我们需要解释一下 buffers(缓冲)和 cached(缓存)的区别。简单来讲,cached 是给读取数据时加速的,buffers 是给写入数据加速的。cached 是指把读取出来的数据保存在内存中,当再次读取时,不用读取硬盘而直接从内存中读取,加速了数据的读取过程;buffers 是指在写入数据时,先把分散的写入操作保存到内存中,当达到一定程度后再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程。
我们已经看到,在加载进新的 swap 分区之前,swap 分区的大小是 2000MB,接下来只要加入 swap 分区就可以了,使用命令 swapon。命令格式如下:
[root@localhost ~]# swapon 分区设备文件名
例如:
[root@localhost ~]# swapon /dev/sdb1
swap分区已加入,我们查看一下。
[root@localhost ~]#free
total used free shared buffers cached
Mem: 1030796 131264 899532 0 15520 55500
-/+ buffers/cache: 60244 970552
Swap: 2570064 0 2570064
swap 分区的大小变成了 2500MB,加载成功了。如果要取消新加入的 swap 分区,则也很简单,命令如下:
[root@localhost ~]# swapoff /dev/sdb1
如果想让 swap 分区开机之后自动挂载,就需要修改 /etc/fstab 文件,命令如下:
[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults 1 1
UUID=0b23d315-33a7-48a4-bd37-9248e5c443451 boot ext4 defaults 1 2
UUID=4021be19-2751-4dd2-98cc-383368c39edb swap swap defaults 0 0
tmpfs /dev/shm
tmpfs defaults 0 0
devpts /dev/pts
devpts gid=5, mode=620 0 0
sysfs /sys
sysfs defaults 0 0
proc /proc
proc defaults 0 0
/dev/sdb1 swap swap
defaults 0 0
#加入新swap分区的相关内容,这里直接使用分区的设备文件名,也可以使用UUID。