硬盘
设备文件
- 设备类型
- 块设备:block,存取单位“块”,磁盘
- 字符设备:char,存取单位“字符”,键盘
- 设备文件/dev/DEV_FILE:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信
- 设备号码
- 主设备号:major number,标识设备类型, 8
- 次设备号:minor number,标识同一类型下的不同设备 0,1,2,...
[root@test1_c1 ~]#ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Aug 28 22:04 /dev/sda
brw-rw---- 1 root disk 8, 1 Aug 28 22:04 /dev/sda1
brw-rw---- 1 root disk 8, 2 Aug 28 22:04 /dev/sda2
brw-rw---- 1 root disk 8, 16 Aug 28 22:04 /dev/sdb
brw-rw---- 1 root disk 8, 17 Aug 28 22:04 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Aug 28 22:04 /dev/sdb2
brw-rw---- 1 root disk 8, 19 Aug 28 22:04 /dev/sdb3
brw-rw---- 1 root disk 8, 20 Aug 28 22:04 /dev/sdb4
brw-rw---- 1 root disk 8, 21 Aug 28 22:04 /dev/sdb5
brw-rw---- 1 root disk 8, 32 Aug 28 22:04 /dev/sdc
brw-rw---- 1 root disk 8, 48 Aug 28 22:04 /dev/sdd
# 创建设备文件
mknod /dev/cd b 11 0 #创建一个cd设备文件
# 判断磁盘类型
cat /sys/block/sda/queue/rotational
1. 为机械硬盘
0. 为固态硬盘
分区
从磁盘到可以使用的文件系统的步骤
- 设备识别
echo '- - -' > /sys/class/scsi_host/host[0|2]/scan - 设备分区
- 创建文件系统
- 标记文件系统
- 在/etc/fstab文件中创建条目
- 挂载新的文件系统
MBR分区
- 分区不超过2T
- layout
- 0磁道0扇区:512bytes
- 446 bytes:boot loader
- 64 bytes:分区表,每16bytes标识一个分区
- 2 bytes:55AA 分区头结尾标识
-
一块硬盘至多能分4各主分区,也可以3各主分区+1扩展分区(N各逻辑分区)
# 查看磁盘分区头部信息
hexdump -C -n 512 /dev/sda
# 备份分区表
dd if=/dev/sda of=/data/dpt bs=1 count=66 skip=446
# 恢复分区表
dd if=/data/dpt of=/dev/sda bs=1 count=66 seek=446
sync
GPT分区
- 支持128个分区,最大8Z(512B/block)或64Z(4096B/block)空间
- 使用128位UUID表示磁盘和分区
- GPT分区表自动备份在头和尾两份,并由CRC校验位
-
UFEI
#生成UUID
uuidgen
管理分区
列出块设备
lsblk from package util-linux-2.23.2-63.el7.x86_64
创建分区使用
- fdisk mbr分区
- gdisk GPT分区
3.parted 高级分区操作
重新设置内存中的内核分区表
partprobe
同步分区表
- 查看内核是否已经识别新的分区
cat /proc/partitions - centos6
- 新增分区
partx -a /dev/DEVICE - 删除分区
partx -d --nr M-N /dev/DEVICE
- centos7
partprobe /dev/DEVICE
文件系统
在存储设备上组织文件的方法,操作系统负责管理和存储文件信息的软件结构称为文件系统,查看内核支持的文件系统:ls /lib/modules/uname -r
/kernel/fs
文件系统的类型
- linux:ext2, ext3, ext4, xfs, btrfs
- windows: FAT32, NTFS, exFAT
- Unix: FFS, UFS, JFS2
- 光盘:iso9660
- 网络文件系统:NFS, CIFS
- 集群文件系统:GFS2, OCFS2
- 分布式文件系统:fastfs, ceph, moosefs, glusterfs, Lustre
- RAW: 未经处理或者未经格式化产生的文件系统
文件系统分类
- 根据是否支持“journal”功能
- 日志型:ext3,ext4,xfs,...
- 非日志型: ext2, vfat
文件系统的组成部分
- 内核中的模块:ext4,xfs,vft
- 用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat
linux虚拟文件系统 VFS
查看当前OS支持文件系统:
cat /proc/filesystems
文件系统管理
创建文件系统
- mkfs.FS_TYPE /dev/DEVICE
- mkfs -t FS_TYPE /dev/DEVICE -L 'LABEL'
- FS_TYPE:ext4, xfs, brrfs, vfat
- mke2fs: ext系列专用
option | comments |
---|---|
-t {ext2|ext3|ext4} | 指定文件系统类型 |
-b {1024|2048|4096} | 指定块大小 |
-L 'LABEL' | 设置卷标 |
-j | 相当于 -t ext3 |
-i | 为数据空间中每多少个字节创建一个inode;不应该小于block大小 |
-N | 指定分区中创建多少个inode |
-I | 一个inode记录占用的磁盘空间大小,128 -- 4096 |
-m # | 默认5%,为管理人员预留空间占总空间百分比 |
-o FEATHER [,..] | 启用指定特性 |
-o ^FEATURE | 关闭指定特性 |
文件系统的标签
指向设备的另一种方法,于设备无关
- blkid [option]...[device]
-U UUID:根据UUID来查找对应的设备
-L LABEL:根据LABEL来查找对应的设备 - e2label: 管理ext系列文件系统的label
- e2label DEVICE [:ABEL]
- findfs 查找分区
- findfs [options] LABEL=
- findfs [options] UUID=
修改文件系统的参数
- tune2fs only for ext系列
options | comments |
---|---|
-l | 查看指定文件系统超级块信息super block |
-L 'LABEL' | 修改卷标 |
-m # | 修改预留给管理员的空间百分比 |
-j | 将ext2升级至ext3 |
-O | 文件系统属性启用或禁用 |
-o | 调整文件系统默认挂载选项 -o ^acl |
-U UUID | 修改UUID号 |
- dumpe2fs:显示ext文件系统信息,将磁盘块分组管理
- -h:查看超级块信息,不显示分组信息
- xfs_info:显示已挂载的xfs文件系统信息
- xfs_info mountpoint
# 查看文件系统类型
blkid
# 查看文件系统超级块信息
tune2fs -l /dev/sda2
dumpe2fs /dev/sda2
超级块和inode table
文件系统检测和修复
- 故障特征
文件系统故障一般发生在死机或非正常关机之后,挂载的文件系统被标记为"no clean" - NOTE: 一定不要在挂载状态下执行修复命令
- 修复
- fsck.FS_TYPE | fsck -t FS_TYPE
- -a自动修复
- -r 交互式修复错误
- e2fsck:ext系列文件系统专用工具
- -y 自动回答yes
- -f 强制修复
- -p 自动进行安全的修复文件系统问题
-xfs_repair:xfs文件系统专用检测修复工具 - -f 修复文件
- -n 只检查
- -d允许修复只读的挂载设备,在单用户下修复/是使用,修复后立即reboot
xfs_info /data/sdb1/
umount /dev/sdb1
xfs_repair /dev/sdb1
挂载
挂载
mount [OPTIONS] DEVICE MOUNT_POINT
- 挂载设备
device | 挂载设备 |
---|---|
设备文件 | 例如/dev/sda5 |
卷标 | -L 'LABEL',例如-L 'MYDATA' |
UUID | -U 'UUID',例如-U ''0c50523c-43f1-45e785c0-a126711d406e |
伪文件系统名称 | proc, sysfs, devtmpfs, configfs |
- 挂载点
- 事先存在,建议空目录
- 进程正在使用的设备无法被卸载
- 命令选项
option | comments |
---|---|
-t vsf_type | 指定要挂载的设备上的文件系统类型 |
-r | readonly,只读挂载 |
-w | read and write 挂载 |
-n | 不更新/etc/fstab, mount不可见 |
-a | 自动挂载所有支持自动挂载设备(在/etc/fstab中定义,且挂载项中有auto) |
-L 'LABEL' | 以卷标指定挂载设备 |
-U 'UUID' | 以UUID指定要挂载的设备 |
-B | 绑定一个目录到另一个目录上 |
cat /proc/mounts | 查看内核追踪到的已挂载的所有设备 |
- -o options:挂载文件系统的选项,多个选项使用逗号分割
options | comments |
---|---|
async | 异步模式 |
atime/noatime | 包含目录和文件 |
diratime/nodiratime | 目录访问的时间戳 |
auto/noauto | 是否支持自动挂载 |
exec/noexec | 是否支持文件系统上运行应用程序 |
dev/nodev | 是否支持在此文件系统上使用设备文件 |
suid/nosuid | 是否支持suid和sgid权限 |
remount | 重新挂载 |
ro | 只读 |
rw | 读写 |
user/nouser | 是否允许普通用户挂载此设备 |
acl | 启用此文件系统上的acl功能 |
loop | 使用loop 设备 |
- defaults:相当于rw, suid, dev, exec, auto, nouser, async
卸载
- 查看挂载情况
- mount
- find mnt MOUNT_POINT | DEVICE
- 查看正在访问指定文件系统的进程
- lsof MOUNT_POINT
- fuser -v MOUNT_POINT
- 终止所有正在访问指定文件系统的进程
- fuser -km MOUNT_POINT
4.卸载 - umount DEVICE | MOUNT_POINT
mount -o remount,rw /mnt/sdb1
mount -a
# 显示当前挂载的文件系统
cat /etc/mtab
# 显示挂载,包括隐藏挂载
cat /proc/mounts
# 挂载文件夹到文件夹,文件夹链接
mount -B install/ dir/
# 文件挂载到目录
dd if=/dev/zero of=/data/disk bs=1M count=100
mkfs.xfs disk
[root@test1_c1 data]#blkid /data/disk
/data/disk: UUID="e6d5a2c3-e3a6-4baf-927a-1ad52224015e" TYPE="xfs"
mount /data/disk dir
touch /data/dir/file
# 查看正在使用挂载目录的用户
[root@test1_c1 dir]#fuser -v /data/dir
USER PID ACCESS COMMAND
/data/dir: root kernel mount /data/dir
root 2374 ..c.. bash
lsof /data/dir
# 关闭正在使用/data/dir的进程
fuser -km /data/dir
# 判断是否是挂载点
findmnt /data/dir
挂载配置文件/etc/fstab
- 要挂载的设备或伪文件系统
- 设备文件
- LABEL=""
- UUID=""
- 伪文件系统:proc,sysfs
- 挂载点
- 文件系统类型:
- 挂载选项:defaults,acl,bind...
- 转储频率:0不备份;1每天转储;2每隔一天转储
- fsck检查文件系统的顺序:0不自检;1首先自检;2非rootfs使用
# 加入挂载项
UUID=c1fe05ae-90d0-40de-877a-8e47a6fb5e0f /data/dir xfs defaults 0 1
# mount生效
mount -a
# 在/etc/fstab中目录挂载目录item
/dir1 /dir2 none bind 0 0
# 挂载光盘
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
管理swap
推荐的swap空间
系统中的RAM量 | 推荐的swap空间 | 允许休眠时建议swap空间大小 |
---|---|---|
低于2GB | RAM量的倍数 | RAM量的三倍 |
2GB-8GB | 等于RAM量 | RAM量的倍数 |
8GB-64GB | 4GB到RAM容量的0.5倍 | RAM容量的1.5倍 |
超过64GB | 独立负载(至少4GB) | 不建议使用休眠功能 |
添加swap分区
基本设置
- 创建交换分区或者文件
- 使用mkswap 写入特殊签名
- 在/etc/fstab文件中添加适当的条目
- 使用swapon -a激活交换空间
启用swapon[OPTION]...[DEVICE]
- -a 激活所有交换分区
- -p priority 指定优先级
禁用swapoff [OPTION]...[DEVICE]
# 创建新的swap分区
fdisk /dev/sdc
Hex code (type L to list all codes): 82
# 创建swap文件系统
mkswap /dev/sdc1
# 加入/etc/fstab
UUID=3e3a2866-b061-480e-8239-49eb6af0edd7 swap swap defaults 0 0
# active swap并查看
swapon -a
cat /proc/swaps
swapon -s
# 更改优先级
UUID=3e3a2866-b061-480e-8239-49eb6af0edd7 swap swap pri=10 0 0
[root@test1_c1 ~]#swapoff /dev/sdc1
[root@test1_c1 ~]#swapon -a
swapon -s
# 使用文件做swap
# 创建文件
dd if=/dev/zero of=/data/swapfile bs=1G count=1
#格式化
mkswap /data/swapfile
# 编辑/etc/fstab文件
/data/swapfile swap swap defaults 0 0
# active
swapon -a
[root@test1_c1 ~]#swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 47868 -2
/dev/sdc1 partition 4194300 2908 10
/data/swapfile file 1048572 0 -3
磁盘管理常用命令
df 查看文件系统空间占用等信息
df [option]...[file]...
options | comments |
---|---|
-H | 以10为单位 |
-T | 文件系统类型 |
-h | human-readable |
-i | inodes instead of blocks |
-P | 以Posix兼容的格式输出 |
du 查看某目录总体空间占用状态
du [option]...DIR
options | comments |
---|---|
-h | human-readable |
-s | summary |
--max-depth=# | 指定最大目录层级 |
# 显示boot下文件所有的item大小
du -h /boot
# 显示/boot大小
du -sh /boot
dd convert and copy a file
dd if=/path/from/src of=/path/to/dest bs=# count=#
option | comment |
---|---|
if=file | 从命名文件读取而不是从标准输入 |
of=file | 写到所命名的文件而不是到标准输出 |
ibs=size | 一次读size个byte |
obs=size | 一次写size个byte |
bs=size | block size,指定块的大小(既是ibs也是obs) |
cbs=size | 一次转化size个byte |
skip=blocks | 对输入,从开头忽略blocks个bs大小的块, |
seek=blocks | 对输出,从开头忽略block个bs大小的块 |
count=n | 复制n个bs |
conv=conversion [,conversion] 用指定的参数转换文件 | |
转换参数 | |
ascii | 转换ebcdic为ascii |
ebcdic | 转换ascii为encdic |
lcase | 把大写字符转换为小写字符 |
ucase | 把小写字符转换为大写字符 |
nocreat | 不创建输出文件 |
noerror | 出错时不停止 |
no trunc | 不截短输出文件 |
sync | 把每个输入块填充到ibs个字节,不足的部分用NUL字符补齐 |
fdatasync | 写完成前,物理写入输入文件,用于测试磁盘速度 |
#1. 备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
#2.破坏MBR中的bootloader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
# 3.有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读 取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开 始的位置,替换128Bytes
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
# 4. 备份
# 将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy
# 将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image
# 备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/dev/sdx | gzip > /path/to/image.gz
# 5.恢复
# 将备份文件恢复到指定盘
dd if=/path/to/image of=/dev/sdx
# 将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx
# 6. 拷贝内存资料到硬盘
# 将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/mem of=/root/mem.bin bs=1024
# 从光盘拷贝iso镜像
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
dd if=/dev/cdrom of=/root/cd.iso
# 销毁磁盘数据
利用随机数据填充硬盘,在某些必要场合可以用来销毁数据
dd if=/dev/urandom of=/dev/sda1
# 7. 创建一个10G大小的空文件,虚拟化用
dd if=/dev/zero of=/boot/test bs=1G count=9 seek=10
RAID
RAID 0
RAID 1
RAID 5
RAID 10
LVM
LVM架构
在多个物理设备间重新组织文件系统
- 将设备指定成物理卷
- 用一个或多个物理卷来创建一个卷组
- 物理卷是用固定大小的物理区域(PE)来定义的
- 在物理卷上创建逻辑卷
-
在逻辑卷上创建文件系统
pv管理工具
- 显示pv信息
- pvs:简要显示pv信息
- pvdisplay
- 创建pv
- pvcreate /dev/DEVICE
- 删除pv
- pvremove /dev/DEVICE
vg管理工具
- 显示卷组
- vgs
- vgdisplay
- 创建卷组
- vgcreate [-s #[kKmMgGtTpPEE]] volume_group_name physicalDevicePath1 [pyhsicalDevicePath2...]
- 管理卷组
- vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
- vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
- 删除卷组
- 先做pvmove,再做vgremove
lv管理工具
- 显示逻辑卷
- lvs
- lvdisplay
- 创建逻辑卷
- lvcreate -L #[mMgGtT] -n NAME VolumeGroup
- lvcreate -l 60%VG -n NAME VolumeGroup
- lvcreate -l 100%FREE -n NAME VolumeGroup
- 删除逻辑卷
- lvremove /dev/VG_NAME/LV_NAME
- 重设文件系统大小
- fsadm [options] resize device [new_size[BKMGTEP]]
- resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
- xfs_growfs /mount_point
场景
创建逻辑卷
- 创建物理卷 pvcreate /dev/sda3
- 为卷组分配物理卷 vgcreate vg0 /dev/sda3
- 从卷组创建逻辑卷
- lvcreate -L 256M -n data vg0
- mkfs.xfs
- 挂载 mount /dev/vg0/data /mnt/data
lv的扩容和缩容
- 扩展逻辑卷
- lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
- resize2fs /dev/VG_NAME/LV_NAME
- lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
- 缩减逻辑卷
- 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
跨主机迁移卷组
源计算机
- umount所有卷组上的逻辑卷
- 禁用卷组
- vgchange -a n vg0
- lvdisplay
- 导出卷组
- vgexport vg0
- pvscan
- vgdisplay
- 拆下硬盘
目标计算机
- 安装硬盘,导入卷组
- vgimport vg0
- 启用卷组
- vgchange -ay vg0
- mount所有卷组上的逻辑卷
lvm快照
- 为现有逻辑卷创建快照
- lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data
- 挂载快照
- mkdir -p /mnt/snap
- mount -o ro /dev/vg0/data-snapshot /mnt/snap
- 恢复快照
- umount /dev/vg0/data-snapshot
- umount /dev/vg0/data
- lvconvert --merge /dev/vg0/data-snapshot
-
删除快照
umount /mnt/databackup
lvremove /dev/vg0/databackup