我们会介绍硬盘的基本结构、Linux中常见的文件系统、fdisk命令分区和swap分区的手工分配等内容。文件系统这个名词大家都很陌生,不过如果说成分区,大家就比较容易理解了。原先每个分区只能格式化为一个文件系统,所以我们可以认为文件系统就是指分区。不过随着技术的进步,现在一个文件系统可以由几个分区组成,或者一个分区可以格式化为几个不同的文件系统,所以我们已经不能把文件系统和分区等同对待了。不过,为了便于理解,大家可以把文件系统想象成分区。
硬盘是计算机的主要外部存储设备。计算机中的存储设备种类非常多,常见的主要有软盘、硬盘、光盘、U盘等,甚至还有网络存储设备SAN、NAS等,不过我们使用最多的还是硬盘。如果从存储数据的介质上来区分,那么硬盘可以分为机械硬盘(Hard Disk Drive, HDD)和固态硬盘(Solid State Disk,SSD),机械硬盘采用磁性碟片来存储数据,而固态硬盘是通过闪存颗粒来存储数据的。
我们先来看看最常见的机械硬盘。机械硬盘的外观大家可能都见过,那么机械硬盘拆开后是什么样子的呢?如下图所示:
机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成,我们的数据就存放在磁盘盘片当中。大家见过老式的留声机吗?留声机上使用的唱片和我们的磁盘盘片非常相似,只不过留声机只有一个磁头,而硬盘是上下双磁头,盘片在两个磁头中间高速旋转,类似下图:
也就是说,机械硬盘是上下盘面同时进行数据读取的。而且机械硬盘的旋转速度要远高于唱片(目前机械硬盘的常见转速是7200 r/min),所以机械硬盘在读取或写入数据时,非常害怕晃动和磕碰。另外,因为机械硬盘的超高转速,如果内部有灰尘,则会造成磁头或盘片的损坏,所以机械硬盘内部是封闭的,如果不是在无尘环境下,则禁止拆开机械硬盘。
我们已经知道数据是写入磁盘盘片的,那么数据是按照什么结构写入的呢?机械硬盘的逻辑结构主要分为磁道、扇区和柱面。我们来看看下图:
什么是磁道呢?每个盘片都在逻辑上拥有很多的同心圆,最外面的同心圆就是0磁道。我们将每个同心圆称作磁道(注意,磁道只是逻辑结构,在盘面上并没有真正的同心圆)。硬盘的磁道密度非常高,通常一面上就有上千个磁道。但是相邻的磁道之间并不是紧挨着的,这是因为磁化单元相隔太近会相互产生影响。
那扇区又是什么呢?扇区其实是很形象的,大家都见过折叠的纸扇吧,纸扇打开后是半圆形或扇形的,不过这个扇形是由每个扇骨组合形成的。在磁盘上每个同心圆是磁道,从圆心向外呈放射状地产生分割线(扇骨),将每个磁道等分为若干弧段,每个弧段就是一个扇区。每个扇区的大小是固定的,为512Byte。扇区也是磁盘的最小存储单位。
那柱面又是什么呢?如果硬盘是由多个盘片组成的,每个盘面都被划分为数目相等的磁道,那么所有盘片都会从外向内进行磁道编号,最外侧的就是0磁道。具有相同编号的磁道会形成一个圆柱,这个圆柱就被称作磁盘的柱面,如下图所示:
硬盘的大小是使用“磁头数×柱面数×扇区数×每个扇区的大小”这样的公式来计算的。其中,磁头数(Heads)表示硬盘共有几个磁头,也可以理解为硬盘有几个盘面,然后乘以2;柱面数(Cylinders)表示硬盘每面盘片有几条磁道;扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是512Byte。
机械硬盘通过接口与计算机主板进行连接。硬盘的读取和写入速度与接口有很大关系。大家都见过大礼堂吧,大礼堂中可以容纳很多人,但是如果只有一扇很小的门,那么人是很难进入或出来的,这样会造成拥堵,甚至会出现事故。机械硬盘的读取和写入也是一样的,如果接口的性能很差,则同样会影响机械硬盘的性能。目前我们常见的机械硬盘接口有这样几种:
固态硬盘和传统的机械硬盘最大的区别就是不再采用盘片进行数据存储,而采用存储芯片进行数据存储。固态硬盘的存储芯片主要分为两种:一种是采用闪存作为存储介质的;另一种是采用DRAM作为存储介质的。目前使用较多的主要是采用闪存作为存储介质的固态硬盘,如下图所示:
固态硬盘和机械硬盘对比主要有以下一些特点,如下表所示:
大家可以发现,固态硬盘因为丢弃了机械硬盘的物理结构,所以相比机械硬盘具有了低能耗、无噪声、抗震动、低散热、体积小和速度快的优势;不过价格相比机械硬盘更高,而且使用寿命有限。
硬盘是用来存储数据的,我们可以将其想象成柜子,只不过柜子是用来存储衣物的。分区就是把一个大柜子按照要求分割成几个小柜子(组合衣柜);格式化就是在每个小柜子中打入隔断,决定每个隔断的大小和位置,然后在柜门上贴上标签,标签中写清楚每件衣服保存的隔断的位置和这件衣服的一些特性(比如衣服是谁的,衣服的颜色、大小等)。很多人认为格式化的目的就是清空数据,其实格式化是为了写入文件系统(就是在硬盘中打入隔断并贴上标签)。
我们已经知道了,格式化是为了规划和写入文件系统。那么,Linux中的文件系统到底是什么?它是什么样子的呢?在CentOS 6.3系统中默认的文件系统是ext4,它是ext3文件系统的升级版。ext4文件系统在性能、伸缩性和可靠性方面进行了大量改进。ext4文件系统的变化可以说是翻天覆地的,比如向下兼容ext3、最大1EB文件系统和16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等。ext4文件系统是由Theodore Tso (ext3的维护者)领导的开发团队实现的,并引入2.6.19内核中。
那么,文件系统到底是如何运作的呢?文件系统中除要保存文件的数据外,还要保存文件的属性,如文件的权限、所有者、属组和时间参数等内容。文件系统把文件的数据和属性分开存放,把文件的数据放入date block中(数据块,保存文件的具体数据。类似衣柜的隔断,用来真正保存衣物),把文件的属性保存在inode中(i节点,保存文件属性,如权限、所有者、属组和时间参数等。类似衣柜门上贴的标签,标签中写入衣物的特性)。每个block和inode都有序列号,用来区分和编码。另外,还有一个super block(超级块)用于记录整个文件系统的信息,如inode和block的总量、已经使用量和剩余量。总结一下:
大家注意到了吗?在inode中并没有保存文件的文件名,那是因为文件名是文件所在目录的数据,所以保存在上一级目录的block中。还记得我们在讲权限命令的时候说过,要对文件的上一级目录拥有w权限,才能删除目录中的文件,就是因为文件名是保存在目录的block中的。
Linux系统能够支持的文件系统非常多,除Linux默认文件系统ext2、ext3和ext4之外,还能支持fat16、fat32、NTFS(需要重新编译内核)等Windows文件系统。也就是说,Linux可以通过挂载的方式使用Windows文件系统中的数据。Linux所能够支持的文件系统在“/usr/src/kernels/当前系统版本/fs”目录中(需要在安装时选择),该目录中的每个子目录都是一个可以识别的文件系统。我们介绍较为常见的Linux支持的文件系统,如下表所示:
不管是Windows系统还是Linux系统,可以识别的分区类型就是以下三种,如下图所示:
我们知道,在Linux系统中,所有内容都是以文件方式保存的。硬盘和分区也是一样的。我们使用“sd”代表SCSI或SATA硬盘,使用“hd”代表IDE硬盘。使用“1~4”代表主分区或者扩展分区,使用“5~59”代表逻辑分区。
也就是说,如果按照上图所示的方式来分区,那么分区的设备文件名就如下表所示:
如果采用下图所示的方式来分区:
那么分区的设备文件名就如下表所示:
对于第二种分区方式,虽然主分区和扩展分区加起来只有两个,但是分区号3和分区号4就算空着也不能被逻辑分区占用。也就是说,不管怎么分区,逻辑分区一定是从/dev/sda5开始计算的。
通过df命令可以查看已经挂载的文件系统的信息,包括设备文件名、文件系统总大小、已经使用的大小、剩余大小、使用率和挂载点等。命令格式如下:
[root@localhost ~]# df [选项] [挂载点或分区设备文件名]
选项:
-a: 显示所有文件系统信息,包括特殊文件系统,如/proc、/sysfs
-h: 使用习惯单位显示容量,如KB、MB或GB等
-T: 显示文件系统类型
-m: 以MB为单位显示容量
-k: 以KB为单位显示容量。默认以KB为单位
举个例子:
例了1: 显示系统内的文件系统信息
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 28744836 2243516 25041148 9% /
tmpfs 515396 0 515396 0% /dev/shm
#内存虚拟出来的磁盘空间
/dev/sda1 198337 26333 161764 14% /boot
说明一下命令的输出结果:
例子2:
[root@localhost ~]# df –ahT
#-a 显示特殊文件系统,这些文件系统几乎都是保存在内存中的,如/proc。因为是挂载在内存中的,所以
#占用量都是0
#-h 单位不再只用KB,而是换算成习惯单位
#-T 多出了文件系统类型一列
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 ext4 28G 2.2G 24G 9% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devpts devpts 0 0 0 - /dev/pts
tmpfs tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 ext4 194M 26M 158M 14% /boot
none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs
/dev/sr0 iso9660 3.5G 3.5G 0 100% /mnt/cdrom
du是统计目录或文件所占磁盘空间大小的命令,需要注意的是,使用“ls -l”命令是可以看到文件的大小的。但是大家会发现,在使用“ls -l”命令查看目录大小时,目录的大小多数是4KB,这是因为目录下的子目录名和子文件名是保存到父目录的block(默认大小为4KB)中的,如果父目录下的子目录和子文件并不多,一个block就能放下,那么这个父目录就只占用了一个block大小。大家可以将其想象成图书馆的书籍目录和实际书籍。如果我们用“ls -l”命令查看,则只能看到这些书籍占用了1页纸的书籍目录,但是实际书籍到底有多少是看不到的,哪怕它堆满了几个房间。
但是我们在统计目录时,不是想看父目录下的子目录名和子文件名到底占用了多少空间,而是想看父目录下的子目录和子文件的总磁盘占用量大小,这时就需要使用du命令才能统计目录的真正磁盘占用量大小。du命令的格式如下:
[root@localhost ~]# du [选项] [目录或文件名]
选项:
-a: 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h: 使用习惯单位显示磁盘占用量,如KB、MB或GB等
-s: 统计总磁盘占用量,而不列出子目录和子文件的磁盘占用量
举几个例子:
例子1:
[root@localhost ~]# du
#统计当前目录的总磁盘占用量大小,同时会统计当前目录下所有子目录的磁盘占用量大小,不统计子文件
#磁盘占用量的大小。默认单位为KB
20 ./.gnupg ← 统计每个子目录的大小
24 ./yum.bak
8 ./dtest
28 ./sh
188 . ← 统计当前目录总大小
例子2:
[root@localhost ~]# du -a
#统计当前目录的总大小,同时会统计当前目录下所有子文件和子目录磁盘占用量的大小。默认单位为KB
4 ./.bash_logout
36 ./install.log
4 ./.bash_profile
4 ./.cshrc
...省略部分输出...
188 .
例子3:
[root@localhost ~]# du –sh
#只统计磁盘占用量总的大小,同时使用习惯单位显示
188K .
有时我们会发现,使用du命令和df命令去统计分区的使用情况时,得到的数据是不一样的。那是因为df命令是从文件系统的角度考虑的,通过文件系统中未分配的空间来确定文件系统中已经分配的空间大小。也就是说,在使用df命令统计分区时,不仅要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)。而du命令是面向文件的,只会计算文件或目录占用的磁盘空间。也就是说,df命令统计的分区更准确,是真正的空闲空间。
Linux中所有的存储设备都必须在挂载之后才能使用,包括硬盘、U盘和光盘(swap分区是系统直接调用的,所以不需要挂载)。不过,硬盘分区在安装时就已经挂载了,而且会在每次系统启动时自动挂载,所以不需要手工参与。但是在Linux系统中要想使用光盘和U盘,就需要学一些挂载命令。
我们还需要复习一下,挂载是指把硬盘分区(如分区/dev/sdb1,其实指的是文件系统)和挂载点(已经建立的空目录)联系起来的过程。这里需要注意,挂载点必须是目录,而且原则上应该使用空目录作为挂载点。
如果不使用空目录作为挂载点,而使用已经有数据的目录(如/etc/目录)作为挂载点,则会出现什么情况呢?很简单,原先/etc/目录下的数据就查找不到了,在/etc/目录中只能看到新的分区中的数据。这是因为/etc/目录原先并不是单独的分区,而是/分区的子目录,所以/etc/目录中的数据实际上保存在/分区的block中。但是现在给/etc/目录单独分区了,再向/etc/目录中保存数据,就会保存在/etc/目录的新分区的block中,那么原始数据当然就不能看到了。如果还想访问原始数据,则只能把新分区卸载掉。
说了这么多,mount命令的具体格式如下:
[root@localhost ~]# mount [-l]
#查询系统中已经挂载的设备,-l会显示卷标名称
[root@localhost ~]# mount –a
#依据配置文件/etc/fstab的内容,自动挂载
[root@localhost ~]# mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] \
设备文件名 挂载点
#\代表这一行没有写完,换行
选项:
-t 文件系统: 加入文件系统类型来指定挂载的类型,可以是ext3、ext4、iso9660
等文件系统,具体可以参考表9-1
-L 卷标名: 挂载指定卷标的分区,而不是安装设备文件名挂载
-o 特殊选项: 可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,
则默认值生效。具体的特殊选项参见表9-5
例子1:
[root@localhost ~]# mount
#查看系统中已经挂载的文件系统,注意有虚拟文件系统
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw, gid=5, mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
#命令结果表示:将/dev/sda3分区挂载到/目录,文件系统是ext4,权限是读写
例子2:修改特殊权限
[root@localhost ~]# mount
#我们查看到/boot分区已经被挂载了,而且采用的是defaults选项,那么我们重新挂载分区,并采用
#noexec权限禁止执行文件执行,看看会出现什么情况(注意不要用/分区做实验,否则系统命令也就不能
#执行了)
…省略部分输出…
/dev/sda1 on /boot type ext4 (rw)
…省略部分输出…
[root@localhost ~]# mount -o remount, noexec /boot
#重新挂载/boot分区,并使用noexec权限
[root@localhost sh]# cd /boot/
[root@localhost boot]# vi hello.sh
#写一个Shell吧
#! /bin/bash
echo "hello! ! "
[root@localhost boot]# chmod 755 hello.sh
[root@localhost boot]# ./hello.sh
-bash: ./hello.sh: 权限不够
#虽然赋予了hello.sh执行权限,但是仍然无法执行
[root@localhost boot]# mount -o remount, exec /boot
#记得改回来,否则会影响系统启动
如果我们做实验修改了特殊选项,那一定要记住,而且确定需要修改;否则非常容易出现系统问题,而且还找不到问题的根源。
例子3:挂载分区
[root@localhost ~]# mkdir /mnt/disk1
#建立挂载点目录
[root@localhost ~]# mount /dev/sdb1 /mnt/disk1
#挂载分区
/dev/sdb1分区还没有被划分。我们在这里只看看挂载分区的方式,非常简单,甚至不需要使用“-t ext4”命令指定文件系统,因为系统是可以自动检测的。
在Windows中如果想要使用光盘,则只需把光盘放入光驱,单击使用即可。但是在Linux中除了要把光盘放入光驱,而且必须在挂载之后才能正确使用。还要记得用完光盘后也不能像Windows一样,直接弹出光驱取出光盘,而必须先卸载才能取出光盘(确实不如Windows方便,不过这也只是一个操作习惯,习惯了就好)。挂载命令如下(当然要记得在Linux中放入光盘):
[root@localhost ~]# mkdir /mnt/cdrom/
#建立挂载点
[root@localhost ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom/
#挂载光盘
光盘的文件系统是iso9660,不过这个文件系统可以省略不写,系统会自动检测,命令如下:
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
#挂载光盘。两个挂载光盘的命令使用一个就可以了
[root@localhost ~]# mount
#查看已经挂载的设备
…省略部分输出…
/dev/sr0 on /mnt/cdrom type iso9660 (ro)
#光盘已经挂载了,但是挂载的设备文件名是/dev/sr0
我们已经知道挂载就是把光驱的设备文件和挂载点连接起来。挂载点/mnt/cdrom是我们手工建立的空目录,我个人习惯把挂载点建立在/mnt/目录中,因为我们在学习Linux的时候是没有/media/目录的,大家要是愿意也可以建立/media/cdrom作为挂载点,只要是已经建立的空目录都可以作为挂载点。那么/dev/cdrom就是光驱的设备文件名,不过注意/dev/cdrom只是一个软链接。命令如下:
[root@localhost ~]# ll /dev/cdrom
lrwxrwxrwx 1 root root 3 1月 31 01:13 /dev/cdrom -> sr0
/dev/cdrom的源文件是/dev/sr0。/dev/sr0是光驱的真正设备文件名,代表SCSI接口或SATA接口的光驱,所以刚刚查询挂载时看到的光驱设备文件命令是/dev/sr0。也就是说,挂载命令也可以写成这样:
[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/
其实光驱的真正设备文件名是保存在/proc/sys/dev/cdrom/info文件中的,所以可以通过查看这个文件来查询光盘的真正设备文件名,命令如下:
[root@localhost ~]# cat /proc/sys/dev/cdrom/info
CD-ROM information, Id: cdrom.c 3.202003/12/17
drive name: sr0
…省略部分输出…
其实挂载U盘和挂载光盘的方式是一样的,只不过光盘的设备文件名是固定的(/dev/sr0或/dev/cdrom),而U盘的设备文件名是在插入U盘后系统自动分配的。因为U盘使用的是硬盘的设备文件名,而每台服务器上插入的硬盘数量和分区方式都是不一样的,所以U盘的设备号需要单独检测与分配,以免和硬盘的设备文件名产生冲突。U盘的设备文件名是系统自动分配的,我们只要查找出来然后挂载就可以了。
首先把U盘插入Linux系统中(注意:如果是虚拟机,则需要先把鼠标点入虚拟机再插入U盘),然后就可以使用fdisk命令查看U盘的设备文件名了。命令如下:
[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
#系统硬盘
…省略部分输出…
Disk /dev/sdb: 8022 MB, 8022654976 bytes
#这就是识别的U盘,大小为8GB
94 heads, 14 sectors/track, 11906 cylinders
Units = cylinders of 1316 * 512 = 673792 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 1 11907 7834608 b W95 FAT32
#系统给U盘分配的设备文件名
查看到U盘的设备文件名,接下来就要创建挂载点了。命令如下:
[root@localhost ~]# mkdir /mnt/usb
然后就是挂载了,挂载命令如下:
[root@localhost ~]# mount -t vfat /dev/sdb1 /mnt/usb/
#挂载U盘。因为是Windows分区,所以是vfat文件系统格式
[root@localhost ~]# cd /mnt/usb/
#去挂载点访问U盘数据
[root@localhost usb]# ls
?? ? ? ? ? ? ? ? ? ? ? (5).xls DSC_6843.jpg ? ? VCR(? ).mp4
?? 1111111? ? ? ? ? ? ? ? .xls ? ? ? ? ? ? ? .BD? ?1280? ? ? ? ? ? .rmvb J02 ? ? ? ? .wps
#之所以出现乱码,是因为编码格式不同
之所以出现乱码,是因为U盘是Windows中保存的数据,而Windows中的中文编码格式和Linux中的不一致,只需在挂载的时候指定正确的编码格式就可以解决乱码问题,命令如下:
[root@localhost ~]# mount -t vfat -o iocharset=utf8 /dev/sdb1 /mnt/usb/
#挂载U盘,指定中文编码格式为UTF-8
[root@localhost ~]# cd /mnt/usb/
[root@localhost usb]# ls
1111111年度总结及计划表.xls Zsyq1HL7osKSPBoGshZBr6.mp4 协议书
12月21日.doc 恭喜发财(定).mp4 新年VCR(定).mp4
#可以正确地查看中文了
因为我们的Linux在安装时采用的是UTF-8编码格式,所以要让U盘在挂载时也指定为UTF-8编码格式,才能正确显示。
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
#查看一下Linux默认的编码格式
注意:Linux默认是不支持NTFS文件系统的,所以默认是不能挂载NTFS格式的移动硬盘的。
要想让Linux支持移动硬盘,主要有三种方法:一是重新编译内核,加入ntfs模块,然后安装ntfs模块即可;二是不自己编译内核,而是下载已经编译好的内核,直接安装即可;三是安装NTFS文件系统的第三方插件,也可以支持NTFS文件系统。
光盘和U盘使用完成后,在取出之前都要卸载。不过,硬盘分区是否需要卸载取决于你下次是否还需要使用,一般硬盘分区不用卸载。卸载命令如下:
[root@localhost ~]# umount 设备文件名或挂载点
[root@localhost ~]# umount /mnt/usb
#卸载U盘
[root@localhost ~]# umount /mnt/cdrom
#卸载光盘
[root@localhost ~]# umount /dev/sr0
#命令加设备文件名同样是可以卸载的
卸载命令后面既可以加设备文件名也可以加挂载点,不过只能加一个,如果加了两个,如“umount /dev/sr0/mnt/cdrom”,就会对光驱卸载两次,当然卸载第二次的时候就会报错。
我们在安装操作系统的过程中已经对系统硬盘进行了分区,但是如果我新添加了一块硬盘,想要正确使用,当然需要分区和格式化,难道我需要重新安装操作系统才可以分区吗?当然不是,在Linux中有专门的分区命令fdisk和parted。其中fdisk命令较为常用,但不支持大于2TB的分区;如果需要支持大于2TB的分区,则需要使用parted命令,当然parted命令也能分配较小的分区。我们先来看看如何使用fdisk命令进行分区吧。分区共需要以下几个步骤:
如果把/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 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/sdb5 /disk5 ext4 defaults 1 2
/dev/sdb /disk6 ext4 defaults 1 2
#故意把/dev/sdb6写成了/dev/sdb
我们重新启动系统,真的报错了,如下图所示:
先别急,仔细看看,系统提示输入root密码,我们输入密码试试,如下图所示:
别慌,分析一下原因提示是没有写权限,那么只要把/分区重新挂载上读写权限不就可以修改了吗?命令如下:
[root@localhost ~]# mount -o remount, rw /
再去修改/etc/fstab文件,把它改回来就可以正常启动了。
在Linux系统中有两种常见的分区表:MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表):
fdisk工具不能支持GPT分区表,所以最大只能支持2TB的分区。不过随着硬盘容量的不断增加,总有一天2TB的分区会不够用,这时就必须使用parted命令来进行系统分区了。不过parted命令也有一点小问题,就是命令自身分区的时候只能格式化成ext2文件系统,不支持ext3文件系统,更不用说ext4文件系统了(这里只是指不能用parted命令把分区格式化成ext4文件系统,但是parted命令还是可以识别ext4文件系统的)。不过这没有太大的影响,因为我们可以先分区再用mkfs命令进行格式化。
我们在安装系统的时候已经建立了swap分区。swap分区是Linux系统的交换分区,当内存不够用的时候,我们使用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.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: 0x00000ebd
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 / 512 bytes
Disk identifier: 0x00000ebd
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=c3351dc3-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分区的使用情况的,其中,total是指总数,used是指已经使用的,free是指空闲的,shared是指共享的,buffers是指缓冲内存数,cached是指缓存内存数,单位是KB。
我们需要解释一下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-9248e5c44345 /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