一、磁盘的分区、格式化、检验与挂载
对于一个系统管理者( root )而言,磁盘的的管理是相当重要的一环,尤其近来磁盘已经渐渐的被当成是消耗品了 … 如果我们想要在系统里面新增一颗磁盘时,应该有哪些动作需要做的呢:
-
对磁盘进行分区,以创建可用的 partition ;
-
对该 partition 进行格式化 (format),以创建系统可用的 filesystem;
-
若想要仔细一点,则可对刚刚创建好的 filesystem 进行检验;
-
在 Linux 系统上,需要创建挂载点 (亦即是目录),并将他挂载上来;
磁盘的使用必需要经过:分区、格式化与挂载,分别惯用的指令为:gdisk或fdisk, mkfs, mount三个指令 ,MBR分区表使用fdisk分区,GPT分区表使用gdisk分区
当然啰,在上述的过程当中,还有很多需要考虑的,例如磁盘分区 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 与 block 的数量应该如何规划等等的问题。但是这些问题的决定, 都需要与你的主机用途来加以考虑的~所以,在这个小节里面,鸟哥仅会介绍几个动作而已, 更详细的设置值,则需要以你未来的经验来参考啰!
1. 观察磁盘分区状态
由于目前磁盘分区主要有 MBR
以及 GPT
两种格式,这两种格式所使用的分区工具不太一样!你当然可以使用本章预计最后才介绍的 parted 这个通通有支持的工具来处理,不过,我们还是比较习惯使用 fdisk 或者是 gdisk 来处理分区啊!因此,我们自然就得要去找一下目前系统有的磁盘有哪些? 这些磁盘是 MBR 还是 GPT 等等的!这样才能处理啦!
1.1 lsblk 列出系统上的所有磁盘列表
lsblk 可以看成“ list block device ”的缩写,就是列出所有储存设备的意思!这个工具软件真的很好用喔!来瞧一瞧!
[root@study ~]# lsblk [-dfimpt] [device]
选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据)
-p :列出该设备的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等
范例一:列出本系统下的所有磁盘与磁盘内的分区信息
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 444K 0 rom
vda 252:0 0 300G 0 disk
|-vda1 252:1 0 200M 0 part
|-vda2 252:2 0 1M 0 part /boot
|-vda3 252:4 0 19.3G 0 part
| `-centos-root 253:0 0 40G 0 lvm /
| `-centos-swap 253:0 0 40G 0 lvm [swap]
| `-centos-home 253:0 0 40G 0 lvm /home
从上面的输出我们可以很清楚的看到,目前的系统主要有个 sr0 以及一个 vda 的设备,而vda 的设备下面又有三个分区, 其中 vda3 甚至还有因为 LVM 产生的文件系统!相当的完整吧!从范例一我们来谈谈默认输出的信息有哪些。
lvm技术把vda3分区挂载为三个文件系统,否则一般情况下分区和挂载点是一对一的关系
-
NAME:就是设备的文件名啰!会省略 /dev 等前导目录!
也就是说本质上,你看到的应该是 /dev/sr0、/dev/vda、/dev/vda1等,参见 【linux命令】df和du的区别、Filesystem文件系统&&与分区关系 && Device设备。他们都是 /dev/目录下的文件,当你使用lsblk查看全部分区信息时,显示的结果会省略/dev,但你当你想看某个具体分区时,必须带上/dev ,否则会报没有此设备。
-
MAJ:MIN:其实核心认识的设备都是通过这两个代码来熟悉的!分别是主要:次要设备
代码! -
RM:是否为可卸载设备 (removable device),如光盘、USB 磁盘等等
-
SIZE:当然就是容量啰!
-
RO:是否为只读设备的意思
-
TYPE:是磁盘 (disk)、分区 (partition) 还是只读存储器 (rom) 等输出
-
MOUTPOINT:就是前一章谈到的挂载点!
笔者自己的环境样例:
[pict@paas-controller-3:~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 444K 0 rom /media/cdrom
vda 252:0 0 300G 0 disk
|-vda1 252:1 0 200M 0 part /boot/efi
|-vda2 252:2 0 1M 0 part
|-vda3 252:3 0 500M 0 part /boot
|-vda4 252:4 0 19.3G 0 part
| `-ncl-root 253:0 0 40G 0 lvm /
`-vda5 252:5 0 280G 0 part
|-ncl-root 253:0 0 40G 0 lvm /
|-ncl-lv_P 253:1 0 204.3G 0 lvm /paasdata
|-ncl-lv_Popauditlog 253:2 0 5G 0 lvm /var/log/audit
|-ncl-lv_P_L 253:3 0 20G 0 lvm /paasdata/op-log
`-ncl-lv_P_T 253:4 0 30G 0 lvm /paasdata/op-tenant
vdb 252:16 0 300G 0 disk /NFS_DIR/share0
范例二:仅列出 /dev/vda 设备内的所有数据的完整文件名
与范例一相比,就是指定了某个磁盘,缩写查看范围
[root@study ~]# lsblk -ip /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 252:0 0 300G 0 disk
|-/dev/vda1 252:1 0 200M 0 part
|-/dev/vda2 252:2 0 1M 0 part /boot
|-/dev/vda3 252:4 0 19.3G 0 part
| `-/dev/mapper/centos-root 253:0 0 40G 0 lvm /
| `-/dev/mapper/centos-swap 253:0 0 40G 0 lvm [swap]
| `-/dev/mapper/centos-home 253:0 0 40G 0 lvm /home # 完整的文件名,由 / 开始写
注意:此时带上了前导目录/dev/
1.2. blkid 列出设备的 UUID 等参数
虽然 lsblk 已经可以使用lsblk -f
来列出文件系统与设备的 UUID
数据,不过,鸟哥还是比较习惯直接使用 blkid
来找出设备的 UUID
喔! 什么是 UUID 呢?UUID 是全域单一识别码(universally unique identifier),Linux 会将系统内所有的设备都给予一个独一无二的识别码, 这个识别码就可以拿来作为挂载或者是使用这个设备/文件系统之用了。
[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"
如上所示,每一行代表一个文件系统,主要列出设备名称、UUID 名称以及文件系统的类型(TYPE)!这对于管理员来说,相当有帮助! 对于系统上面的文件系统观察来说,真是一目了然!
1.3. parted 列出磁盘的分区表类型与分区信息
虽然我们已经知道了系统上面的所有设备,并且通过 blkid 也知道了所有的文件系统!不过,还是不清楚磁盘的分区类型。 这时我们可以通过简单的 parted 来输出喔!我们这里仅简单的利用他的输出而已~本章最后才会详细介绍这个指令的用法的!
用来查看是mbr还是gtp分区
语法:
parted device_name print
范例一:列出 /dev/vda 磁盘的相关数据
[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) # 磁盘的模块名称(厂商)
Disk /dev/vda: 42.9GB # 磁盘的总容量
Sector size (logical/physical): 512B/512B # 磁盘的每个逻辑/物理扇区容量
Partition Table: gpt # 分区表的格式 (MBR/GPT)
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags # 下面才是分区数据
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm
笔者自己的环境样例:
[root@paas-controller-3:/home/pict]$ parted /dev/vda print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 322GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 211MB 210MB fat16 efi boot
2 211MB 212MB 1049kB bios bios_grub
3 212MB 736MB 524MB ext4 boot
4 736MB 21.5GB 20.7GB root lvm
5 21.5GB 322GB 301GB primary
看到上表
的说明,你就知道啦!我们用的就是 GPT 的分区格式
喔!这样会观察磁盘分区了吗?接下来要来操作磁盘分区了喔!
2 磁盘分区: gdisk/fdisk
接下来我们想要进行磁盘分区啰!要注意的是:“MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区!
” 这个不要搞错~否则会分区失败的!另外,这两个工具软件的操作很类似,执行了该软件后,可以通过该软件内部的说明数据来操作, 因此不需要硬背!只要知道方法即可。刚刚从上面 parted 的输出结果,我们也知道鸟哥这个测试机使用的是 GPT 分区, 因此下面通通得要使用 gdisk 来分区才行!
2.1 gdisk
语法:
[root@study ~]# gdisk 设备名称
范例:由前一小节的 lsblk 输出,我们知道系统有个 /dev/vda
,请观察该磁盘的分区与相关数据:
[root@paas-controller-3:/home/pict]$ gdisk /dev/vda '<==仔细看,不要加上数字喔!'
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT. '<==找到了 GPT 的分区表!'
Command (? for help): '<==这里可以让你输入指令动作,可以按问号 (?) 来查看可用指令'
输入?查看说明:
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition # 删除一个分区
i show detailed information on a partition
l list known partition types
n add a new partition # 增加一个分区
o create a new empty GUID partition table (GPT)
p print the partition table # 印出分区表 (常用)
q quit without saving changes # 不储存分区就直接离开 gdisk
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit # 储存分区操作后离开 gdisk
x extra functionality (experts only)
? print this menu
你应该要通过 lsblk 或 blkid 先找到磁盘,再用 parted /dev/xxx print 来找出内部的分区表类型,之后才用 gdisk 或 fdisk 来操作系统。 上表中可以发现 gdisk 会扫描 MBR 与 GPT 分区表,不过这个软件还是单纯使用在 GPT 分区表比较好啦!
老实说,使用 gdisk 这支程序是完全不需要背指令的!如同上面的表格中,你只要按下 ? 就能够看到所有的动作!
比较重要的动作在上面已经用底线画出来了,你可以参考看看。其中比较不一样的是“q 与 w”这两个玩意儿! 不管你进行了什么动作,只要离开 gdisk 时按下“q”,那么所有的动作“都不会生效!”相反的, 按下“w”就是动作生效的意思。
所以,你可以随便玩gdisk ,只要离开时按下的是“q”即可。 _! 好了,先来看看分区表信息吧!
Command (? for help): p '<== 这里可以输出目前磁盘的状态'
Disk /dev/vda: 83886080 sectors, 40.0 GiB '# 磁盘文件名/扇区数与总容量'
Logical sector size: 512 Bytes '# 单一扇区大小为 512 Bytes'
Disk identifier (GUID): A4C3C813-62AF-4BFE-BAC9-112EBD87A483 '# 磁盘的 GPT 识别码'
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)
# 分区编号 开始扇区号码 结束扇区号码 容量大小
Number Start (sector) End (sector) Size Code Name '# 下面为完整的分区信息了!'
1 2048 6143 2.0 MiB EF02 '# 第一个分区数据'
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
Command (? for help): q
'# 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊!'
2.2.1 gdisk进行分区和删除分区
2.2 fdisk
虽然 MBR 分区表在未来应该会慢慢的被淘汰,毕竟现在磁盘容量随便都大于 2T 以上了。而对于在 CentOS 7.x 中还无法完整支持 GPT 的 fdisk 来说, 这家伙真的英雄无用武之地了啦!不过依旧有些旧的系统,以及虚拟机的使用上面,还是有小磁盘存在的空间!这时处理MBR 分区表, 就得要使用 fdisk 啰!
因为 fdisk 跟 gdisk 使用的方式几乎一样!只是一个使用 ? 作为指令提示数据,一个使用 m作为提示这样而已。 此外,fdisk 有时会使用柱面 (cylinder) 作为分区的最小单位,与gdisk 默认使用 sector 不太一样!大致上只是这点差别! 另外, MBR 分区是有限制的(Primary, Extended, Logical…)!不要忘记了!鸟哥这里不使用范例了
[root@study ~]# fdisk /dev/sda
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 <==删除一个partition
l list known partition types
m print this menu
n add a new partition <==新增一个partition
o create a new empty DOS partition table
p print the partition table <==在屏幕上显示分区表
q quit without saving changes <==不储存离开fdisk程序
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)
3. 磁盘格式化(创建文件系统)
分区完毕后自然就是要进行文件系统的格式化啰!格式化的指令非常的简单,那就是“makefilesystem, mkfs” 这个指令啦!这个指令其实是个综合的指令,他会去调用正确的文件系统格式化工具软件!因为 CentOS 7 使用 xfs 作为默认文件系统, 下面我们会先介绍 mkfs.xfs ,之后介绍新一代的 EXT 家族成员 mkfs.ext4,最后再聊一聊 mkfs 这个综合指令吧!
3.1 XFS 文件系统 mkfs.xfs
我们常听到的“格式化”其实应该称为“创建文件系统 (make filesystem)”
才对啦!所以使用的指令是 mkfs 喔!那我们要创建的其实是 xfs 文件系统, 因此使用的是 mkfs.xfs 这个指令才对。这个指令是这样使用的:
[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \ [-r parms] 设备名称
选项与参数:
关於单位:下面只要谈到“数值”时,没有加单位则为 Bytes 值,可以用 k,m,g,t,p (小写)等来解释比较特殊的是 s 这个单位,它指的是 sector 的“个数”喔!
-b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!
-d :后面接的是重要的 data section 的相关参数值,主要的值有:
agcount=数值 :设置需要几个储存群组的意思(AG),通常与 CPU 有关
agsize=数值 :每个 AG 设置为多少容量的意思,通常 agcount/agsize 只选一个设置即可
file :指的是“格式化的设备是个文件而不是个设备”的意思!(例如虚拟磁盘)
size=数值 :data section 的容量,亦即你可以不将全部的设备容量用完的意思
su=数值 :当有 RAID 时,那个 stripe 数值的意思,与下面的 sw 搭配使用
sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
sunit=数值 :与 su 相当,不过单位使用的是“几个 sector(512Bytes大小)”的意思
swidth=数值 :就是 su*sw 的数值,但是以“几个 sector(512Bytes大小)”来设置
-f :如果设备内已经有文件系统,则需要使用这个 -f 来强制格式化才行!
-i :与 inode 有较相关的设置,主要的设置值有:
size=数值 :最小是 256Bytes 最大是 2k,一般保留 256 就足够使用了!
internal=[0|1]:log 设备是否为内置?默认为 1 内置,如果要用外部设备,使用下面设置
logdev=device :log 设备为后面接的那个设备上头的意思,需设置 internal=0 才可!
size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!
-L :后面接这个文件系统的标头名称 Label name 的意思!
-r :指定 realtime section 的相关设置值,常见的有:
extsize=数值 :就是那个重要的 extent 数值,一般不须设置,但有 RAID 时,
最好设置与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。
范例:将前一小节分区出来的 /dev/vda4 格式化为 xfs 文件系统
[root@study ~]# mkfs.xfs /dev/vda4
meta-data=/dev/vda4 isize=256 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
很快格是化完毕!都用默认值!较重要的是 inode 与 block 的数值
通过 blkid 查看 确定创建好 xfs 文件系统了:
[root@study ~]# blkid /dev/vda4
/dev/vda4: UUID="39293f4f-627b-4dfd-a015-08340537709c" TYPE="xfs" '这里我们能看到 设备对应的 type为 xfs'
使用默认的 xfs 文件系统参数来创建系统即可!速度非常快!
思考,为什么快?
如果我们有其他额外想要处理的项目,才需要加上一堆设置值!举例来说,因为 xfs 可以使用多个数据流来读写系统,以增加速度,因此那个 agcount 可以跟 CPU 的核心数来做搭配!举例来说,如果我的服务器仅有一颗 4 核心,但是有启动 Intel 超线程功能,则系统会仿真出 8 颗 CPU 时,那个 agcount 就可以设置为 8 喔!举个例子来瞧瞧:
略,可参考原文
3.2 XFS 文件系统 for RAID 性能优化 (Optional)
我们在第14章会持续谈到进阶文件系统的设置,其中就有磁盘阵列这个东西!磁盘阵列是多颗磁盘组成一颗大磁盘的意思, 利用同步写入到这些磁盘的技术,不但可以加快读写速度,还可以让某一颗磁盘坏掉时,整个文件系统还是可以持续运行的状态!那就是所谓的容错。
基本上,磁盘阵列 (RAID) 就是通过将文件先细分为数个小型的分区区块 (stripe) 之后,然后将众多的 stripes 分别放到磁盘阵列里面的所有磁盘, 所以一个文件是被同时写入到多个磁盘去,当然性能会好一些。为了文件的保全性,所以在这些磁盘里面,会保留数个(与磁盘阵列的规划有关) 备份磁盘 (parity disk), 以及可能会保留一个以上的备用磁盘(spare disk),这些区块基本上会占用掉磁盘阵列的总容量,不过对于数据的保全会比较有保障!
那个分区区块 stripe 的数值大多介于 4K 到 1M 之间,这与你的磁盘阵列卡支持的项目有关。stripe 与你的文件数据容量以及性能相关性较高。 当你的系统大多是大型文件时,一般建议stripe 可以设置大一些,这样磁盘阵列读/写的频率会降低,性能会提升。如果是用于系统,那么小文件比较多的情况下, stripe 建议大约在 64K 左右可能会有较佳的性能。不过,还是都须要经过测试啦!完全是 case by case 的情况。 更多详细的磁盘阵列我们在第 14 章再来谈,这里先有个大概的认识即可。14 章看完之后,再回来这个小节瞧瞧啰!
文件系统的读写要能够有最优化,最好能够搭配磁盘阵列的参数来设计,这样性能才能够起来!也就是说,你可以先在文件系统就将 stripe 规划好, 那交给 RAID 去存取时,它就无须重复进行文件的 stripe 过程,性能当然会更好!
那格式化时,最优化性能与什么咚咚有关呢?我们来假设个环境好了:
-
我有两个线程的 CPU 数量,所以 agcount 最好指定为 2
-
当初设置 RAID 的 stripe 指定为 256K 这么大,因此 su 最好设置为 256k
-
设置的磁盘阵列有 8 颗,因为是 RAID5 的设置,所以有一个 parity (备份碟),因此指定 sw 为 7
-
由上述的数据中,我们可以发现数据宽度 (swidth) 应该就是 256K*7 得到 1792K,可以指定 extsize 为 1792k
部分省略,参见原文。。。。
3.3 EXT4 文件系统 mkfs.ext4
如果想要格式化为 ext4 的传统 Linux 文件系统的话,可以使用 mkfs.ext4 这个指令即可!这个指令的参数快速的介绍一下!
语法:
[root@study ~]# mkfs.ext4 [-b size] [-L label] 设备名称
选项与参数:
-
-b :设置 block 的大小,有 1K, 2K, 4K 的容量,
-
-L :后面接这个设备的标头名称。
范例:将 /dev/vda5 格式化为 ext4 文件系统
省略,参见原文
4 文件系统检验
5 文件系统挂载与卸载
我们在本章一开始时的挂载点的意义当中提过挂载点是目录, 而这个目录是进入磁盘分区(其实是文件系统啦!)的入口就是了。
挂载点只能是目录
不过要进行挂载前,你最好先确定几件事:
(1)单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
(2)单一目录不应该重复挂载多个文件系统;
(3)要作为挂载点的目录,理论上应该都是空目录才是。
尤其是上述的后两点!如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。 举个例子来说,假设你的 /home 原本与根目录 (/)在同一个文件系统中,下面原本就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的磁盘,并且直接挂载 /home 下面,那么当你挂载上新的分区时,则 /home 目录显示的是新分区内的数据,至于原先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分区被卸载之后,则 /home 原本的内容就会再次的跑出来啦!
而要将文件系统挂载到我们的 Linux 系统上,就要使用 mount 这个指令啦! 不过,这个指令真的是博大精深~粉难啦!我们学简单一点啊~ _
[root@localhost ~]# mount [-l]
单纯使用 mount 命令,会显示出系统中已挂载的设备信息,使用 -l 选项,会额外显示出卷标名称(读者可自行运行,查看输出结果);
【例 1】
[root@localhost ~]# mount
#查看系统中已经挂载的文件系统,注意有虚拟文件系统
/dev/sda3 on / type ext4 (rw) <==含义是,将 /dev/sda3 分区挂载到了 / 目录上,文件系统是 ext4,具有读写权限
proc on /proc type proc (rw)
sysfe 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/fe/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfe/rpc_pipefs type rpc_pipefs (rw)
[root@localhost ~]# mount -a
-a 选项的含义是auto,自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
这里简单介绍一下 /etc/fstab
文件,此文件是自动挂载文件,系统开机时会主动读取 /etc/fstab 这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备。有关自动挂载(修改此文件)的具体介绍,会在后续文章中讲解。
[root@localhost ~]# mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
各选项的含义分别是:
-
-t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。
基本上,CentOS 7 已经太聪明了,因此你不需要加上 -t 这个选项,系统会自动的分析最恰当的文件系统来尝试挂载你需要的设备! 这也是使用 blkid 就能够显示正确的文件系统的缘故!那 CentOS 是怎么找出文件系统类型的呢? 由于文件系统几乎都有 superblock ,我们的Linux 可以通过分析 superblock 搭配 Linux 自己的驱动程序去测试挂载, 如果成功的套和了,就立刻自动的使用该类型的文件系统挂载起来啊!那么系统有没有指定哪些类型的filesystem 才需要进行上述的挂载测试呢? 主要是参考下面这两个文件:
-
(1)/etc/filesystems:系统指定的测试挂载文件系统类型的优先顺序;
-
(2)/proc/filesystems:Linux系统已经载入的文件系统类型。
那我怎么知道我的 Linux 有没有相关文件系统类型的驱动程序呢?我们 Linux 支持的文件系统之驱动程序都写在如下的目录中:
/lib/modules/$(uname -r)/kernel/fs/
例如 ext4 的驱动程序就写在“/lib/modules/$(uname -r)/kernel/fs/ext4/”这个目录下啦!
-
-
-L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载。
-
-n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
-
-o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults)。具体的特殊选项参见表 1;
选项 功能 rw/ro 是否对挂载的文件系统拥有读写权限,rw 为默认值,表示拥有读写权限;ro 表示只读权限。 async/sync 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步 async。 dev/nodev 是否允许从该文件系统的 block 文件中提取数据,为了保证数据安装,默认是 nodev。 auto/noauto 是否允许此文件系统被以 mount -a 的方式进行自动挂载,默认是 auto。 suid/nosuid 设定文件系统是否拥有 SetUID 和 SetGID 权限,默认是拥有。 exec/noexec 设定在文件系统中是否允许执行可执行文件,默认是允许。 user/nouser 设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以。 defaults 定义默认值,相当于 rw、suid、dev、exec、auto、nouser、async 这 7 个选项。 remount 重新挂载已挂载的文件系统,一般用于指定修改特殊权限。
另外, 过去我们都习惯使用设备文件名然后直接用该文件名挂载, 不过近期以来鸟哥比较建议使用 UUID 来识别文件系统,会比设备名称与标头名称还要更可靠!因为是独一无二的啊!
[root@study ~]# mount[-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] UUID='' 挂载点
5.1 挂载 xfs/ext4/vfat 等文件系统
范例:找出 /dev/vda4 的 UUID 后,用该 UUID 来挂载文件系统到 /data/xfs 内
[root@study ~]# blkid /dev/vda4
/dev/vda4: UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" TYPE="xfs"
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs
mount: mount point /data/xfs does not exist '# 非正规目录!目录尚不存在,所以先要手动创建它!'
[root@study ~]# mkdir -p /data/xfs
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs '再次执行挂载命令'
[root@study ~]# df /data/xfs
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda4 1038336 32864 1005472 4% /data/xfs
'# 顺利挂载,且容量约为 1G 左右没问题!'
范例:使用相同的方式,将 /dev/vda5 挂载于 /data/ext4
[root@study ~]# blkid /dev/vda5
/dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4"
[root@study ~]# mkdir /data/ext4
[root@study ~]# mount UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" /data/ext4
[root@study ~]# df /data/ext4
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda5 999320 2564 927944 1% /data/ext4
5.2 挂载 CD 或 DVD 光盘
请拿出你的 CentOS 7 原版光盘出来,然后放入到光驱当中,我们来测试一下这个玩意儿啰!
范例:将你用来安装 Linux 的 CentOS 原版光盘拿出来挂载到 /data/cdrom!
[root@study ~]# blkid
.....(前面省略).....
/dev/sr0: UUID="2015-04-01-00-21-36-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
[root@study ~]# mkdir /data/cdrom
[root@study ~]# mount /dev/sr0 /data/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@study ~]# df /data/cdrom
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sr0 7413478 7413478 0 100% /data/cdrom
'# 怎么会使用掉 100% 呢?是啊!因为是 DVD 啊!所以无法再写入了啊!'
光驱一挂载之后就无法退出光盘片了!除非你将他卸载才能够退出! 从上面的数据你也可以发现,因为是光盘嘛!所以磁盘使用率达到 100% ,因为你无法直接写入任何数据到光盘当中! 此外,如果你使用的是图形界面,那么系统会自动的帮你挂载这个光盘到 /media/ 里面去喔!也可以不卸载就直接退出! 但是文字界面没有这个福利就是了! _
Tips 话说当时年纪小 (其实是刚接触 Linux 的那一年, 1999 年前后),摸 Linux 到处碰壁!连将 CDROM 挂载后, 光驱竟然都不让我退片!那个时候难过的要死!还用回纹针插入光驱让光盘退片耶!不过如此一来光盘就无法被使用了! 若要再次使用光驱,当时的解决的方法竟然是“重新开机!”囧的可以啊!
5.3 挂载 vfat 中文U盘 (USB磁盘)
请拿出你的U盘并插入 Linux 主机的 USB接口中!注意,你的这个U盘不能够是 NTFS 的文件系统喔!接下来让我们测试测试吧!
范例:找出你的U盘设备的 UUID,并挂载到 /data/usb 目录中
[root@study ~]# blkid
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
[root@study ~]# mkdir /data/usb
[root@study ~]# mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb
[root@study ~]# # mount -o codepage=950,iocharset=big5 UUID="35BC-6D6B" /data/usb
[root@study ~]# df /data/usb
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 2092344 4 2092340 1% /data/usb
如果带有中文文件名的数据,那么可以在挂载时指定一下挂载文件系统所使用的语系数据。在 man mount 找到 vfat 文件格式当中可以使用 codepage 来处理!中文语系的代码为 950喔!另外,如果想要指定中文是万国码还是大五码, 就得要使用 iocharset 为 utf8 还是 big5两者择一了!因为鸟哥的U盘使用 utf8 编码,因此将上述的 big5 前面加上 # 符号, 代表注解该行的意思啰!
万一你使用的 USB 磁盘被格式化为 NTFS 时,那可能就得要动点手脚,因为默认的 CentOS7 并没有支持 NTFS 文件系统格式! 所以你得要安装 NTFS 文件系统的驱动程序后,才有办法处理的!这部份我们留待 22 章讲到 yum 服务器时再来谈吧! 因为目前我们也还没有网络、也没有讲软件安装啊! _
5.4 重新挂载根目录与挂载不特定目录
整个目录树最重要的地方就是根目录了,所以根目录根本就不能够被卸载的!问题是,如果你的挂载参数要改变, 或者是根目录出现“只读”状态时,如何重新挂载呢?最可能的处理方式就是重新开机 (reboot)! 不过你也可以这样做:
范例:将 / 重新挂载,并加入参数为 rw 与 auto
[root@study ~]# mount -o remount,rw,auto /
重点是那个“ -o remount,xx ”的选项与参数!请注意,要重新挂载 (remount) 时, 这是个非常重要的机制!
尤其是当你进入单人维护模式时,你的根目录常会被系统挂载为只读,这个时候这个指令就太重要了!
另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔!这并不是挂载文件系统,而是额外挂载某个目录的方法! 虽然下面的方法也可以使用 symbolic link 来链接,不过在某些不支持符号链接的程序运行中,还是得要通过这样的方法才行。
范例:将 /var 这个目录暂时挂载到 /data/var 下面:
[root@study ~]$ mkdir /data/var '新建/data/var'
[root@study ~]$ mount --bind /var /data/var '执行mount命令'
[root@study ~]$ ls -lid /var /data/var '查看2个目录'
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var
'#从结果来看,内容完全一模一样啊!因为挂载目录的缘故'
[root@study ~]$ mount | grep var '查看所有的带var的挂载信息'
/dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
'只查看到一条挂载信息'
看起来,其实两者链接到同一个 inode 嘛! _ 没错啦!通过这个 mount --bind
的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块 filesystem 的啦!所以从此进入/data/var 就是进入 /var 的意思喔
5.5 umount (将设备文件卸载)
语法:
[root@study ~]# umount [-fn] 设备文件名或挂载点
选项与参数:
-f :强制卸载!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸载文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸载。
就是直接将已挂载的文件系统给他卸载即是!卸载之后,可以使用 df 或 mount 看看是否还存在目录树中? 卸载的方式,可以下达设备文件名或挂载点,均可接受啦!下面的范例做看看吧!
范例:将本章之前自行挂载的文件系统全部卸载:
[root@study ~]$ mount '查看当前存在的挂载点'
.....(前面省略).....
/dev/vda4 on /data/xfs type xfs (rw,relatime,seclabel,attr2,inode64,logbsize=256k,sunit=512,..)
/dev/vda5 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sr0 on /data/cdrom type iso9660 (ro,relatime)
/dev/sda1 on /data/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=950,iocharset=...)
/dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
' 先找一下已经挂载的文件系统,如上所示,特殊字体即为刚刚挂载的设备啰!'
' 基本上,卸载后面接设备或挂载点都可以!不过最后一个 centos-root 由于有其他挂载, 因此,该项目一定要使用挂载点来卸载才行!'
[root@study ~]$ umount /dev/vda4 '<==用设备文件名来卸载'
[root@study ~]$ umount /data/ext4 '<==用挂载点来卸载'
[root@study ~]$ umount /data/cdrom '<==因为挂载点比较好记忆!'
[root@study ~]$ umount /data/usb
[root@study ~]$ umount /data/var '<==一定要用挂载点!因为设备有被其他方式挂载'
由于通通卸载了,此时你才可以退出光盘片、软盘片、U盘等设备喔!如果你遇到这样的情况:
[root@study ~]# mount /dev/sr0 /data/cdrom
[root@study ~]# cd /data/cdrom
[root@study cdrom]$ umount /data/cdrom 'unmount,提示忙'
umount: /data/cdrom: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[root@study cdrom]$ cd / '退出当前目录后,才可以成功执行'
[root@study /]# umount /data/cdrom
由于你目前正在 /data/cdrom/ 的目录内,也就是说其实“你正在使用该文件系统”的意思!所以自然无法卸载这个设备!那该如何是好?就“离开该文件系统的挂载点”即可。以上述的案例来说, 你可以使用“ cd / ”回到根目录,就能够卸载 /data/cdrom 啰!简单吧!