磁盘和文件系统

硬盘

设备文件

  1. 设备类型
  • 块设备:block,存取单位“块”,磁盘
  • 字符设备:char,存取单位“字符”,键盘
  1. 设备文件/dev/DEV_FILE:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信
  2. 设备号码
  • 主设备号: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. 为固态硬盘

分区

从磁盘到可以使用的文件系统的步骤

  1. 设备识别
    echo '- - -' > /sys/class/scsi_host/host[0|2]/scan
  2. 设备分区
  3. 创建文件系统
  4. 标记文件系统
  5. 在/etc/fstab文件中创建条目
  6. 挂载新的文件系统

MBR分区

  1. 分区不超过2T
  2. layout
  • 0磁道0扇区:512bytes
  • 446 bytes:boot loader
  • 64 bytes:分区表,每16bytes标识一个分区
  • 2 bytes:55AA 分区头结尾标识
  1. 一块硬盘至多能分4各主分区,也可以3各主分区+1扩展分区(N各逻辑分区)


    image.png
# 查看磁盘分区头部信息
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分区

  1. 支持128个分区,最大8Z(512B/block)或64Z(4096B/block)空间
  2. 使用128位UUID表示磁盘和分区
  3. GPT分区表自动备份在头和尾两份,并由CRC校验位
  4. UFEI


    image.png
#生成UUID
uuidgen

管理分区

列出块设备

lsblk from package util-linux-2.23.2-63.el7.x86_64

创建分区使用
  1. fdisk mbr分区
  2. gdisk GPT分区
    3.parted 高级分区操作

重新设置内存中的内核分区表

partprobe

同步分区表
  1. 查看内核是否已经识别新的分区
    cat /proc/partitions
  2. centos6
  • 新增分区
    partx -a /dev/DEVICE
  • 删除分区
    partx -d --nr M-N /dev/DEVICE
  1. centos7
    partprobe /dev/DEVICE

文件系统

在存储设备上组织文件的方法,操作系统负责管理和存储文件信息的软件结构称为文件系统,查看内核支持的文件系统:ls /lib/modules/uname -r/kernel/fs

文件系统的类型

  1. linux:ext2, ext3, ext4, xfs, btrfs
  2. windows: FAT32, NTFS, exFAT
  3. Unix: FFS, UFS, JFS2
  4. 光盘:iso9660
  5. 网络文件系统:NFS, CIFS
  6. 集群文件系统:GFS2, OCFS2
  7. 分布式文件系统:fastfs, ceph, moosefs, glusterfs, Lustre
  8. RAW: 未经处理或者未经格式化产生的文件系统

文件系统分类

  1. 根据是否支持“journal”功能
  • 日志型:ext3,ext4,xfs,...
  • 非日志型: ext2, vfat

文件系统的组成部分

  1. 内核中的模块:ext4,xfs,vft
  2. 用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat

linux虚拟文件系统 VFS

VFS.png

查看当前OS支持文件系统:

cat /proc/filesystems

文件系统管理

创建文件系统
  1. mkfs.FS_TYPE /dev/DEVICE
  2. mkfs -t FS_TYPE /dev/DEVICE -L 'LABEL'
  • FS_TYPE:ext4, xfs, brrfs, vfat
  1. 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 关闭指定特性
文件系统的标签

指向设备的另一种方法,于设备无关

  1. blkid [option]...[device]
    -U UUID:根据UUID来查找对应的设备
    -L LABEL:根据LABEL来查找对应的设备
  2. e2label: 管理ext系列文件系统的label
  • e2label DEVICE [:ABEL]
  1. findfs 查找分区
  • findfs [options] LABEL=
  • findfs [options] UUID=
修改文件系统的参数
  1. tune2fs only for ext系列
options comments
-l 查看指定文件系统超级块信息super block
-L 'LABEL' 修改卷标
-m # 修改预留给管理员的空间百分比
-j 将ext2升级至ext3
-O 文件系统属性启用或禁用
-o 调整文件系统默认挂载选项 -o ^acl
-U UUID 修改UUID号
  1. dumpe2fs:显示ext文件系统信息,将磁盘块分组管理
  • -h:查看超级块信息,不显示分组信息
  1. xfs_info:显示已挂载的xfs文件系统信息
  • xfs_info mountpoint
# 查看文件系统类型
blkid

# 查看文件系统超级块信息
tune2fs -l /dev/sda2
dumpe2fs /dev/sda2
超级块和inode table
image.png
文件系统检测和修复
  1. 故障特征
    文件系统故障一般发生在死机或非正常关机之后,挂载的文件系统被标记为"no clean"
  2. NOTE: 一定不要在挂载状态下执行修复命令
  3. 修复
  • 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

  1. 挂载设备
