磁盘基本概述
磁盘分类
固态硬盘
机械磁盘
服务器磁盘
Linux中磁盘命名方式
Linux中磁盘的命名方式与磁盘的接口有关,规则如下:
- 传统IDE接口硬盘:
/dev/hd[a-z]
- SCISI接口硬盘:
/dev/sd[a-z]
- 虚拟化硬盘:
/dev/vd[a-z]
在设备名称的定义规则如下, 其他的分区可以以此类推
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第二块SCSI接口的硬盘名称为/dev/sdb
系统中分区由数字编号表示, 1-4留给主分区使用和扩展分区, 逻辑分区从5开始
/第一块磁盘
/dev/sda
//第一块磁盘的第一个分区
/dev/sda1
//第二块磁盘的第一个分区
/dev/sdb1
MBR与GPT
在使用新磁盘之前,你必须对其进行分区。MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式。这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择
MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动
特点:
- MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
- 只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区
GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准
特点:
- GPT对磁盘大小没有限制
- 最多可以创建128个分区
注意:
MBR与GPT之间互相转换会导致数据丢失
磁盘容量检查
df -i //查看inode使用情况
df -h //以G或者T或者M人性化方式显示
df -T //查看文件类型
df
[root@localhost ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 438504 422 438082 1% /dev
tmpfs 443517 1 443516 1% /dev/shm
tmpfs 443517 697 442820 1% /run
tmpfs 443517 17 443500 1% /sys/fs/cgroup
/dev/mapper/cs_192-root 33583104 46609 33536495 1% /
/dev/sr0 0 0 0 - /mnt/cdrom
/dev/sda1 524288 310 523978 1% /boot
/dev/mapper/cs_192-home 16396288 10 16396278 1% /home
tmpfs 443517 5 443512 1% /run/user/0
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs 1.7G 9.0M 1.7G 1% /run
tmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup
/dev/mapper/cs_192-root 65G 2.3G 62G 4% /
/dev/sr0 11G 11G 0 100% /mnt/cdrom
/dev/sda1 1014M 210M 805M 21% /boot
/dev/mapper/cs_192-home 32G 256M 32G 1% /home
tmpfs 347M 0 347M 0% /run/user/0
[root@localhost ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
devtmpfs devtmpfs 1754016 0 1754016 0% /dev
tmpfs tmpfs 1774068 0 1774068 0% /dev/shm
tmpfs tmpfs 1774068 9160 1764908 1% /run
tmpfs tmpfs 1774068 0 1774068 0% /sys/fs/cgroup
/dev/mapper/cs_192-root xfs 67133412 2312788 64820624 4% /
/dev/sr0 iso9660 10812242 10812242 0 100% /mnt/cdrom
/dev/sda1 xfs 1038336 214036 824300 21% /boot
/dev/mapper/cs_192-home xfs 32776564 261608 32514956 1% /home
tmpfs tmpfs 354812 0 354812 0% /run/user/0
[root@localhost ~]# df -Th
设备名称 磁盘文件类型 磁盘大小 已用大小 可用大小 使用百分比 挂载点
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs tmpfs 1.7G 9.0M 1.7G 1% /run
tmpfs tmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup
/dev/mapper/cs_192-root xfs 65G 2.3G 62G 4% /
/dev/sr0 iso9660 11G 11G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 210M 805M 21% /boot
/dev/mapper/cs_192-home xfs 32G 256M 32G 1% /home
tmpfs tmpfs 347M 0 347M 0% /run/user/0
lsblk
使用lsblk
查看分区情况:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
|-sda1 8:1 0 1G 0 part /boot
`-sda2 8:2 0 99G 0 part
|-cs_192-root 253:0 0 64.1G 0 lvm /
|-cs_192-swap 253:1 0 3.7G 0 lvm [SWAP]
`-cs_192-home 253:2 0 31.3G 0 lvm /home
sdb 8:16 0 20G 0 disk
`-sdb1 8:17 0 1G 0 part
sdc 8:32 0 20G 0 disk
sr0 11:0 1 10.3G 0 rom /mnt/cdrom
du
使用du
命令查看目录或者文件的容量,不加参数以k为单位:
du -sh (文件&&目录) //人性化输出显示大小
-s:列出总和
-h:人性化显示容量信息
[root@localhost ~]# du -sh anaconda-ks.cfg
4.0K anaconda-ks.cfg
[root@localhost ~]# du -sh /etc/
24M /etc/
磁盘分区
分区之前, 需要先给虚拟机添加一块磁盘,以便于我们做后续的实验vmware虚拟机,请按如下进行操作:
1.找到对应虚拟主机点击右键, 选择设置
2.在硬件向导里面点击添加按钮, 在硬件类型中选中“硬盘”, 点击下一步
3.磁盘类型选择默认, 然后创建新虚拟磁盘, 调整大小(不要勾选立即分配空间)
4.最后点击下一步, 完成即可
分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区
fdisk分区
//生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)
[root@localhost ~]# fdisk -l
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): m //输入m列出常用的命令
Command action
a toggle a bootable flag //切换分区启动标记
b edit bsd disklabel //编辑sdb磁盘标签
c toggle the dos compatibility flag //切换dos兼容模式
d delete a partition //删除分区
l list known partition types //显示分区类型
m print this menu //显示帮助菜单
n add a new partition //新建分区
o create a new empty DOS partition table //创建新的空白分区表
p print the partition table //显示分区表的信息
q quit without saving changes //不保存退出
s create a new empty Sun disklabel //创建新的Sun磁盘标签
t change a partition's system id //修改分区ID,可以通过l查看id
u change display/entry units //修改容量单位,磁柱或扇区
v verify the partition table //检验分区表
w write table to disk and exit //保存退出
x extra functionality (experts only) //拓展功能
命令用法
Command (m for help): n 创建分区
Partition type
p primary (0 primary, 0 extended, 4 free) 主分区
e extended (container for logical partitions) 扩展分区
Select (default p): p p,创建主分区
Partition number (1-4, default 1): //默认回车
First sector (2048-41943039, default 2048): //默认回车
Last sector,+sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):+500M 分配的大小
Created a new partition 1 of type 'Linux' and of size 500 MiB.
Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0xb33147fb
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 1026047 1024000 500M 83 Linux
Command (m for help): n 新建分区
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): e e,创建扩展分区
Partition number (2-4, default 2):
First sector (1026048-41943039, default 1026048):
Last sector, +sectors or +size{K,M,G,T,P} (1026048-41943039, default 41943039): +200M
Created a new partition 2 of type 'Extended' and of size 200 MiB.
Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0xb33147fb
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 1026047 1024000 500M 83 Linux
/dev/sdc2 1026048 1435647 409600 200M 5 Extended
Command (m for help): n 创建分区
Partition type
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l 创建逻辑分区
Adding logical partition 5 逻辑分区从5开始
First sector (1028096-1435647, default 1028096):
Last sector, +sectors or +size{K,M,G,T,P} (1028096-1435647, default 1435647): +50M
Created a new partition 5 of type 'Linux' and of size 50 MiB.
Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0xb33147fb
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 1026047 1024000 500M 83 Linux 主分区
/dev/sdc2 1026048 1435647 409600 200M 5 Extended 扩展分区
/dev/sdc5 1028096 1130495 102400 50M 83 Linux 逻辑分区
Command (m for help): p 查看创建好的分区
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0xb33147fb
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 1026047 1024000 500M 83 Linux
/dev/sdc2 1026048 1435647 409600 200M 5 Extended
/dev/sdc5 1028096 1130495 102400 50M 83 Linux
Command (m for help): w 保存分区,并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# fdisk -l /dev/sdc |grep type 检查磁盘是否是MBR分区方式
Disklabel type: dos(MBR)
[root@localhost ~]# yum -y install partprobe
[root@localhost ~]# partprobe /dev/sdc 安装partprobe,刷新内核立即生效,无需重启
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
|-sda1 8:1 0 1G 0 part /boot
`-sda2 8:2 0 99G 0 part
|-cs_192-root 253:0 0 64.1G 0 lvm /
|-cs_192-swap 253:1 0 3.7G 0 lvm [SWAP]
`-cs_192-home 253:2 0 31.3G 0 lvm /home
sdb 8:16 0 20G 0 disk
`-sdb1 8:17 0 1G 0 part
sdc 8:32 0 20G 0 disk
|-sdc1 8:33 0 500M 0 part
|-sdc2 8:34 0 512B 0 part
`-sdc5 8:37 0 50M 0 part
sr0 11:0 1 10.3G 0 rom /mnt/cdrom
gdisk分区
[root@localhost ~]# yum -y install gdisk 安装gdisk工具
[root@localhost ~]# gdisk /dev/sdb
Command (? for help): n 创建新分区
Partition number (1-128, default 1): 默认回车
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 默认回车
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +900M 分配大小
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 默认回车
Changed type of partition to 'Linux filesystem'
Command (? for help): p 查看创建好的分区
Number Start (sector) End (sector) Size Code Name
1 2048 1845247 900.0 MiB 8300 Linux filesystem
Command (? for help): w 保存分区
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
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 ~]# fdisk /dev/sdb -l |grep type 检查磁盘是否是gpt格式
Disklabel type: gpt
[root@localhost ~]# yum -y install partprobe
[root@localhost ~]# partprobe /dev/sdb 安装partprobe,刷新内核立即生效,无需重启
磁盘格式化
使用mkfs命令格式化磁盘,创建文件系统
//mkfs常用的选项有
-b //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
-t //用来指定什么类型的文件系统,可以是ext3,ext4, xfs
-i //设定inode的大小
-N //设定inode数量,防止Inode数量不够导致磁盘不足
-L //预设该分区的标签label
//格式化整个sdb磁盘为ext4文件系统
[root@localhost ~]# mkfs.ext4 /dev/sdb1
//也可以使用-t指定方式创建ext4文件系统
[root@localhost ~]# mkfs -t ext4 /dev/sdb1
//也可以格式化sdb1分区为xfs文件系统
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkfs.xfs /dev/sdc1
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
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@localhost ~]# mount /dev/sdc1 /qwe/
Filesystem Type Size Used Avail Use% Mounted on
[root@localhost ~]# df -Th | grep qwe 可以看到磁盘sdc1文件类型为 xfs
/dev/sdc1 xfs 495M 29M 466M 6% /qwe
磁盘挂载
在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘
挂载分区前需要创建挂载点, 挂载点以目录形式出现
如果往挂载点目录写入数据, 实际上会写入到该分区
挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件
临时挂载磁盘
命令:mount挂载磁盘,实质为文件系统指定访问入口
mount -t //指定文件系统挂载分区,如ext3,ext4, xfs
mount -a //重新读取/etc/fstab配置文件的所有分区
mount -o //指定挂载参数
//fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
[root@localhost ~]#mount -o rw,remount /
[root@localhost ~]# mkdir cipan //创建一个目录,把磁盘/dev/sdc1临时挂载到/cipan这个目录
[root@localhost ~]# mount -t xfs /dev/sdc1 cipan/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc1 495M 29M 466M 6% /root/cipan
永久挂载磁盘
[root@localhost ~]# blkid | grep sdc 使用blkid命令获取各分区的UUID
/dev/sdc1: UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="b33147fb-01"
/dev/sdc5: PARTUUID="b33147fb-05"
[root@localhost ~]# blkid | grep sdc1
/dev/sdc1: UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="b33147fb-01"
[root@localhost ~]# vim /etc/fstab 把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[root@localhost ~]# cat /etc/fstab |grep cipan
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan xfs defaults 0 0
fstab配置文件介绍:
[root@localhost ~]# vim /etc/fstab
//分区标识(UUID或设备名) 挂载点 文件类型 挂载参数 不检查 不备份
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan xfs defaults 0 0
//挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
参数 参数意义 系统默认值
async 系统每隔一段时间把内存数据写入磁盘中,
sync 时时同步内存和磁盘中数据;
suid,nosuid 允许/不允许分区有suid属性 suid
rw,ro 可以指定文件系统是只读(ro)或可写(rw) rw
exec,noexec 允许/不允许可执行文件执行,不要挂载根分区 exec
user,nouser 允许/不允许root外的其他用户挂载分区 nouser
auto,noauto 开机自动挂载/不自动挂载 auto
default 默认文件系统挂载设置 rw, suid, dev, exec, auto, nouser, async
//加载所有配置
[root@localhost ~]# mount -a
卸载挂载磁盘
umount -lf 强制卸载挂载
[root@localhost ~]# umount /root/cipan 使用挂载的目录卸载
[root@localhost ~]# umount /dev/sdc1 使用磁盘设备名卸载/dev/sdc1
umount不能卸载的情况
[root@localhost ~]# cd cipan/ 进入挂载目录进行卸载会显示正忙
[root@localhost cipan]# umount /root/cipan
umount: /root/cipan: target is busy.
如上情况解决办法有两种, 切换至其他目录 或使用'-l'选项强制卸载
[root@localhost db1]# umount -l /db1
交换分区SWAP
交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。
交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。
创建swapfile
[root@localhost ~]# dd if=/dev/zero of=/opt/qq bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.315 s, 324 MB/s
if:指定源 一般写/dev/zero
of:指定目标
bs:定义块大小
count:数量
格式化swap分区
[root@localhost ~]# mkswap -f /opt/qq
mkswap: /opt/qq: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=024c584c-cb6e-4015-a8ba-67737019edcf
检测当前swap分区情况
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3464 267 1903 8 1293 2968
Swap: 3755 0 3755
开启新建的SWAP分区
[root@localhost ~]# swapon /opt/qq
swapon: /opt/qq: insecure permissions 0644, 0600 suggested.
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3464 268 1902 8 1294 2967
Swap: 4779 0 4779
关闭新建的swap分区
[root@localhost ~]# swapoff /opt/qq
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3464 267 1903 8 1294 2968
Swap: 3755 0 3755
[root@localhost ~]# fdisk /dev/sdb1
Command (m for help): n 创建分区
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p 创建主分区
Partition number (1-4, default 1):
First sector (2048-1843199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1843199, default 1843199): +500M 创建大小
Created a new partition 1 of type 'Linux' and of size 500 MiB.
Command (m for help): p
Disk /dev/sdb1: 900 MiB, 943718400 bytes, 1843200 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
Disklabel type: dos
Disk identifier: 0xd88e3e3b
Device Boot Start End Sectors Size Id Type
/dev/sdb1p1 2048 1026047 1024000 500M 83 Linux 把这个分区作为交换分区
Command (m for help): l 列出所有支持的分区类型对应的id
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
Command (m for help): t 修改分区id
Selected partition 1
Hex code (type L to list all codes): 82 修改成id为82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): p
Device Boot Start End Sectors Size Id Type
/dev/sdb1p1 2048 1026047 1024000 500M 82 Linux swap / Solaris 修改为swap类型
Command (m for help): w
[root@localhost ~]# mkswap /dev/sdb1 把sdb1格式化为交换分区
mkswap: /dev/sdb1: warning: don't erase bootbits sectors
(dos partition table detected). Use -f to force.
Setting up swapspace version 1, size = 900 MiB (943714304 bytes)
no label, UUID=ba815d80-b3e5-4f96-a5e5-815cf3c81838
[root@localhost ~]# swapon /dev/sdb1 启动交换分区
[root@localhost ~]# swapon -s 查看
Filename Type Size Used Priority
/dev/sdb1 partition 921596 0 -3
[root@localhost ~]# blkid | grep sdb1
/dev/sdb1: UUID="ba815d80-b3e5-4f96-a5e5-815cf3c81838" TYPE="swap" PTUUID="d88e3e3b" PTTYPE="dos" PARTLABEL="Linux filesystem" PARTUUID="0d3d3591-273e-4be6-a869-c663f259e3ba"
[root@localhost ~]# vim /etc/fstab 持久化保存交换分区的使用
[root@localhost ~]# cat /etc/fstab | grep swap
UUID="ba815d80-b3e5-4f96-a5e5-815cf3c81838" swap swap defaults 0 0
生产磁盘故障案例
Inode被占满,导致磁盘有可用的剩余空间也无法继续使用
[root@localhost ~]# dd if=/dev/zero of=/opt/qq bs=1k count=1024
[root@localhost ~]# mkfs.ext3 -i 1024 /opt/qq
[root@localhost ~]# mkdir /qwe
[root@localhost ~]# mount -t ext3 -o loop /opt/qq /qwe/
//inode被占满
[root@localhost ~]# touch {1..20000}
touch: cannot touch `19997': No space left on device
touch: cannot touch `19998': No space left on device
touch: cannot touch `19999': No space left on device
touch: cannot touch `20000': No space left on device
//inode被占满,剩余block也是无法继续使用
[root@localhost ~]# df -i|grep data
/opt/qq 1024 1024 0 100% /data
[root@localhost ~]# df -h|grep qwe
/opt/newdisk 891K 34K 806K 5% /data
Block空间即将被占满, 但删除大文件也没有释放空间
假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理
//是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log
//正确做法如下, 清空该文件即可释放文件内容
> access.log
卷的管理
lvm的应用场景及其弊端
应用场景:
随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了
弊端:
数据不是直接存放在硬盘上,而是在硬盘的上面又虚拟出来一层逻辑卷存放数据,故而增加了磁盘数据恢复的难度
物理卷、卷组、逻辑卷
物理卷(PV):把常规的块设备(硬盘,分区等可以读写数据的设备)通过pvcreate命令对其进行初始化,就成了物理卷
卷组(VG):把多个物理卷的容量组成一个逻辑整体,可以从里面灵活分配容量
逻辑卷(LV):从卷组中划分部分空间成为一个可以读写数据的逻辑单元。需要对其格式化然后挂载使用
lvm管理
部署lvm
创建lvm步骤:
a) 添加物理磁盘,创建物理卷
b) 创建卷组,将物理卷加入卷组
c) 在卷组中划分逻辑卷
d) 格式化逻辑卷
e) 挂载使用
准备物理磁盘
[root@localhost ~]# lsblk | grep "sd*"
sdb 8:16 0 20G 0 disk
sdc 8:32 0 30G 0 disk
[root@localhost ~]# pvcreate /dev/sdc 将磁盘加入pv(物理卷)
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# pvs 检查pv创建情况
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 30.00g 30.00g
[root@localhost ~]# vgcreate vg1 /dev/sdc 创建一个名为vg1的卷组,把物理卷加入到这个卷组
Volume group "vg1" successfully created
[root@localhost ~]# vgs 检查卷组
VG #PV #LV #SN Attr VSize VFree
vg1 1 0 0 wz--n- <30.00g <30.00g
[root@localhost ~]# lvcreate -n lv1 -L 10G vg1 创建逻辑卷, 分配名称, 以及大小, 指定卷组
Logical volume "lv1" created.
[root@localhost ~]# lvs 检查逻辑卷
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-a----- 10.00g
[root@localhost ~]# mkfs.xfs /dev/vg1/lv1 格式化文件系统
meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
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
[root@localhost ~]# blkid | grep lv1 查看lv1的磁盘id
/dev/mapper/vg1-lv1: UUID="d40ec165-388e-4b45-8fa2-f45719531704" BLOCK_SIZE="512" TYPE="xfs"
[root@localhost ~]# mkdir lv1 创建挂载点目录
[root@localhost ~]# mount /dev/vg1/lv1 lv1/ 挂载并使用
[root@localhost ~]# df -Th | grep lv1
/dev/mapper/vg1-lv1 xfs 10G 104M 9.9G 2% /root/lv1
卷组管理
- 扩展卷组,将新磁盘加入卷组
[root@localhost ~]# pvcreate /dev/sdc 新硬盘加入pv(物理卷)
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# vgs 查看已有的卷组
VG #PV #LV #SN Attr VSize VFree
vg1 1 0 0 wz--n- <20.00g <20.00g
[root@localhost ~]# vgextend vg1 /dev/sdc 选择vg1卷组,把物理卷sdc加入到这个卷组
Volume group "vg1" successfully extended
[root@localhost ~]# vgs 查看扩展后卷组的大小
VG #PV #LV #SN Attr VSize VFree
cs_192 1 3 0 wz--n- <299.00g 0
vg1 2 0 0 wz--n- 49.99g 49.99g
- 缩减卷组,将指定磁盘从卷组中删除
[root@localhost ~]# vgreduce vg1 /dev/sdc 指定sdc从vg1这个卷组里面删除
Removed "/dev/sdc" from volume group "vg1"
[root@localhost ~]# vgs 查看所减小的卷组大小
VG #PV #LV #SN Attr VSize VFree
vg1 1 0 0 wz--n- <20.00g <20.00g
- 数据迁移卷组,同一卷组的磁盘才可以进行在线迁移
[root@localhost ~]# pvs 检查当前逻辑卷VG中PV使用情况
PV VG Fmt Attr PSize PFree
/dev/sdb vg1 lvm2 a -- 2.00g 1.76g
/dev/sdc vg1 lvm2 a -- 2.00g 2.00g
[root@localhost ~]# pvmove /dev/sdb pvmove在线数据迁移至其他pv
/dev/sdb: Moved: 41.33%
/dev/sdb: Moved: 100.00%
[root@localhost ~]# pvs 检查是否将sdb数据迁移至sdc
PV VG Fmt Attr PSize PFree
/dev/sdb vg1 lvm2 a -- 2.00g 2.00g
/dev/sdc vg1 lvm2 a -- 2.00g 1.76g
逻辑卷管理
- 逻辑卷扩展,逻辑卷的扩展取决于卷组中的容量,逻辑卷扩展的容量不能超过卷组的容量
1.扩展lv逻辑卷
增加800M分配给逻辑卷 {注意: 800M +800M 不一样}
[root@localhost ~]# lvextend -L +500M /dev/vg1/lv1
分配磁盘池中多少百分比给逻辑卷
[root@localhost ~]# lvextend -l +50%FREE /dev/vg1/lv1
2.扩展fs文件系统
xfs扩容
[root@localhost ~]# xfs_growfs /dev/vg1/lv1
ext扩容
[root@localhost ~]# resize2fs /dev/vg1/lv1
- 对
ext4
文件系统的逻辑卷裁剪容量
[root@localhost ~]# lvcreate -n lv1 -L 1G vg1 首先自己创建一个1G的逻辑卷作为裁剪的对象
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv1 vg1 -wi-a----- 1.00g
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1
[root@localhost ~]# mkdir lv1
[root@localhost ~]# mount /dev/vg1/lv1 lv1/
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg1-lv1 ext4 976M 2.6M 907M 1% /root/lv1
缩减逻辑卷
缩减逻辑卷注意事项:
- 不能在线缩减,得先卸载;
- 确保缩减后的空间大小依然能存储原有的所有数据;
- 在缩减之前应该先强行检查文件,以确保文件系统处于一致性状态。使用命令e2fsck -f /PATH/TO/LV
[root@localhost ~]# umount /root/lv1 如果已经挂载,必须先取消挂载
[root@localhost ~]# e2fsck -f /dev/vg1/lv1 裁剪容量,必须是先检测文件系统
[root@localhost ~]# resize2fs /dev/vg1/lv1 500M 下面剪裁的大小要和这个一样
[root@localhost ~]# lvreduce -L 500M /dev/vg1/lv1 调整完毕后采取裁剪逻辑卷容量
[root@localhost ~]# e2fsck -f /dev/vg1/lv1 强烈建议裁剪后,再次检测文件系统
[root@localhost ~]# mount /dev/vg1/lv1 lv1/ 挂载测试如果能够挂载,一般说明裁剪成功,文件系统没有损坏
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg1-lv1 ext4 460M 1.6M 424M 1% /root/lv1
##
举例:
1.如何查看/etc/目录大小
[root@localhost ~]# du -sh /etc/
25M /etc/
2.如何查看磁盘使用分区情况
[root@localhost ~]# fdisk -l
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 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
Disklabel type: dos
Disk identifier: 0xadb8ebb2
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 629145599 627046400 299G 8e Linux LVM
3.如何查看inode使用情况
[root@localhost ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 469172 427 468745 1% /dev
tmpfs 474180 1 474179 1% /dev/shm
4.如何查看磁盘block使用情况
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 1876688 0 1876688 0% /dev
tmpfs 1896720 0 1896720 0% /dev/shm
5.如何查看分区使用格式
[root@localhost ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
devtmpfs devtmpfs 1876688 0 1876688 0% /dev
6.如何查看一个设备的UUID
[root@localhost ~]# blkid
/dev/sda1: UUID="f0ed5bbf-5233-46b2-85bf-4db42ccf3dca" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="adb8ebb2-01"
7.请解释/etc/fstab中每段含义
[root@localhost ~]# vim /etc/fstab
/分区标识(UUID或设备名) 挂载点 文件类型 挂载参数 不检查 不备份
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan xfs defaults 0 0
8.一个ext4的文件分区,当使用touch test.file命令创建一个新文件是报错,报错的信息提示磁盘已满,但是采用df –h 命令查看磁盘大小时,只是用了60%的磁盘空间,为什么会出现这个情况,说说你的理由.
两种情况,一种是磁盘配额问题,另外一种就是EXT4文件系统的设计不适合很多小文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode 耗尽了。
磁盘分区方案
在虚拟机中添加一块20GB的SCISI磁盘
在新硬盘中建立一个5GB的分区,一个10G的分区
一个格式化为ext4的文件系统, 一个格式化为xfs的文件系统
新建两个目录站点进行挂载, 要求开机自动挂载该分区
[root@localhost ~]# lsblk | grep sdb
sdb 8:16 0 20G 0 disk
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x7b397073.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048): ^C
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +5G
Created a new partition 1 of type 'Linux' and of size 5 GiB.
Partition #1 contains a ext4 signature.
The signature will be removed by a write command.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (10487808-41943039, default 10487808):
Last sector, +sectors or +size{K,M,G,T,P} (10487808-41943039, default 41943039): +10G
Created a new partition 2 of type 'Linux' and of size 10 GiB.
Command (m for help): p
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 31459327 20971520 10G 83 Linux
Command (m for help): w
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkdir ext1 xfs1
[root@localhost ~]# blkid | grep sdb*
/dev/sdb1: UUID="339d970e-023c-403f-aa16-2a7690ecc703" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="7b397073-01"
/dev/sdb2: UUID="130f973a-250d-458d-b4aa-e9186830aeb4" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="7b397073-02"
[root@localhost ext1]# vim /etc/fstab
UUID="339d970e-023c-403f-aa16-2a7690ecc703" /root/ext1 ext4 defaults 0 0
UUID="130f973a-250d-458d-b4aa-e9186830aeb4" /root/xfs1 xfs defaults 0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -Th | grep sdb*
/dev/sdb1 ext4 4.9G 20M 4.6G 1% /root/ext1
/dev/sdb2 xfs 10G 104M 9.9G 2% /root/xfs1