磁盘管理
分区
分区是为了便于数据分门别类的存储;分区有两种方式
MBR:主引导记录,用来找到磁盘上的操作系统, 并且引导启动(0磁道,1扇区,512字节
GPT:新型的分区表 支持分配128个主分区。
添加一个硬盘(20G)
热添加刷新磁盘
echo '- - -' > /sys/class/scsi_host/host0/scan
echo '- - -' > /sys/class/scsi_host/host1/scan
echo '- - -' > /sys/class/scsi_host/host2/scan
root@localhost ~]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb
建立分区
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 20973567 5242880 83 Linux
/dev/sdb3 20973568 31459327 5242880 83 Linux
/dev/sdb4 31459328 39847935 4194304 83 Linux
格式化类型
[root@localhost ~]# mkfs
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
[root@localhost ~]# mkfs
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkfs.xfs /dev/sdb3
[root@localhost ~]# mkfs.xfs /dev/sdb4
gdisk分区
gdisk 支持分配大于查看当前设备
对设备进行分区
分区命令
?:显示帮助
n:创建新分区
p:打印分区
w:保存分区q:退出 默认会以GPT的格式分区
一般企业都可以不用分区直直接挂载使用 当然也是可以分区 不过gdisk 没有扩展分区
[root@localhost ~]# mount -t xfs /dev/sdc data2/
mkfs 格式化系统
-b :设定数据区块占用空间大小,目前支持1024,2048,4096,byte每个 块
-t : 用来指定什么类型的文件系统,可以是ext4,xfs
1.分区工具,可以针对整块磁盘,或者单个分区进行格式化操作
2一般情况下建议,不要直接格式化使用整磁盘, 要分区后再格式化,头部有预留空间
mkfs -t ext4 /dev/sdb1 == mkfs.ext4 /dev/sdb1
3.使用mkfs命令指定一个数据块的大小 4096字节=4k 一般默认也是4字节
[root@localhost ~]# mkfs.xfs -b size=4096 /dev/sdb2 -f
挂载管理
挂载:
临时:mount -t xfs /dev/sdb1 /data
永久:变更配置; /etc/fstab 关机后,在开机,会自动装载配置文件中的挂载点;
umount: 当我们断开磁盘和文件之间的挂载点时挂载点的文件会恢复成原来的状态
因为当我们在向挂载点写入数据的时候其实 是分区所对应的磁盘写入数据
-t 指定文件系统挂载分区
-a 检查并且挂载/etc/fstab 配置文件中未挂载的设备
-o 指定挂载参数ro rw
挂载成只读
[root@localhost ~]# mount -t xfs -o ro /dev/sdc dbc/
[root@localhost ~]# touch dbc/2.txt
touch: cannot touch ‘dbc/2.txt’: Read-only file system
卸载umount
-l 强制卸载
[root@localhost dbc]# pwd
/root/dbc
[root@localhost dbc]# umount ./ -l
永久挂载
配置/etc/fstab
配置文件规范; 设备名称| 挂载入口目录| 文件系统类型|挂载参数|是否备份|是否检查
获取设备名称,或者获取设备UUID
手动临时挂载测试
写入/etc/fstab 配置文件
使用mount -a 检查是否存在错误
获取设备名称 或设备的UUID
[root@localhost dbc]# blkid | grep 'sda1' | awk -F '"' '{print $2}'
c50bae73-0ef7-4369-bba3-07e8fbb7a3f0
手动挂载测试
[root@localhost ~]# mount UUID="c50bae73-0ef7-4369-bba3-07e8fbb7a3f0" ~/sda1
手动编入/etc/fstab
检查下是否fstab文件是否配置有问题
mount -a
fstab文件参数详解
配置文件格式
第一列:指定需要挂载的设备 设备名称: /dev/sdb1 设备ID: UUID
第二列:挂载的入口目录
第三列:文件系统类型
xfs类型
ext4类型
第四列:挂载参数
async/sync :使用同步或异步方式存储数据; 默认async
user/nouser :是否允许普通用户使用mount 命令挂载。默认nouser
exec/noexe :是否允许可执行文件执行。默认exec
suid/nosuid :是否允许存在suid 属性的文件。默认suid
auto/noauto :执行 命令时,此文件
系统是否被主动挂载。默认auto
rw/ro :是否以只读或者读写模式进行挂载。默人rw
defaults :具有rw,suid,dev,exec,auto,nouser,async 等参数;
第五列:是否要备份磁盘
0:不做备份
1:每天进行备份操作
2:不定日期的进行备份操作
第六列: 开机是否检验扇区
0:不要检验磁盘是否有坏道
1:检验
2:校验 (当1级别检验完成之后进行2级别检验
虚拟磁盘SWAP
swap 分区在系统的物理内存不够时,将硬盘中的一部分空间供当前运行的程序使用。
查看swap分区大小
root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 846 130 497 6 219 544
Swap: 2047 0 2047
新建swap
[root@localhost ~]# mkswap /dev/sdb3
Setting up swapspace version 1, size = 1000 KiB
no label, UUID=d97ab089-85b5-4e0d-a07c-026320614dbf
扩展swap分区
扩展swap 分区,使用 swapon命令
swapon device :将某个磁盘大小添加到swap分区中
swapon -a :添加所有swap分区
[root@localhost ~]# swapon /dev/sdb3
文件系统
Windows : FAT32、NTFS
Linux : EXT2、EXT3、EXT4、XFS、VFAT、NTFS-3g
磁盘被划分为两大存储区域,一类是存储元数据
inode ,一类是存储真实数据data block
data 划分了很多data block ,每个block 块为4k 如下图所示:磁盘在存储文件时,至少占用一个 inode 、与一个block
文件删除原理
首先删除目录下的文件名称,然后将inode、 block 的bitmap 状态修改为可用状态,但文件并没有真正的被删除,还有恢复的可能性,而一旦有新的数据写入,将其覆盖,数据才算真正的删除
文件移动原理
仅仅将文件名称从一个目录移动到另一个目录下面,并不会修改其inode 和block ;
文件系统故障修复
在LINUX系统中,为了增加系统性能,通常系统会将一些数据先写入内存中,然后在刷新至磁盘中;万一公司服务器突然断电或者其他未知原因,再次启动后,会造成文件系统错误;
模拟下断电的场景
mount /dev/sdc1 /mnt/
echo "hello" > /mnt/1.txt
dd if=/dev/zero of=/dev/sdc1 bs=300M count=1
umount /mnt
mount /dev/sdb
然后该文件就锁着主了不能挂载
root@localhost ~]# mount /dev/sdc1 /mnt/
mount: /dev/sdc1 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'
解决办法 :
修复文件系统
[root@localhost ~]# xfs_repair /dev/sdc1
不行得话就强制修复
[root@localhost ~]# xfs_repair -L /dev/sdc1
再不行那就得找数据恢复公司去做硬件修复了
显然我这儿又行了/mnt 能正常挂载
但是里面的数据没了
root@localhost ~]# ls /mnt/
[root@localhost ~]#
Inode满了导致磁盘空间不足但是实际还有空间
磁盘满了;会提示错误;无法写入数据;
磁盘没有满,但还是提示磁盘空间不足—> Inode满了造成的问题:
一个文件,至少占用1个inode、1个block块;
模拟下场景
创建一个虚拟的文件,大约100m 格式为xfs
[root@localhost ~]# dd if=/dev/zero of=/opt/bigdag bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 0.779595 s, 135 MB/s
创建目录,挂载
mdkir /new
mount /tmp/bigdag /new/
df -h | grep new
df -i | grep new
cd /new/
touch {1..100000}.txt
df -i | grep new
df -h | grep new
显示还/new/空间没满
我们再往里写入数据
写入不了空间不足
[root@localhost new]# touch xxxx /new/
touch: cannot touch ‘xxxx’: No space left on device
[root@localhost new]# df -i /new/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop0 153664 153664 0 100% /new