笔记·存储&文件系统
管理分区:
#lsblk #列出块设备
#fdisk #管理MBR分区
#gdisk #管理GPT分区
#parted #高级分区操作,可以是交互或非交互方式
#partprobe #刷新分区表
parted命令:
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 (默认M)
parted /dev/sdb rm 1
parted -l 列出所有硬盘分区信息 fdisk和gdisk命令:
fdisk -l [-u] [device...] 查看分区
fdisk [device...] 管理MBR分区
gdisk [device...] 类fdisk 的GPT分区工具
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出
#cat /proc/partations #查看系统当前识别到的分区
管理文件系统:
mkfs.FS_TYPE /dev/DEVICE
mkfs -t FS_TYPE /dev/DEVICE
-t {ext2|ext3|ext4|xfs} #指定文件系统类型
-b {1024|2048|4096} #指定块 block 大小
-L ‘LABEL’ #设置卷标
-j 相当于 -t ext3, mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i #数据空间中每多少个字节创建一个inode;不应该小于block大小
-N #指定分区中创建多少个inode
-I #一个inode记录占用的磁盘空间大小,128---4096
-m #默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...] #启用指定特性
-O ^FEATURE #关闭指定特性
#blkid #可以查看块设备属性信息
#findfs #查找分区
#tune2fs #重新设定ext系列文件系统可调整参数的值
-l #查看指定文件系统超级块信息;super block
-L 'LABEL' #修改卷标
-m #修预留给管理员的空间百分比
-j #将ext2升级为ext3
-O #文件系统属性启用或禁用, -O ^has_journal
-o #调整文件系统的默认挂载选项,-o ^acl
-U UUID #修改UUID号
#dumpe2fs #显示ext文件系统信息,将磁盘块分组管理
#xfs_info #显示示挂载或已挂载的 xfs 文件系统信息
#fsck.FS_TYPE #修复文件系统
#fsck -t FS_TYPE
-a 自动修复
-r 交互式修复错误
#e2fsck #ext系列文件专用的检测修复工具
-y 自动回答为yes
-f 强制修复
-p 自动进行安全的修复文件系统问题
#xfs_repair #xfs文件系统专用检测修复工具
-f 修复文件,而设备
-n 只检查
-d 允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot
挂载设备
#mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint
-t fstype 指定要挂载的设备上的文件系统类型,如:ext4,xfs
-r readonly,只读挂载
-w read and write, 读写挂载,此为默认设置,可省略
-n 不更新/etc/mtab,mount不可见
-a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上
-o options:(挂载文件系统的选项),多个选项使用逗号分隔
async 异步模式,内存更改时,写入缓存区buffer,过一段时间再写到磁盘中,效率高,但不安全
sync 同步模式,内存更改时,同时写磁盘,安全,但效率低下
atime/noatime 包含目录和文件
diratime/nodiratime 目录的访问时间戳
auto/noauto 是否支持开机自动挂载,是否支持-a选项
exec/noexec 是否支持将文件系统上运行应用程序
dev/nodev 是否支持在此文件系统上使用设备文件
suid/nosuid 是否支持suid和sgid权限
remount 重新挂载
ro/rw 只读、读写
user/nouser 是否允许普通用户挂载此设备,/etc/fstab使用
acl/noacl 启用此文件系统上的acl功能
loop 使用loop设备
_netdev 当网络可用时才对网络资源进行挂载,如:NFS文件系统
defaults 相当于rw, suid, dev, exec, auto, nouser, async
*一个挂载点同一时间只能挂载一个设备
*一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
*一个设备可以同时挂载到多个挂载点
*通常挂载点一般是已存在空的目录
#umount 设备名|挂载点
#mount #通过查看/etc/mtab文件显示当前已挂载的所有设备
#cat /proc/mounts #查看内核追踪到的已挂载的所有设备
#findmnt MOUNT_POINT|device #查看挂载点情况
#lsof MOUNT_POINT
#fuser -v MOUNT_POINT #查看正在访问指定文件系统的进程
#fuser -km MOUNT_POINT #终止所有在正访问指定的文件系统的进程
管理swap空间
#swapon [OPTION]... [DEVICE]
-a:激活所有的交换分区
-p PRIORITY:指定优先级,也可在/etc/fstab 在第4列指定:pri=value
#echo -e 'n\np\n\n\n+2G\nt\n82\nw\n' | fdisk /dev/sdc #非交互式创建分区
#mkswap /dev/sdc1
#swapoff [OPTION]... [DEVICE]
磁盘常见工具
df [OPTION]... [FILE]... #文件系统空间实际真正占用等信息的查看工具
-H 以10为单位
-T 文件系统类型
-h human-readable
-i inodes instead of blocks
-P 以Posix兼容的格式输出
du [OPTION]... DIR #显示指定目录下面各个子目录的大小,单位为KB
-h human-readable
-s summary
--max-depth=# 指定最大目录层级
-x, --one-file-system #忽略不在同一个文件系统的目录
dd 命令:convert and copy a file
#dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
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个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 复制n个bs
conv=conversion[,conversion...] 用指定的参数转换文件
conversion 转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync 写完成前,物理写入输出文件
范例:
#dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1 #备份MBR
#dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446 #破坏MBR中的bootloader
#dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc #有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes
dd if=/dev/sdx of=/dev/sdy #将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image #将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz #备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/path/to/image of=/dev/sdx #将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx #将压缩的备份文件恢复到指定盘
dd if=/dev/mem of=/root/mem.bin bs=1024 #将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/cdrom of=/root/cdrom.iso #拷贝光盘数据到root文件夹下,并保存为cdrom.iso文件
dd if=/dev/urandom of=/dev/sda1 #销毁磁盘数据
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 #通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 #测试硬盘写速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null #测试硬盘读速度
RAID管理
mdadm [mode] <raiddevice> [options] <component-devices>
模式:
创建:-C
装配:-A
监控:-F
管理:-f, -r, -a
<raiddevice>: /dev/md#
<component-devices>: 任意块设备
-C: 创建模式
-n #: 使用#个块设备来创建此RAID
-l #:指明要创建的RAID的级别
-a {yes|no}:自动创建目标RAID设备的设备文件
-c CHUNK_SIZE: 指明块大小,单位k
-x #: 指明空闲盘的个数
-D:显示raid的详细信息
mdadm -D /dev/md#
管理模式:
-f: 标记指定磁盘为损坏
-a: 添加磁盘
-r: 移除磁盘
观察md的状态: cat /proc/mdstat
范例:
#使用mdadm创建并定义RAID设备 mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1
#用文件系统对每个RAID设备进行格式化 mkfs.xfs /dev/md0
#使用mdadm检查RAID设备的状况 mdadm --detail|D /dev/md0
#增加新的成员 mdadm -G /dev/md0 -n4 -a /dev/sdf1
#模拟磁盘故障 mdadm /dev/md0 -f /dev/sda1
#移除磁盘 mdadm /dev/md0 -r /dev/sda1
#在备用驱动器上重建分区 mdadm /dev/md0 -a /dev/sda1
#系统日志信息 cat /proc/
#生成配置文件: mdadm -D -s >> /etc/mdadm.conf
#停止设备: mdadm -S /dev/md0
#激活设备: mdadm -A -s /dev/md0
#强制启动: mdadm -R /dev/md0
#删除raid信息: mdadm --zero-superblock /dev/sdb1
LVM管理
pv管理工具:
#pvs #简要pv信息显示
#pvcreate /dev/DEVICE #创建pv
#pvremove /dev/DEVICE #删除pv
vg管理工具:
#vgs #显示卷组
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
#vgcreate -s 16M vg0 /dev/sdb /dev/sdc #指定PE的大小,默认4M
#vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] #扩容vg
#vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] #缩容vg
删除卷组:先做pvmove,再做vgremove。
lv管理工具:
#lvs #显示逻辑卷
#lvcreate -L #[mMgGtT] -n NAME VolumeGroup #创建lv
#lvcreate -l 60%VG -n mylv testvg
#lvcreate -l 100%FREE -n yourlv testvg
#lvremove /dev/VG_NAME/LV_NAME #删除lv
重设文件系统大小:
#fsadm [options] resize device [new_size[BKMGTEP]]
#resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
#xfs_growfs /mountpoint
范例:
#创建物理卷 #pvcreate /dev/sda3
#为卷组分配物理卷 #vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷 #lvcreate -L 256M -n data vg0
扩展逻辑卷:
#两步实现
#第一步实现逻辑卷的空间扩展 #lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT
#一步实现容间和文件系统的扩展
#lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
缩减逻辑卷:缩减有数据损坏的风险,建议先备份再缩减,xfs文件系统不支持缩减
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 /dev/VG_NAME/LV_NAME mountpoint
缩减XFS文件系统的逻辑卷:
#因为XFS文件系统不支持缩减,可以用下面方式缩减
#先备份XFS文件系统数据 #yum -y install xfsdump
#备份/data挂载点对应的逻辑卷
#注意挂载点后面不要加/,否则会出错: #xfsdump -f data.img /data
#卸载文件系统 #umount /data
#缩减逻辑卷 #lvreduce -L 10G /dev/vg0/lv0
#重新创建文件系统 #mkfs.xfs -f /dev/vg0/lv0
#重新挂载 #mount /dev/vg0/lv0 /data
#还原数据 #xfsrestore -f data.img /data
跨主机迁移卷组:
1 在旧系统中,umount 所有卷组上的逻辑卷
2 禁用卷组
vgchange -a n vg0
lvdisplay
3 导出卷组
vgexport vg0
pvscan
vgdisplay
4 拆下旧硬盘在目标计算机上,并导入卷组:
vgimport vg0
5 启用
vgchange -ay vg0
6 mount 所有卷组上的逻辑卷
LVM快照
mkfs.xfs /dev/vg0/data
mount /dev/vg0/data/ /mnt/data
#为现有逻辑卷创建快照,注意ext4必须使用-p r 实现只读
lvcreate -l 64 -s -n data-snapshot /dev/vg0/data
#挂载快照,xfs注意要使用-o ro实现只读,访止快照被修改
mkdir -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot /mnt/snap
#恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
#删除快照
umount /mnt/snap
lvremove /dev/vg0/data-snapshot