Linux磁盘管理
一个磁盘若要能够使用必须经过以下步骤:
- 1、分区,也可不分区表示将整块盘作为一个分区。
- 2、格式化写入文件系统。
- 3、挂载。
Linux中磁盘的命名
- SATA/SCSI/SAS接口:/dev/sd
- IDE接口:/dev/hd
- 虚拟硬盘:/dev/vdd
硬盘数按26个英文字母排列从a开始,/dev/sda表示SATA/SCSI/SAS接口的第一块硬盘。
分区号按数字排列/dev/hda1,表示IDE接口的第一块硬盘上第一个分区。
查看磁盘信息
lsblk命令
列出所有可用的或指定的块设备的信息,该命令以树状格式打印所有块设备。
df命令
报告文件系统磁盘空间使用情况。
-h:显示单位
-i:显示iNode使用信息。
-T:显示文件系统类型
du命令
估计文件空间使用率。
-s:显示目录大小
-h:显示单位。
free命令
显示系统中可用和已用内存量。
[chirou@duorou ~ ]$ free
total used free shared buff/cache available
Mem: 1530860 254528 467032 9228 809300 1099836
Swap: 2097148 0 2097148
字段 | 含义 |
---|---|
total | 总容量 |
used | 已用空间 |
free | 空闲空间,完全没有被使用的空间。 |
shared | 共享空间 |
buff/cache | 缓冲和缓存 |
available | 可用空间,估计有多少内存可用于启动新的应用程序 |
注:
1、used = total - free - buff/cache - cache
2、available = free + buff/cache中可以被释放的空间,available才是真正可用的空间。
partprobe命令
通知操作系统更新分区表。使用gdisk或fdisk更改分区表后,若无法查看更新后的分区表,可使用该命令。
分区的三类
- 主分区:又称引导分区,包含MBR主引导记录,可以安装系统的分区。
- 扩展分区:扩展分区最多只能有一个,不能被格式化,仅能用来划分逻辑分区。
- 逻辑分区:能够被格式化,存取数据。
分区的两种方式
- MBR分区:主分区+扩展分区最大为4个,不支持2T以上的磁盘。MBR只有一个分区表,如果被损坏很难恢复。
主分区+扩展分区最多只能有四个(或者全部四个都是主分区,但这样无意义),这是因为MBR的
分区方式是在第一个扇区里记录分区表,前446字节是grub程序,中间64字节是分区记录表,最
多只能支持4个分区记录。最后2字节是结束标志位。
- GPT分区:最大支持128个分区,支持2T以上的磁盘。
GPT意思是GUID Partiton Table,使用34个LBA(Logical Block Address)来记录分
区信息,前两个LBA记录第一阶段的开机引导程序和
GPT除了在首部有34个LBA外,在整个硬盘的尾部最后33个LBA也拿来作为另一个备份,这样能保
证分区记录安全。
MBR分区
fdisk命令
# 查看分区信息
fdisk -l /dev/sda
[chirou@duorou ~ ]$ sudo fdisk -l /dev/sda
磁盘 /dev/sda:34.4 GB, 34359738368 字节,67108864 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0000c573
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1562623 780288 83 Linux
/dev/sda2 1562624 67108863 32773120 8e Linux LVM
# 磁盘管理
[root@duorou ~ ]# fdisk /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):m
命令操作
d delete a partition # 删除一个分区
g create a new empty GPT partition table # 创建一个新的空GPT分区表
G create an IRIX (SGI) partition table # 创建一个IRIX分区表
l list known partition types # 列出已知分区类型
m print this menu # 打印这个菜单(帮助信息)
n add a new partition # 添加一个新分区
o create a new empty DOS partition table # 创建一个新的空DOS分区表
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
v verify the partition table # 验证分区表
w write table to disk and exit # 保存分区表并退出
x extra functionality (experts only) # 拓展功能
创建分区:
- 输入n创建新分区
- 选择主分区或扩展分区,最少要有一个主分区,创建扩展分区后才能创建逻辑分区。
- 分区号使用默认的即可,扩展分区的分区号固定为5。
- 起始扇区要保证连续,直接回车选择默认即可。
- 结束扇区的修改方式:Last 扇区, +扇区 or +size{K,M,G},回车后即添加成功。
- 输入w即可保存退出。
GPT分区
gdisk命令
gdisk内置命令与fdisk基本一致,输入?显示帮助信息。
# 创建新分区
Command (? for help): n
Partition number (1-128, default 1): # 直接回车默认即可
First sector (34-4294965214, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-4294965214, default = 4294965214) or {+-}size{KMGTP}: +10G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
格式化制作文件系
CentOS 7使用的文件系统是xfs,CentOS 6使用的是ext系列,它们都是日志式文件系统。xfs专为大数据产生,每个单个文件系统最大可以支持8eB,单个文件可以支持16tB,不仅数量大,而且扩展性高。还可以通过xfsdump,xfsrestore来备份和恢复。
使用mkfs.xfs命令为分区写入文件系统。
[root@duorou ~ ]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=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
# 当已存在文件系统,可以-f强制重新格式化。
[root@duorou ~ ]# mkfs.xfs -f /dev/sdb1
挂载和卸载
- mount命令:显示当前系统已挂载的所有设备。
格式:#mount Device Drictory
device:指明要挂载的设备
设备文件,例如/dev/sda2
卷标:-L ‘LABEL' 例如:-L ‘MYDATA'
UUID:-U 伪文件系统名称:proc,sysfs,devtmpfs
dir:挂载点,必须事先存在,建议使用空目录,挂载点下原有文件会在挂载完成后被临时隐藏
-t vsftype:指定要挂载设备上的文件系统类型
-r :readonly,只读挂载
-w:read and write,读写挂载
-n:不更新/etc/fstab
-a:自动挂载所有支持自动挂载的设备:(定义在/etc/fstab文件中,且挂载选项中有自动挂载功能)
-B,--bind:绑定目录到另一个目录上
-o options:(启用或关闭挂载文件系统的选项)
async:异步模式
sync:同步模式
atime:每次查看目录或文件更新时间戳
noaitme:每次查看目录或文件不更新时间戳
diratime/nodiratime:目录的访问时间戳
auto/noauto:是否支持自动挂载
exec/noexec:是否支持将文件系统上应用程序运行为进程
dev/nodev:是否支持在此文件系统上使用设备文件
suid/nosuid: 是否允许suid和sgid权限生效。
remount:重新挂载
ro:只读
rw:只写
user/nouser:是否允许普通用户挂载此设备
acl:启用此文件系统上的acl功能
上述选项可多个同时使用,使用逗号分隔,尽量禁止普通用户挂载设备。
默认的挂载选项:defalts:rw,suid,dev,exec,auto,nouser,and async
一个设备可以挂在两个挂载点上。一个挂载点挂两个设备时,存取数据是以后挂载的设备为准。
- umount:卸载文件系统。
# 卸载时指定设备或挂载点都可以。
umount { Device | Drictory }
当文件系统在“忙”时无法卸载,例如,当文件系统上有打开的文件时,或当某个进程的工作目录在那里,或者当其中的交换文件正在使用时。可以使用-l选项强制卸载。
umount -l { Device | Drictory }
- mount命令挂载设备是临时挂载,重新开机不会自动挂载。如果要开机自动挂载需要写入文件中。
挂载配置文件:/etc/fstab
[chirou@duorou ~ ]$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Sep 20 16:54:17 2020
#
# 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=41dad7e0-6226-45a2-9957-6e6e14195119 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sr0 /media/cdrom iso9660 defaults 0 0
UUID=b9554aba-d2e1-4c25-a62e-de0e8388ca05 /game xfs defaults 0 0
字段 | 含义 |
---|---|
第一字段 | UUID或设备名,推荐UUID |
第二字段 | 挂载点 |
第三字段 | 文件系统,光盘文件系统为iso9660 |
第四字段 | 文件系统的选项,也就是mount -o 选项可指定的属性。 |
第五字段 | 能否被dump指令备份,0表示不备份,1表示每天备份,2不定日期备份。 |
第六字段 | 开机是否以fsck检测。xfs文件系统会自动检测,这项也置0即可。 |
制作swap分区
-
1、使用gdisk或fdisk创建新分区
gdisk /dev/sdb
-
2、制作swap文件系统
mkswap /dev/sdb1
-
3、激活swap分区
swapon /dev/sdb1
-
按设备查看交换分区使用情况。
swapon --show NAME TYPE SIZE USED PRIO /dev/dm-1 partition 2G 37.8M -2 /dev/sdb1 partition 1024M 0B -3
-
关闭swap
# -a选项会关闭所有swap分区。 swapoff -a [root@duorou ~ ]# free total used free shared buff/cache available Mem: 1530860 151780 1260840 9184 118240 1241888 Swap: 0 0 0 # 可以指定关闭某个swap分区。 swapoff /dev/sdb1
若硬盘没有过多的分区可用,也可以通过文件增加swap空间,本质上也是硬盘。
-
1、使用dd命令创建一个指定大小的文件。
dd if=/dev/zero of=/swap_file bs=1M count=1024
-
2、将权限改为仅root可读写。
chmod 600 /swap_file
-
3、制作swap文件系统
mkswap -f /swap_file
-
4、激活swap分区
swapon /swap_file
以上都是临时挂载,若要永久挂载需要写入/etc/fstab文件中。
修复文件系统
在Linux中,为了增加系统性能,通常系统会将一些写入数据先放在内存中,并不会直接将数据写入硬盘,这是因为为内存速度要比硬盘快若干倍。但如果此时系统突然断电,那么重启系统后,会造成文件系统错误:“emergency mode”
welcome to emergency modeѺafter logging in ҅type “journalctl -xb” to view
system logs҅“systemctl reboot” to reboot ҅“systemctl default” to try again to
boot into default mode̶
give root password for maintenance
执行任何命令都会有以下(或相似)错误:
Error getting authority: Error initializing authority: Could not connect: No
such file or directory (g-io-error-quark, 1)
查看运行日志,可以提示出损坏的文件系统:
journalctl -xb
修复方式:
# 如果无法进入操作系统,可以进入单用户或光盘修复模式下操作
# 1、首先尝试mount和umount文件系统,以便重放日志,修复文件系统,若不可行,执行下列操作
# 2、执行xfs_repair -n,只检查不修复:检查文件系统是否损坏,如果损坏会列出将要执行的操作。
xfs_repair -n /dev/sdb2
# 如果是日志和数据不一致了,xfs默认会在挂载的时候修复这种不一致,操作系统给出的建议是以读写的方式挂载并自
# 动修复,可以尝试以只读不修复方式挂载文件系统。
mount -o ro,norecovery /dev/sdb2 /opt
# 3、如果上述挂载不成功,可以执行xfs_repair /dev/sdb2
xfs_repair /dev/sdb2
# 4、若还不可,则只能采用“损失部分数据的修复方法”,根据打印消息,修复失败时:
xfs_repair -L /dev/sdb2 # 清空日志,会丢失文件
xfs_repair /dev/sdb2
# 5、修复完成后,尝试是否能正常挂载,如能,取消挂载,再正常挂载即可。
注:-L是修复xfs文件系统的最后手段,慎重选择,会清空日志,会丢失用户数据和文件。
在执行xfs_repair操作前,最好使用xfs_metadump工具保存元数据,一旦修复失败,还可以恢复到修复之前的状态。
如果是ext文件系统,修复需要用fsck命令
fsck -f -y /dev/sdb2
-y:表示自动回答yes
-f:即使文件系统标记为clean也强制进行检查。
注:修复文件系统是万不得已的手段,运维人员应做好数据备份,而不应对数据修复存在侥幸心理。
xfs文件系统备份和恢复
xfsdump命令
xfsdump有两种级别:
- 0:表示完全备份
- 1 <= level <= 9:增量备份
常用参数:
-L:xfsdump会记录每次备份的session Label,这里可以填写针对此文件系统的简易说明。
-M:xfsdump可以记录存储Media Label,这里可以填写此媒体的简易说明。
-l:指定level,有0-9共10个等级,默认为0,即完整备份。
-f:后面接产生的文件和destination file。例如设备文件名或普通文件名。
-I:从/var/lib/xfsdump/inventory列出目前备份的信息状态。
xfsdump使用限制:
1、必须是root权限
2、只能备份已挂载的文件系统。
3、只能备份xfs文件系统
4、只能用xfsrestore解释
5、通过文件系统的UUID来区分备份档,所以不能备份相同UUID的文件系统。
xfsdump备份
# 1、先做全量备份,切记“备份的源路径”末尾不要加斜杠/
xfsdump -l 0 -L sda1_boot_bak -M sda1_bak -f 全量备份后的备份文件名1 备份的源路径
# 2、再做增量备份
xfsdump -l 1 -L sda1_boot_bak -M sda1_bak -f 增量备份后的备份文件名2 备份的源路径
xfsdump -l 1 -L sda1_boot_bak -M sda1_bak -f 增量备份后的备份文件名3 备份的源路径
xfsdump -l 1 -L sda1_boot_bak -M sda1_bak -f 增量备份后的备份文件名4 备份的源路径
xfsrestore数据恢复
-f:指定备份的文件名
-I:与xfsdump -I输出相同
恢复数据时先恢复全量备份,再按照时间线恢复增量数据,这样能保证数据完整性。
# 1、先恢复全量
xfsrestore -f 全量备份文件名1 恢复备份的路径
# 2、再恢复增量备份
xfsrestore -f 增量备份文件名2 恢复备份的路径
xfsrestore -f 增量备份文件名3 恢复备份的路径
xfsdump生成的备份文件即便挪动了位置,只要文件保存完整,也能正常恢复。
proc文件系统
/proc文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。
[chirou@duorou ~ ]$ ls /proc
1 1493 2728 3189 41 673 749 cgroups key-users softirqs
10 1497 2729 32 43 675 751 cmdline kmsg stat
1004 1498 2730 33 44 677 755 consoles kpagecount swaps
1007 15 2731 371 45 6895 758 cpuinfo kpageflags sys
1011 1554 277 381 495 6900 8 devices locks sysvipc
1013 1560 280 382 519 7 8083 diskstats mdstat timer_list
1020 16 282 395 532 700 827 dma meminfo timer_stats
1025 17 283 396 6 701 8679 driver misc tty
1026 18 284 397 60 706 8720 execdomains modules uptime
11 19 2845 398 620 708 8797 fb mounts version
在左边是一系列数字编号的文件。每个实际上都是一个目录,表示系统中的一个进程。由于在GNU/Linux中创建的第一个进程是init进程,因此它的process-id为1。然后对这个目录执行一个 ls命令,这会显示很多文件。每个文件都提供了有关这个特殊进程的详细信息。例如,要查看init的command-line项的内容,只需对cmdline文件执行cat命令。
/proc中另外一些文件有:cpuinfo,它标识了处理器的类型和速度;pci:显示在PCI总线上找到的设备;modules:标识了当前加载到内核中的模块。
cat /proc/cpuinfo # 查看CPU信息
cat /proc/meninfo # 查看内存
释放buffer和cache:
echo 3 > /proc/sys/vm/drop_cache
查看内核启动参数:
[chirou@duorou ~ ]$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1127.19.1.el7.x86_64 root=/dev/mapper/centos-root ro
crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
LANG=zh_CN.UTF-8
卸载和挂载/proc:
# 卸载,需要加上-l才行
umount -l /proc
# 卸载后free、uptime、lscpu、toop等命令都无法使用。
# 重新挂载
mount -t proc proc /proc