八、磁盘管理
八、磁盘管理
8.1 机械与固态知识
8.2 RAID知识
8.2.1 RAID概述
磁盘冗余阵列RAID,物理服务器的硬盘通过RAID卡进行配置,然后才能使用。
8.2.2 RAID优势
- 可以获取更高容量
- 可以获取更高性能(读写速度 io(input写/output读)速度
- 可以获取更高冗余(安全性)
8.2.3 RAID级别
常见的raid级别:raid 0 ,raid 1,raid 5,raid 10
需要几块盘 | 安全冗余 | 可用容量 | 性能 | 应用场景 | |
---|---|---|---|---|---|
RAID 0 | 1 | 最低 | 所有硬盘总和 | 读写最快 | 不要求安全,只要求速度(数据库从库、存储从库、web服务器) |
RAID 1 | 只能有2块 | 100% | 所有硬盘总和/2 | 写入速度慢,读取OK | 系统盘、监控服务器 |
RAID 5 | 3 | 最多坏一块盘 | 损失一块盘的容量 | 写入性能不好,读取OK | 普遍数据库,存储等访问量不高的 |
RAID 10 | 4 | 可以损坏一半 | 所有硬盘总和/2 | 读取很快 | 高并发或高访问的数据库从库、存储等 |
8.3 MBR与GPT
早期的 Linux 系统为了兼容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区。
这个扇区通常是 512bytes 的大小,所以说第一个扇区 512bytes 会有这两个数据:
- 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
- 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes
由于分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。 若将硬盘以长条形来看,然后将磁柱以柱形图来看,那么那 64 bytes 的记录区段有点像底下的图示:
由于分区表就只有 64 bytes 而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或延伸(Extended)分区槽。
如何分出四个以上分区?利用延伸分区(Extended)的方式来处理,既然第一个扇区所在的分区表只能记录四笔数据, 那我可利用额外的扇区来记录更多的分区信息。实际上图示有点像底下这样:
主分区、扩展分区、逻辑分区(GPT随便用分区)
主分区: 最多有4个,每个占用16字节分区表空间。
扩展(延伸)分区:
- 主要用来解决主分区最多4个。
- 主分区无法直接存放数据与使用。
- 如果要使用需要在扩展分区中创建逻辑分区。
- 扩展分区在一个磁盘中只有1个。
逻辑分区:
- 需要先创建扩展分区。
- 使用逻辑分区存放数据。
MBR vs GPT
MBR
- MBR主引导记录,磁盘分区格式。
- 磁盘大小不能大于2tb,如果大于2tb则无法使用。
GPT
- GPT分区表格式,解决分区数量问题。
- 解决系统支持大硬盘的问题。
- 主分区随便用,不用区分主分区,扩展分区,逻辑分区。
8.4 分区命名规则
#Linux系统磁盘名字的命名规则
##物理服务器...
sata/sas/pci-e/ 接口的硬盘
/dev/sd?开头
##云服务器
/dev/vd? 开头
##第1块硬盘
/dev/sda
##第2块硬盘
/dev/sdb
#Linux系统磁盘分区名字的命名规则
#主分区或扩展分区 1-4
/dev/sda1-4
#逻辑分区从5开始
/dev/sda5
#第3块sata硬盘的第1个主分区
/dev/sdc1
#第4块sas硬盘的第2个逻辑分区
/dev/sdd6
8.5 磁盘分区实战
8.5.1 添加并识别硬盘
先查看现在系统的硬盘信息
在vmware上给虚拟机添加一块10G的硬盘,这个操作模拟在物理服务器热插拔进一块硬盘,此时再查看硬盘信息,还是没有新的硬盘信息加入。在生产环境中,磁盘空间不足时需新加磁盘,一般来说,新加磁盘后需要重启系统才能识别加载,但是生产环境不能随便重启,所以需要一种方法能够不重启系统也可以加载识别新磁盘。那就是通过加载总线扫描方法。
查看总线并进行重新扫描SCSI总线
重新查看硬盘信息,已成功添加
8.5.2 磁盘相关工具和命令
8.5.2.1 lsblk 列出所有磁盘列表
由于目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样!当然可以使用parted 这个通通有支持的工具来处理,不过,还是比较习惯使用 fdisk 或者是 gdisk 来处理分区!因此,我们自然就得要去找一下目前系统有的磁盘有哪些?这些磁盘是 MBR 还是 GPT 等等的!
lsblk命令的选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
示例
[root@localhost ~]# lsblk -d #仅列出磁盘本身,并不会列出该磁盘的分区数据
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
sdb 8:16 0 10G 0 disk
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# lsblk -f #同时列出该磁盘内的文件系统名称
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs f04bb86f-4d3b-4480-8d55-26a02737fdfd /boot
└─sda2 LVM2_member iYfH5U-yJ7e-zRTs-Qawv-cHNA-BMK1-DfNfZE
├─centos-root xfs 7f59fa7d-0250-4596-98be-452bff4c9ab7 /
├─centos-swap swap 4de69bc7-e53a-4286-910d-a61f4f34f71d [SWAP]
└─centos-home xfs 2c738e1d-1165-4e81-ab4a-06d0396e8173 /home
sdb
└─sdb1 ext4 97c969a2-0f20-4933-88fb-723bea58bdbb /root/test
sr0
[root@localhost ~]# lsblk -m #同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
NAME SIZE OWNER GROUP MODE
sda 200G root disk brw-rw----
├─sda1 1G root disk brw-rw----
└─sda2 199G root disk brw-rw----
├─centos-root 50G root disk brw-rw----
├─centos-swap 7.9G root disk brw-rw----
└─centos-home 141.1G root disk brw-rw----
sdb 10G root disk brw-rw----
└─sdb1 1G root disk brw-rw----
sr0 1024M root cdrom brw-rw----
[root@localhost ~]# lsblk -p #列出该装置的完整文件名!而不是仅列出最后的名字而已。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 200G 0 disk
├─/dev/sda1 8:1 0 1G 0 part /boot
└─/dev/sda2 8:2 0 199G 0 part
├─/dev/mapper/centos-root 253:0 0 50G 0 lvm /
├─/dev/mapper/centos-swap 253:1 0 7.9G 0 lvm [SWAP]
└─/dev/mapper/centos-home 253:2 0 141.1G 0 lvm /home
/dev/sdb 8:16 0 10G 0 disk
└─/dev/sdb1 8:17 0 1G 0 part /root/test
/dev/sr0 11:0 1 1024M 0 rom
[root@localhost ~]# lsblk -t #列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
sda 0 512 0 512 512 1 deadline 128 4096 32M
├─sda1 0 512 0 512 512 1 deadline 128 4096 32M
└─sda2 0 512 0 512 512 1 deadline 128 4096 32M
├─centos-root 0 512 0 512 512 1 128 4096 32M
├─centos-swap 0 512 0 512 512 1 128 4096 32M
└─centos-home 0 512 0 512 512 1 128 4096 32M
sdb 0 512 0 512 512 1 deadline 128 4096 0B
└─sdb1 0 512 0 512 512 1 deadline 128 4096 0B
sr0 0 512 0 512 512 1 deadline 128 128 0B
8.6.2.2 blkid 列出UUID、文件系统等参数
8.6.2.3 parted 列出磁盘信息
parted 不仅可以列出磁盘的分区表类型与分区信息,还可以对磁盘进行分区操作。
8.5.2.4 磁盘分区工具
fdisk用法
fdisk的命令行用法为: fdisk 硬盘设备名
进入fdisk后,首先键入'm',即可显示fdisk全部菜单。
再键入'p',显示当前分区表状态。
键入'n',增加一个分区,然后会提示你选择分区类型(基本分区或扩展分区),再选择分区号(1-4)。
注:每块硬盘最多可划分四个主分区(包括基本分区和扩展分区),其中:基本分区最多可划分四个,扩展分区最多可划分一个,但扩展分区内可再划分多个逻辑分区。
选中你要建立的分区类型和分区号后,会提示输入起始柱面,从1开始;然后再输入终止柱面,此时可输入实际的柱面数,也可用"+分区尺寸"的方式输入,如:+1024M表示在起始柱面后加上1024M,或者用G,会自动计算。
主分区的设备名依次为:/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4
逻辑分区的设备名依次为:/dev/hda5,/dev/hda6,/dev/hda7...等等。
键入’d‘,删除分区,输入分区号即可删除。注意,删除扩展分区时,将会同时删除所有的逻辑分区。
键入’t‘,改变分区标志(这是Linux的fdisk最精华的部份!),新建的分区默认标志是83(Linux Ext2),你可以把它改为82(Linux 交换区)、或是'b'(FAT32)、'f'(FAT32 Extend,只限于扩展分区)、'86'(NTFS)...等几十种类型。这样一来,使用多操作系统的朋友们就可以用Linux的fdisk划分出你想要的所有分区了!
键入'a',切换分区激活开关。请注意:每键入一次,被选的分区就会在激活与非激活间变化一次,但你必须保证最后只有一个分区被激活。这时就用得到'p'命令了,被激活的分区上会有个'*'号。
除以上的几个命令外,还有其它几个,但不太常用。
最后,键入’w',你对分区所做的改变被写入硬盘;键入'q',则放弃所有的修改。
灵活应用fdisk,还可以修复一些损坏的分区表,前提是你必须准确记住原有每个分区的起始柱面和终止柱面。
gdisk用法与fdisk相似,暂不单独列出,请看8.5.4 gdisk创建分区案例。
8.5.3 fdisk 创建分区
在/dev/sdb中创建1个G的磁盘分区
[root@localhost ~]# fdisk /dev/sdb #对/dev/sdb进行分区
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
#更改将只保留在内存中,直到您决定编写它们。
Be careful before using the write command.
#在使用w(write)命令之前要小心。
#fdisk 磁盘分区指令详解
p (print) 显示当前磁盘分区信息.
n (new) 创建磁盘分区.
d (delete) 删除分区.
q (quit) 退出不保存.
w (write) 保存并退出. 让磁盘分区生效.
Command (m for help): n #创建分区
Partition type: #请选择分区类型
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #创建主分区(或者回车,默认主分区)
Partition number (1-4, default 1): #指定分区号后回车
First sector (2048-20971519, default 2048): #起始扇区位置
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +1G #结束扇区位置(使用方法 +size{K,M,G},会自动计算)
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): p #查看分区信息
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eef554a
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
Command (m for help): w #保存并生效 分区表
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# ll /dev/sdb1
brw-rw---- 1 root disk 8, 17 Jan 5 03:16 /dev/sdb1
8.5.4 gdisk 创建分区
对刚从添加的磁盘清除分区信息,然后进行gdisk /dev/sdb,下面信息就显示我们刚从的硬盘是有过MBR记录的,如果新磁盘用gdisk进行分区过后再删除分区保存分区表信息,重新进入gdisk也会识别出是GPT记录。
[root@localhost ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
#发现无效的GPT和有效的MBR;将MBR转换为GPT格式
#在内存中。此操作具有潜在的破坏性!退出时间:
#如果不想转换MBR分区,请键入“q”
#转换为GPT格式!
***************************************************************
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
Command (? for help): n #增加一个分区
Partition number (1-128, default 1): #默认回车
First sector (34-20971486, default = 2048) or {+-}size{KMGTP}: #默认回车
Last sector (2048-20971486, default = 20971486) or {+-}size{KMGTP}: +1G #配置大小
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): #使用默认值即可,除非要设置其他文件系统类型,可以提前“L”查看,然后在此输入类型
Changed type of partition to 'Linux filesystem'
Command (? for help): p
Disk /dev/sdb: 20971520 sectors, 10.0 GiB #磁盘文件名、扇区数与总容量
Logical sector size: 512 bytes #单一扇区大小为 512 bytes
Disk identifier (GUID): 06CB467D-9595-44CD-8CAF-80A881A444F9 #磁盘的 GPT 标识符
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 18874301 sectors (9.0 GiB) #还剩余多少扇区数与总容量
#分区编号 开始扇区号码 结束扇区号码 容量大小
Number Start (sector) End (sector) Size Code Name #底下为完整的分区信息了!
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
Command (? for help): w #储存分区操作后离开gdisk
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
#最终检查完成。即将写入GPT数据。这将覆盖现有的分区!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 1075MB 1074MB ext4 Linux filesystem
如果分区完遇到以下情况,一般为此硬盘已分区过,并进行了格式化以及挂载,处于正在使用状态。
并没有发现sdb2,因为核心还没有更新。 Linux 此时还在使用这颗磁盘,为了担心系统出问题,所以分区表并没有被更新!这个时候我们有两个方式可以来处理! 其中一个是重新启动,另外一个则是透过 partprobe 这个命令来处理即可!
partprobe 更新 Linux 核心的分区表信息
cat /proc/partitions #核心的分区纪录
partprobe -s #更新Linux核心的分区表信息
lsblk /dev/sdb #实际的磁盘分区状态
8.5.5 mkfs 格式化分区
分区完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,mkfs.xfs、mkfs.ext4等等。
[root@localhost ~]# mkfs.ext4 /dev/sdb1 #格式化为ext4文件系统
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label= #显示Label name
OS type: Linux
Block size=4096 (log=2) #每一个 block 的大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks #总计 inode/block 的数量
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# blkid /dev/sdb1 #确定建置好ext4文件系统了!
/dev/sdb1: UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="bc1eb810-ca92-4c9a-884b-6b23e095c755"
8.5.6 mount 文件系统挂载
挂载点是目录, 而这个目录是进入磁盘分区(文件系统)的入口就是了。不过要进行挂载前,先确定要被挂载的磁盘无被挂载,要挂载到的目录此时没有挂载其他磁盘,理论上要作为挂载点的目录应该是空目录才是。
举个例子来说,假设你的 /home 原本与根目录 (/) 在同一个文件系统中,底下原本就有 /home/test 与/home/vbird 两个目录。然后你想要加入新的磁盘,并且直接挂载 /home底下,那么当你挂载上新的分区时,则 /home 目录显示的是新分区内的内容,至于原先的 test 与vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分区被卸除挂载之后,则 /home 原本的内容就会再次的跑出来啦!
mount选项与参数:
-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
-t :可以加上文件系统种类来指定欲挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,reiserfs, vfat, iso9660(光盘格式), nfs, cifs, smbfs (后三种为网络文件系统类型)
-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选项。
-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的内存机制,请参考文件系统运作方式。预设为 async。
atime,noatime: 是否修订文件的读取时间(atime)。为了效能,某些时刻可使用 noatime
ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw)
auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)
dev, nodev: 是否允许此 filesystem 上,可建立装置文件? dev 为可允许
suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?
exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?
user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说,
mount 仅有 root 可以进行,但下达 user 参数,则可让一般 user 也能够对此 partition 进行 mount 。 defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async
示例
1.直接mount挂载
[root@localhost ~]# mount /dev/sdb1 /root/test/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 21M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 5.0G 46G 10% /
/dev/mapper/centos-home 142G 33M 142G 1% /home
/dev/sda1 1014M 185M 830M 19% /boot
tmpfs 781M 36K 781M 1% /run/user/0
/dev/sdb1 976M 2.6M 907M 1% /root/test
2.使用UUID进行mount挂载
找出 /dev/sdb1 的 UUID 后,用该 UUID 来挂载文件系统到 /root/test内
[root@localhost ~]# umount /dev/sdb1 #卸载刚从的挂载
[root@localhost ~]# blkid #查看磁盘的UUID信息
/dev/sda1: UUID="f04bb86f-4d3b-4480-8d55-26a02737fdfd" TYPE="xfs"
/dev/sda2: UUID="iYfH5U-yJ7e-zRTs-Qawv-cHNA-BMK1-DfNfZE" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="7f59fa7d-0250-4596-98be-452bff4c9ab7" TYPE="xfs"
/dev/mapper/centos-swap: UUID="4de69bc7-e53a-4286-910d-a61f4f34f71d" TYPE="swap"
/dev/mapper/centos-home: UUID="2c738e1d-1165-4e81-ab4a-06d0396e8173" TYPE="xfs"
/dev/sdb1: UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="bc1eb810-ca92-4c9a-884b-6b23e095c755"
[root@localhost ~]# mount UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" /root/test #使用UUID进行挂载
[root@localhost ~]# df -h #查看挂载情况
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 21M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 5.0G 46G 10% /
/dev/mapper/centos-home 142G 33M 142G 1% /home
/dev/sda1 1014M 185M 830M 19% /boot
tmpfs 781M 36K 781M 1% /run/user/0
/dev/sdb1 976M 2.6M 907M 1% /root/test #已成功挂载
umount 将文件系统卸载
选项与参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸除。
平常使用常规卸载即可
[root@localhost ~]# umount /dev/sdb1
8.5.7 开机自动挂载
8.6.7.1 修改 /etc/rc.local
/etc/rc.local里面存放的命令,脚本会在开机的时候自动运行,第1次使用需要给 /etc/rc.d/rc.local 加上执行权限。
chmod +x /etc/rc.d/rc.local
示例
[root@localhost ~]# mount /dev/sdb1 /root/test/
[root@localhost ~]# vim /etc/rc.local
[root@localhost ~]# cat /etc/rc.local
touch /var/lock/subsys/local
mount /dev/sdb1 /root/test
8.6.7.2 修改 /etc/fstab
直接到 /etc/fstab进行修改,实现开机自动挂载。以下是挂载的注意事项:
- 根目录 / 是必须挂载的,而且一定要先于其它挂载点被挂载进来。
- 其它挂载点必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
- 所有挂载点在同一时间之内,只能挂载一次。
- 所有磁盘分区(partition)在同一时间之内,只能挂载一次。
- 如若进行卸除,您必须先将工作目录移到挂载点(及其子目录)之外。
/etc/fstab文件详解
[root@localhost ~]# cat /etc/fstab
# 设备 挂载点 文件系统类型 文件系统参数 dump fsck
/dev/mapper/centos-root / xfs defaults 0 0
UUID=f04bb86f-4d3b-4480-8d55-26a02737fdfd /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
第一栏:设备文件名/UUID/LABEL name:
- 文件系统或磁盘的装置文件名,如 /dev/vda2 等
- 文件系统的 UUID 名称,如 UUID=xxx
- 文件系统的 LABEL 名称,例如 LABEL=xxx
第二栏:挂载点,一定是目录。
第三栏:磁盘分区的文件系统,在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等。
第四栏:文件系统参数,默认填写defaults即可,详情可查询相关资料。
第五栏:能否被 dump 备份指令作用,dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!
第六栏:是否以 fsck 检验扇区,早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整 (clean)。 不过
这个方式使用的主要是透过 fsck 去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。
额外注意
/etc/fstab 是开机时的配置文件,不过,实际文件系统的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动文件系统的挂载时,也会同时更动这两个文件!但是,万一发生你在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab ~那怎么办?没事,可以利用底下这一招:
[root@localhost ~]# mount -n -o remount,rw / #重新挂载改成读写
8.5.8 磁盘企业级分区方案
1.通用磁盘分区方案(不太重要的环境,没有用户数据)
运行不太重要的环境,没有用户数据。
/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。
swap 分区 内存不足的时候,swap空间临时充当内存使用。
- 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
- 内存大于8G swap 给8G 8-16G
在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap
/ 分区 根分区剩余多少给多少。
2.通用磁盘分区方案(有重要数据)
/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。
swap 分区 内存不足的时候,swap空间临时充当内存使用。
- 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
- 内存大于8G swap 给8G 8-16G
在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap
/ 分区 根分区 40-100G
/data 数据分区 重要数据放在/data 目录、分区中。
3.通用磁盘分区方案(不知道是否有重要数据)
/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。
swap 分区 内存不足的时候,swap空间临时充当内存使用。
- 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
- 内存大于8G swap 给8G 8-16G
在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap
/ 分区 根分区 40-100G
剩余空间暂不分配,未来谁使用谁分配。
8.5.9 磁盘故障案例(出现磁盘空间不足 no space left on device)
下面会常用到这两个命令,模拟、排查、解决。
dd if=/dev/zero of=/usr/local/big bs=1M count=5000 #模拟生成大文件,文件大小=bs*count
df -h 查看磁盘使用情况
df -i 查看inode使用情况
8.5.9.1 因为大文件(block不足)
先查看现有的磁盘使用情况
1.模拟创建大文件
创建一个5G的大文件存放在/root目录下
2.排查定位问题
目标:定位大文件在哪里,在哪个目录,是什么文件名字。首先先整体看一下是哪里磁盘看见不足(哪个分区),根据有问题的分区进行详细的一层一层排查,排查到具体目录或文件。
查看磁盘使用情况,相比前面的信息,根目录下的磁盘使用多了5G,也就是上面的模拟大文件存放在/root目录下多出来的。
根据有问题的分区一层一层排查,排查到具体目录或文件。已看到最大的空间使用在/root目录下
或者还可以使用以下命令进行排查
3.解决问题
大致思路如下,一层一层查询大文件,最终找到大文件在/root下。
[root@localhost ~]# du -sh /* |grep G
du: cannot access ‘/proc/12348/task/12348/fd/3’: No such file or directory
du: cannot access ‘/proc/12348/task/12348/fdinfo/3’: No such file or directory
du: cannot access ‘/proc/12348/fd/3’: No such file or directory
du: cannot access ‘/proc/12348/fdinfo/3’: No such file or directory
4.9G /root
3.6G /usr
1.3G /var
[root@localhost ~]# du -sh /root/* | sort -hr
4.9G /root/big
40K /root/test
4.0K /root/initial-setup-ks.cfg
4.0K /root/anaconda-ks.cfg
0 /root/Videos
0 /root/Templates
0 /root/Public
0 /root/Pictures
0 /root/Music
0 /root/Downloads
0 /root/Documents
0 /root/Desktop
确认文件是否重要,确认是否可以删除。删除后再查看磁盘使用情况。
8.5.9.2 大量小文件(inode不足)
1.模拟
创建小的磁盘分区并格式化。
挂载到/inode目录,查看磁盘inode使用情况。
然后创建大量小文件进行占用inode,模拟inode耗尽,查看磁盘inode使用情况,已经被占满。而且从246开始就创建不了,那是因为这个小磁盘可用的就245个inode,所以从246就创建不了(可用inode情况看上图)
2.排查定位问题
默认出现问题的时候,都是提示空间不足,所以一开始都是查磁盘是否还有空间,但创建文件仍然提示磁盘空间不足,就要查磁盘的inode使用情况。
3.解决问题
排查出小文件处在什么目录下,然后确认是否可以删除。可删除后,再测试是否可以进行写入。
如何寻找小文件多的目录
1.目录中文件越多,目录本身大小越大。
[root@localhost test]# ll -hd /root/test/ #查看目录大小情况
drwxr-xr-x 4 root root 1.5M Jan 6 22:38 /root/test/
[root@localhost test]# ls /root/test/ | wc -l #统计目录下有多少文件
65521
2.找出系统中大量小文件的目录
思路:显示系统中所有文件, 取出路径部分(目录),然后uniq 统计次数。
#找出/etc下所有文件的路径,交由给xargs转换成命令行参数。然后通过uniq -c统计/etc下各目录有多少文件。再通过sort -rn进行降序排序,最后head -5输出前五个文件多的目录
find /etc -type f | xargs dirname | uniq -c | sort -rn | head -5
8.5.9.3 文件没有被彻底删除
1.了解文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
- i_count的意义是当前文件使用者(或被调用)的数量
- i_nlink 的意义是介质连接的数量(硬链接的数量)
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名(目录block中数据)到文件本身的inode的链接删除了,此时,并没有删除文件的实体即(文件的block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。
2.故障模拟
#模拟创建大文件
seq 50000000 >>/var/log/big.log
#模拟占用
tail -f /var/log/big.log
模拟大文件的前后磁盘使用对比
新开一个远程连接来模拟程序占用,同时开始排查大文件
du -sh /* |sort -hr
du -sh /var/* |sort -hr
du -sh /var/log/* |sort -hr
最终排查到大文件并删除
但再次查看磁盘使用情况,还是占用这么多。
继续排查,顶多加起来就5G,此时就要怀疑可能是文件没有被彻底删除,这种情况大多出现在被进程或者服务嗦占用了。
3.问题解决
结束或重启对应的进程/服务,现在进行占用排查。
lsof |grep delete #lsof 显示系统中所有被打开的文件,delete表示文件没有入口,但进程调用数不为0。
由于我们是模拟占用,直接kill对应进程即可,再次查看磁盘空间使用情况,已经恢复正常。