device 挂载设备
设备文件 例如/dev/sda5
卷标 -L 'LABEL',例如-L 'MYDATA'
UUID -U 'UUID',例如-U ''0c50523c-43f1-45e785c0-a126711d406e
伪文件系统名称 proc, sysfs, devtmpfs, configfs
  1. 挂载点
  • 事先存在,建议空目录
  • 进程正在使用的设备无法被卸载
  1. 命令选项
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 查看内核追踪到的已挂载的所有设备
  1. -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 设备
  1. defaults:相当于rw, suid, dev, exec, auto, nouser, async

卸载

  1. 查看挂载情况
  • mount
  • find mnt MOUNT_POINT | DEVICE
  1. 查看正在访问指定文件系统的进程
  • lsof MOUNT_POINT
  • fuser -v MOUNT_POINT
  1. 终止所有正在访问指定文件系统的进程
  • 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

  1. 要挂载的设备或伪文件系统
  • 设备文件
  • LABEL=""
  • UUID=""
  • 伪文件系统:proc,sysfs
  1. 挂载点
  2. 文件系统类型:
  3. 挂载选项:defaults,acl,bind...
  4. 转储频率:0不备份;1每天转储;2每隔一天转储
  5. 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分区

基本设置
  1. 创建交换分区或者文件
  2. 使用mkswap 写入特殊签名
  3. 在/etc/fstab文件中添加适当的条目
  4. 使用swapon -a激活交换空间
启用swapon[OPTION]...[DEVICE]
  1. -a 激活所有交换分区
  2. -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

image.png

RAID 1

image.png

RAID 5

image.png

RAID 10

image.png

LVM

LVM架构

在多个物理设备间重新组织文件系统

  1. 将设备指定成物理卷
  2. 用一个或多个物理卷来创建一个卷组
  3. 物理卷是用固定大小的物理区域(PE)来定义的
  4. 在物理卷上创建逻辑卷
  5. 在逻辑卷上创建文件系统


    image.png

pv管理工具

  1. 显示pv信息
  • pvs:简要显示pv信息
  • pvdisplay
  1. 创建pv
  • pvcreate /dev/DEVICE
  1. 删除pv
  • pvremove /dev/DEVICE

vg管理工具

  1. 显示卷组
  • vgs
  • vgdisplay
  1. 创建卷组
  • vgcreate [-s #[kKmMgGtTpPEE]] volume_group_name physicalDevicePath1 [pyhsicalDevicePath2...]
  1. 管理卷组
  • vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  • vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  1. 删除卷组
  • 先做pvmove,再做vgremove

lv管理工具

  1. 显示逻辑卷
  • lvs
  • lvdisplay
  1. 创建逻辑卷
  • lvcreate -L #[mMgGtT] -n NAME VolumeGroup
  • lvcreate -l 60%VG -n NAME VolumeGroup
  • lvcreate -l 100%FREE -n NAME VolumeGroup
  1. 删除逻辑卷
  • lvremove /dev/VG_NAME/LV_NAME
  1. 重设文件系统大小
  • fsadm [options] resize device [new_size[BKMGTEP]]
  • resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
  • xfs_growfs /mount_point

场景

创建逻辑卷
  1. 创建物理卷 pvcreate /dev/sda3
  2. 为卷组分配物理卷 vgcreate vg0 /dev/sda3
  3. 从卷组创建逻辑卷
  • lvcreate -L 256M -n data vg0
  • mkfs.xfs
  1. 挂载 mount /dev/vg0/data /mnt/data
lv的扩容和缩容
  1. 扩展逻辑卷
  • lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
  • resize2fs /dev/VG_NAME/LV_NAME
  • lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
  1. 缩减逻辑卷
  • 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
跨主机迁移卷组
源计算机
  1. umount所有卷组上的逻辑卷
  2. 禁用卷组
  • vgchange -a n vg0
  • lvdisplay
  1. 导出卷组
  • vgexport vg0
  • pvscan
  • vgdisplay
  • 拆下硬盘
目标计算机
  1. 安装硬盘,导入卷组
  • vgimport vg0
  1. 启用卷组
  • vgchange -ay vg0
  1. mount所有卷组上的逻辑卷
lvm快照
  1. 为现有逻辑卷创建快照
  • lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data
  1. 挂载快照
  • mkdir -p /mnt/snap
  • mount -o ro /dev/vg0/data-snapshot /mnt/snap
  1. 恢复快照
  • umount /dev/vg0/data-snapshot
  • umount /dev/vg0/data
  • lvconvert --merge /dev/vg0/data-snapshot
  1. 删除快照
    umount /mnt/databackup
    lvremove /dev/vg0/databackup


    磁盘和文件系统.png

你可能感兴趣的:(磁盘和文件系统)