Linux存储的基本管理
前期准备
本章主要是关于Linux系统下硬盘设备的分区/挂载/格式化以及部分高级设置的.
为了后文实验,需要进行以下前期准备.
- 准备一台相对清洁的虚拟机
- 为虚拟机添加一块全新的虚拟硬盘,本文中设置为5G.
- 确保
mnt
目录下的文件已经备份或删除,避免数据损失.
Linux下的设备识别与查看
在一块设备被添加到系统中后,会在系统中记录并反映出来.
不同类型的设备所显示的类型也是不同的,方便区分.
##设备查看相关命令
fdisk -l ##查看真实设备情况
lsblk ##设备使用情况
blkid ##设备管理方式及设备ID
df ##查看正在被系统挂载的设备
cat /proc/partitions ##查看系统识别设备
通过上述命令的解释我们不免能发现部分描述上的不同.
当一块设备被添加到系统后,被视作以文件形式存在.
如果设备本身没有问题那么它就会被系统所识别,但识别不代表挂载.
只有被挂载到到系统中的设备可以被df
查看.
同理,只有挂载并正确安装了文件系统的设备才能在blkid
中显示出来.
值得一提的是,但使用df
时能看到的挂载设备占用空间等数据的数字巨大是因为其使用的单位.
为了方便用户感知可以通过添加参数的方式来改变显示方式.
但默认是没有单位的
df -h ##以1MB=1024KB的进制方式以MB显示数据大小
df -H ##以1MB=1000KB的进制方式以MB显示数据大小
不同类型的设备在显示中的名称也很好识别.
/dev/sda /dev/sdb ##SATA/SAS/USB设备在系统中的显示情况
##s表示SATA, d表示DISK, a/b表示第几个设备
/dev/hd0 /dev/hd1 ##IDE设备在系统中的表示方式
/dev/vda /dev/vdb ##VIRTIO-BLOCK设备
/dev/nvme0 ##M2的SSD在系统中的显示方式
/dev/mmcblk0 ##SD/MC/EMMC格式设备的显示方式
/dev/cdrom /dev/sr0 ##光驱
设备挂载
当设备被添加到系统后,会被系统所识别.
但仅仅是被识别并不能被系统所使用,必须将设备挂载到系统后才能正常进行交互.
设备的挂载使用mount
命令,卸载使用umount
命令.
##简单用法
mount 设备 挂载点 ##将指定设备挂载到指定挂载点
umount 设备/挂载点 ##卸载指定设备
##携带参数的用法
mount -o 参数 设备 挂载点 ##将指定设备以附加参数的方式挂载到指定挂载点
mount -o rw /dev/sdb1 /mnt ##将sdb1以可读写的方式挂载到mnt目录下
mount -o ro /dev/sdb1 /mnt ##将sdb1以只读方式挂载到mnt目录下
mount -o remount,ro /mnt ##将mnt目录下的设备重新以只读的方式挂载
mount ##不加任何参数时会列出所有被挂载的设备信息
当卸载设备时,需要设备本身不被占用.
如果对正在被占用的设备使用umount
命令,则会提示设备正忙.
可以通过fuser
命令查看占用程序并关闭.
fuser -vm 挂载设备/挂载点 ##查看挂载设备的占用情况
fuser -kvm 挂载设备/挂载点 ##批量结束占用设备的进程
##参数含义
-k ##结束进程
-v ##显示详细信息
-m ##显示进程
mount
命令的挂载本质上是临时挂载.当重启系统或重新登陆系统后会发现先前的挂载消失了.
如果需要对设备进行永久挂载,则需要修改挂载策略文件.
vim /etc/fstab
/dev/sdb1 /mnt iso9660 defaults 0 0
上面为在挂载策略文件中添加的内容,依次表达的意思是:
- 挂载设备
- 挂载点
- 文件系统类型
- 挂载参数
- 是否备份
- 是否检测
值得一提的是如果你在fstab
中对于永久挂载策略的编写出现了问题,那么开机时就会卡死在设备挂载上.需要手动进入shell
模式对该文件重新进行编辑和修改才能正常启动系统.
在写入新的策略到文件中后,并不会立刻生效,可以通过重启系统或命令刷新的方式来使之生效.
mount -a ##重新读取fstab文件,使新的策略生效
设备分区与文件系统
一块新的设备被系统识别后需要挂载到系统中才能被使用.
但实际上因为硬盘中没有分区也没有文件系统,这块新的硬盘依旧无法被系统有效使用.
分区方式
目前常见的分区方式有两种:Legacy
和UEFI
,对应MSR
和GPT
两种分区.
分区方式 | 位数 | 分区表大小 | 支持分区个数 | 单个分区大小 |
---|---|---|---|---|
Legary | MBR(32位) | 64byte | 主分区最多4个,所有分区16个 | 2.25TB |
UEFI | GPT(84位) | 128byte | 理论上没有分区个数限制,Windows下128个 | 8ZiB |
GPT分区的主分区表记录EFI分区的信息,EFI分区记录其他分区的信息.
可以看到GPT分区的各项数值都是显著优于MBR的,也有其分区引导上的优势.
因此目前新的设备通常都采用GPT分区方式,MBR用于兼容老设备和老系统.
主分区和逻辑分区:
被主分区表记录分区信息并可以直接使用的分区叫做主分区.
由于主分区只能存在4个,被主分区表记录,用来包容逻辑分区的容器叫做扩展分区.
扩展分区是用来包容逻辑分区的,本身并不可以直接使用.
扩展分区之上划分的分区叫做逻辑分区.
分区方法
分区操作只能由超级用户进行.
交互式分区方法
交互式的分区方法采用fdisk
命令对指定设备进行分区和文件系统设置.
fdisk /dev/sdb ##对sdb进行分区,回车后进入分区模式,依次进行选择.
对于fdisk
中指令的归类:
m ##获得分区帮助
l ##列出所有分区类型
d ##删除分区
n ##创建新分区
p ##显示分区表
t ##更改分区类型
w ##保存更改
q ##退出,如果不加以保存直接退出则所有的操作都会无效
g ##设定分区方式为GPT
o ##设定分区方式为MBR
s ##设定分区方式为SUN
同样,因为默认以MSR方式进行分区,所以主分区最多有4个.
当已经存在4个主分区时再次分区会出现满载提示.
需要注意的是,划分扩展分区时一定要把所有的剩余容量都划分给扩展分区,因为逻辑分区只能使用扩展分区包容的空间.如果出现未划分区域则无法使用而造成浪费.
当删除分区时,被删除的分区一定需要未被系统占用,否则可能造成系统崩溃.
udevadm settle ##同步分区表到系统
值得一提的是,在你d
删除了分区之后,使用fdisk -l
可以看到分区标示依旧存在.
如果需要删除,需要进行以下操作.
dd if=/dev/zero of =/dev/sdb bs=1M count=1
把硬盘最前面1M数据清理掉,分区表就被清理了.
非交互式分区方法
parted /dev/sdb mklabel msdos ##在sdb设备上创建MBR分区表
parted /dev/sdb mkpart primary 1 100 ##在sdb设备上划分主分区,从数据块1划分到100
parted /dev/sdb rm 2 ##删除sdb设备上的主分区2
同理可以用这种方式创建GPT
分区表或创建逻辑分区.
设置文件系统
在你对硬盘分区完成后进行挂载时,你大概率会遇到这种情况.
这是因为划分好的设备并没有设置文件系统.
常用文件系统
文件系统 | FAT16 | FAT32 | NTFS | EXT3 | EXT4 | EXT5 |
---|---|---|---|---|---|---|
最大卷 | 2GB | 4GB | 256TB | 32TB | 1EB | 16EB |
最大单个文件 | 4GB | 8TB | 16TB | 2TB | 16TB | 8EB |
最大文件个数 | 65536 | 4177920 | 4294967295 | 32000个子目录 | 理论无限制 | 理论无限制 |
代表系统 | DOS Win95 | Win98 | Win2000后 | REHL5 | REHL6 | REHL7+ |
##直接挂载,提示文件系统错误.
[root@Node1 Desktop]# mount /dev/sdb1 /mnt/
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error.
##将sdb1文件格式覆盖设置为xfs
[root@Node1 Desktop]# mkfs.xfs /dev/sdb1 -f
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1368, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
##再次挂载,挂载成功
[root@Node1 Desktop]# mount /dev/sdb1 /mnt/
[root@Node1 Desktop]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 1893152 0 1893152 0% /dev
tmpfs 1921028 0 1921028 0% /dev/shm
tmpfs 1921028 10160 1910868 1% /run
tmpfs 1921028 0 1921028 0% /sys/fs/cgroup
/dev/sda3 82284284 6480608 75803676 8% /
/dev/sda1 1038336 231004 807332 23% /boot
tmpfs 384204 1168 383036 1% /run/user/42
tmpfs 384204 20 384184 1% /run/user/0
/dev/sr0 8238560 8238560 0 100% /run/media/root/RHEL-8-2-0-BaseOS-x86_64
/dev/sdb1 506528 29388 477140 6% /mnt
磁盘配额的设置
与其他功能一样,超级用户也可以限制其他用户对磁盘的写入.
通过对用户磁盘配额的限制,超级用户可以限制普通用户写入磁盘中文件的总体大小或总体数量.
mount /dev/sdb1 /mnt -o usrquota ##将sdb1挂载到mnt目录下,并激活配额参数
quotaon -uv /dev/sdb1 ##激活配额
edquota -u NeuWings ##设置NeuWings用户的配额
/dev/sdb1 0 0 51200 1 0 0
##配置文件添加实例
上面的配置文件添加实例中每一段的依次含义为:
- 适用配额的设备
- 用户已经创建数据的大小
- 数据大小软限制
- 数据大小硬限制
- 用户已经创建文件的个数
- 用户创建文件个数的软限制
- 用户创建文件个数的硬限制
软限制和硬限制
硬限制:是指对资源节点和数据块的绝对限制,在任何情况下都不允许用户超过这个限制。
软限制:用户设定的限制值,范围在硬限制范围内,在宽限时间内资源使用可以超过软限制值但不可以超过硬限制。
永久开启配额
和挂载相同,上述的配额编辑方法也是临时的,只要设备被卸载或者重新挂载就会失效.
如果要永久开启配额设置,需要在fstab
中对参数进行编辑,附加userquota
参数.
取消配额限制
quotaoff -uv /dev/sdb1 ##关闭sdb1的配额限制
vim /etc/fstab ##或者直接编辑挂载文件中的参数
但实际上,对于没有在fstab中写入参数的临时挂载而言,只要卸载设备后重新挂载,配额参数自然就会消失.
没什么用的mount查看记录
[root@Node1 Desktop]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=1893152k,nr_inodes=473288,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime,seclabel)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/sda3 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=36,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=23940)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel,pagesize=2M)
debugfs on /sys/kernel/debug type debugfs (rw,relatime,seclabel)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/42 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=384204k,mode=700,uid=42,gid=42)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=384204k,mode=700)
gvfsd-fuse on /run/user/0/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
/dev/sr0 on /run/media/root/RHEL-8-2-0-BaseOS-x86_64 type iso9660 (ro,nosuid,nodev,relatime,nojoliet,check=s,map=n,blocksize=2048,uid=0,gid=0,dmode=500,fmode=400,uhelper=udisks2)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)