文件系统管理
将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为称之为挂载;解除此关联关系的过程称之为卸载。
把设备关联挂载点:mount;卸载时,可使用设备或过载点:umount
注:挂载点下原有文件在过载完成后会被临时隐藏
挂载方法:mount DEVICE MOUNT_POINT
mount:通过查看 /etc/mtab 文件显示当前系统已挂载的所有设备
mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要挂载的设备
(1)设备文件:
(2)卷标:
(3)UUID,-U ‘UUID’:
(4)伪文件系统名称:
dir:挂载点
事先存在,建议使用空目录;进程正在使用中的设备无法被卸载
常用命令选项:
-t vsftype:指定要挂载的设备上的文件系统类型
-r:只读挂载
-w:读写挂载
-n:不更新 /etc/mtab
-a:自动挂载所有支持自动挂载的设备(定义在 /etc/fstab 文件中,挂载选项中有 “自动挂载” 功能)
-L ’LABEL‘:以卷标指定挂载设备
-U ‘UUID’:以 UUID 指定要挂载的设备
-B --bind:绑定目录到另一个目录上
注:查看内核追踪到的已挂载的所有设备:cat /proc/mounts
-o options:(挂载文件系统的选项)
async:异步模式
sync:同步模式
atime/noatime:每一次访问这个文件都会更新这个时间戳(包含目录和文件)
diratime/nodiratime:目录的访问时间戳
auto/noauto:是否支持自动挂载
exec/noexec:是否支持将文件系统上应用程序运行为进程
dev/nodev:是否支持此文件系统上使用设备文件
suid/nosuid:
remount:重新挂载
ro:
rw:
user/nouser:是否允许普通用户挂载此设备
acl:启用此文件系统上的 acl 功能
注:上述选项可多个同时使用,彼此使用逗号分隔;
默认挂载选项:rw, suid, dev, exec, auto, nouser, and async
卸载命令:
# umount DEVICE
# umount MOUNT_POINT
查看正在访问指定文件系统的进程:# fuser -v MOUNT_POINT
终止所有正在访问指定的文件系统进程:# fuser -km MOUNT_POINT
挂载交换分区:
启用:swapon
swapon [OPTION]… [DEVICE]
-a:激活所有的交换分区
-p PRIORITY:指定优先级
禁用:swapoff [OPTION]… [DEVICE]
内存空间使用状态:
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间占用等信息的查看工具:
df:
-h: human-readable
-i: inodes instead of blocks
-P: 以Posix兼容的格式输出;
查看某目录总体空间占用状态:
du:
du [OPTION]… DIR
-h: human-readable
-s: summary
文件挂载的配置文件:/etc/fstab,系统初始化的脚本会读取此文件,并尝试使用 mount 命令分析其中的每一行,每一行用来定义一个要挂载的文件系统
注:swap 的挂载点就叫 swap,无专门挂载的目录,而且 swap 设备是用 swapon 命令激活,而不是用 mount 命令挂载
[root@localhost ~]# cat /etc/fstab
# 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项 转储频率 自检次序
#
# /etc/fstab
# Created by anaconda on Mon Aug 30 01:57:41 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=1f63fd17-4235-44d3-bb4e-bf002ace7f7c /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
要挂载的设备或伪文件系统:
设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
过载选项:defaults
转储频率:
0:不做备份
1:每天转储
2:每隔一天转储
自检次序:0,不自检;1,首先自检,一般只有 rootfs 采用 1
文件系统上其它概念:
超级块用来描述整个文件系统的大图景结构的组织形式,有多少块组、挂载选项等信息,也就是使用 tune2fs -l DEVICE 所能够看到的信息(超级块中的信息),若使用 dumpe2fs DEVICE,不仅能够显示自己文件系统的超级块信息,还能够显示每一个组的信息,这些组信息都是保存在这个组的叫组自己的描述块中。
Inode: Index Node,索引节点
地址指针:直接指针、间接指针、三级指针
inode bitmap:对位标识每个 inode 空闲与否的状态信息
链接文件:
硬链接:两个文件路径指向同一个 inode 编号
任何一个要访问的文件的路径的基名要求和 inode 在同一个分区下,所以硬链接不能够跨分区进行
不能够对目录进行,会造成循环引用
指向同一个inode的多个不同路径;创建文件的硬链接即为为inode创建新的引用路径,因此会增加其引用计数
符号链接:
可以对目录进行
可以跨分区
指向的是另一个文件的路径,其大小为指向的路径字符串的长度,不增加或减少目标文件 inode 的引用计数
ln [-sv] SRC DEST
-s: symbolic link
-v: verbose
练习:
1、创建一个 20G 的文件系统,块大小为2048,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项;
(1) 创建20G分区;
(2) 格式化:
mke2fs -t ext4 -b 2048 -L ‘TEST’ /dev/DEVICE
(3) 编辑/etc/fstab文件
LABEL=‘TEST’ /testing ext4 defaults,acl 0 0
2、创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3;
3、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备;
(2) 如磁盘数量为1,则显示其空间使用信息;
否则,则显示最后一个磁盘上的空间使用信息;
if [ $disks -eq 1 ]; then
fdisk -l /dev/[hs]da
else
fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o “^Disk /dev/[sh]d[a-]” | tail -1 | cut -d’ ’ -f2)
fi
bash脚本编程之用户交互:
read [option]… [name …]
-p ‘PROMPT’
-t TIMEOUT
bash -n /path/to/some_script
检测脚本中的语法错误
bash -x /path/to/some_script
调试执行
示例:
#!/bin/bash
# Description: read testing
read -p "Enter a disk special file: " diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if fdisk -l | grep "^Disk $diskfile" &> /dev/null; then
fdisk -l $diskfile
else
echo "Wrong disk special file."
exit 2
fi
RAID
提高IO能力:磁盘并行读写;
提高耐用性:磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同
RAID 实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力 (硬件方式)
内接式RAID:主板集成 RAID 控制器 (硬件方式)
SoftWare RAID (软件方式)
级别:
RAID-0:读写性能提升;可用空间:可用空间:N*min(S1,S2,…);无容错能力;最少磁盘数:2,2+
将多块硬盘平行组织起来当一块硬盘来实现 I/O 并行组织的磁盘组织结构。将数据条带化后分别存储在组织起来的多块硬盘中。
RAID-1:读性能提升、写性能略有下降;可用空间:1*min(S1,S2,…);有冗余能力;最少磁盘数:2, 2+
最少两块硬盘,数据在磁盘中各存取一份
RAID-4
将3块或3块以上的硬盘组织成 RAID,在存储数据时其中有一块盘用来存储校验码,其余两块存储数据。
单块盘专门用于校验盘,访问压力较大,容易成为性能瓶颈,但允许损坏一块盘以降级方式工作。
RAID-5:读写性能提升;可用空间:(N-1)*min(S1,S2,…);有容错能力:1块磁盘;最少磁盘数:3, 3+
采用循环做校验盘的机制
RAID-6:读写性能提升;可用空间:(N-2)*min(S1,S2,…);有容错能力:2块磁盘;最少磁盘数:4, 4+
用两块盘做校验盘,而且做循环校验
混合类型
RAID-10:读写性能提升;可用空间:N*min(S1,S2,…)/2;有容错能力:每组镜像最多只能坏一块;最少磁盘数:4, 4+
先两两一组做成 RAID-1,在将一堆 RAID-1 做成 RAID-0
RAID-01:
先将硬盘分成两组,每组做成 RAID-0;在将每组做成 RAID-1
RAID-50、RAID-7
JBOD:可用空间:sum(S1,S2,…)
功能:将多块磁盘的空间合并一个大的连续空间使用;
CentOS 6上的软件RAID的实现:
结合内核中的md(multi devices)
mdadm:模式化的工具
命令的语法格式:mdadm [mode] <raiddevice> [options] <component-devices>
支持的RAID级别:LINEAR, RAID-0, RAID-1, RAID-4, RAID-5, RAID-6, RAID-10;
模式:
创建:-C
装配: -A
监控: -F
管理:-f, -r, -a
<raiddevice>: /dev/md#
<component-devices>: 任意块设备
-C: 创建模式
-n #: 使用#个块设备来创建此RAID;
-l #:指明要创建的RAID的级别;
-a {yes|no}:自动创建目标RAID设备的设备文件;
-c CHUNK_SIZE: 指明块大小;
-x #: 指明空闲盘的个数;
例如:创建一个10G可用空间的RAID-5;
-D:显示raid的详细信息;
mdadm -D /dev/md#
管理模式:
-f: 标记指定磁盘为损坏;
-a: 添加磁盘
-r: 移除磁盘
观察md的状态:
cat /proc/mdstat
停止md设备:
mdadm -S /dev/md#
watch命令:
-n #: 刷新间隔,单位是秒;
watch -n# ‘COMMAND’
练习1:创建一个可用空间为10G的RAID1设备,要求其chunk大小为128k,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录;
练习2:创建一个可用空间为10G的RAID-10设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录;
LVM2
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块;
/dev/dm-#
/dev/mapper/VG_NAME-LV_NAME
/dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME
/dev/vol0/root
pv管理工具:
pvs:简要pv信息显示
pvdisplay:显示pv的详细信息
pvcreate /dev/DEVICE: 创建pv
vg管理工具:
vgs
vgdisplay
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]
先做 pvmove
vgremove
lv管理工具:
lvs
lvdisplay
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
lvremove /dev/VG_NAME/LV_NAME
扩展逻辑卷:
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME // 重置 LV 的大小,扩展时不需要重新挂载
缩减逻辑卷:
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount
快照:snapshot
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
练习1:创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录;
练习2: 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录;
练习3:扩展testlv至7G,要求archlinux用户的文件不能丢失;
练习4:收缩testlv至3G,要求archlinux用户的文件不能丢失;
练习5:对testlv创建快照,并尝试基于快照备份数据,验正快照的功能;
文件系统挂载使用:
挂载光盘设备:
光盘设备文件:
IDE: /dev/hdc
SATA: /dev/sr0
符号链接文件:
/dev/cdrom
/dev/cdrw
/dev/dvd
/dev/dvdrw
mount -r /dev/cdrom /media/cdrom
umount /dev/cdrom
dd命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小;
count=#:复制多少个bs;
磁盘拷贝:
dd if=/dev/sda of=/dev/sdb
备份MBR
dd if=/dev/sda of=c/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=256 count=1
两个特殊设备:
/dev/null: 数据黑洞;
/dev/zero:吐零机;
LVM简单步骤
1、创建分区并调整分区类型为8e
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): e // 直接创建扩展分区
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Partition 1 of type Extended and of size 5 GiB is set
Command (m for help): n
Partition type:
p primary (0 primary, 1 extended, 3 free)
l logical (numbered from 5)
Select (default p): l // 在扩展分区上创建逻辑分区5,6,7,8,9
Adding logical partition 6
First sector (1030144-10485759, default 1030144):
Using default value 1030144
Last sector, +sectors or +size{K,M,G} (1030144-10485759, default 10485759): +500M
Partition 6 of type Linux and of size 500 MiB is set
Command (m for help): t // 调整分区类型
Partition number (1,5-9, default 9): 5
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 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: 0x5372fd24
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10485759 5241856 5 Extended
/dev/sdb5 4096 1028095 512000 8e Linux LVM
/dev/sdb6 1030144 2054143 512000 8e Linux LVM
/dev/sdb7 2056192 3080191 512000 8e Linux LVM
/dev/sdb8 3082240 5179391 1048576 8e Linux LVM
/dev/sdb9 5181440 10485759 2652160 8e Linux LVM
Command (m for help): w // 保存退出
The partition table has been altered!
2、刷新分区
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 1K 0 part
├─sdb5 8:21 0 500M 0 part
├─sdb6 8:22 0 500M 0 part
├─sdb7 8:23 0 500M 0 part
├─sdb8 8:24 0 1G 0 part
└─sdb9 8:25 0 2.5G 0 part
3、创建 pv
[root@localhost ~]# pvcreate /dev/sdb{5,6,7}
Physical volume "/dev/sdb5" successfully created.
Physical volume "/dev/sdb6" successfully created.
Physical volume "/dev/sdb7" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb5 lvm2 --- 500.00m 500.00m
/dev/sdb6 lvm2 --- 500.00m 500.00m
/dev/sdb7 lvm2 --- 500.00m 500.00m
4、创建 VG
[root@localhost ~]# vgcreate myvg /dev/sdb{5,6}
Volume group "myvg" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
myvg 2 0 0 wz--n- 992.00m 992.00m
[root@localhost ~]# vgextend myvg /dev/sdb7 // 扩展vg
Volume group "myvg" successfully extended
5、创建 LV
[root@localhost ~]# lvcreate -L 400M -n mylv myvg // -L 大小 -n lv_name vg_name
Logical volume "mylv" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
mylv myvg -wi-a----- 400.00m
6、创建文件系统
[root@localhost ~]# mke2fs -t ext4 -b 1024 -L MYLV /dev/myvg/mylv
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYLV
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
102400 inodes, 409600 blocks
20480 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=34078720
50 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
7、挂载
[root@localhost ~]# mount /dev/myvg/mylv /mnt/mylv.mount/
[root@localhost mapper]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 1K 0 part
├─sdb5 8:21 0 500M 0 part
│ └─myvg-mylv 253:2 0 400M 0 lvm /mnt/mylv.mount
├─sdb6 8:22 0 500M 0 part
├─sdb7 8:23 0 500M 0 part
├─sdb8 8:24 0 1G 0 part
└─sdb9 8:25 0 2.5G 0 part