计算机硬盘
-
硬盘是计算机主要媒介之一,由一个或多个铝制或者玻璃制的碟片组成,碟片外覆盖有铁磁性材料,硬盘内部由磁道、柱面、扇区、磁头等部件组成
- Linux系统中硬件设备相关配置文件存放在/dev下,常见硬盘命名为/dev/hda、/dev/sda、/dev/sdb、/dev/sdc、/dev/vda.不同硬盘接口,在系统中识别的设备名称不一样
- IDE硬盘接口在Linux中设备名为/dev/hda,SAS、SCSI、SATA硬盘接口在Liunx设备名为sda,高效云盘硬盘接口会识别为/dev/vda等
- 硬盘的最小存储单位叫作sector(扇区),每个sector存储512字节,操作系统在读取硬盘的时候,不会逐个sector地去读取,这样效率非常低,为了提升效率,操作系统会一次性连续读取多个sector,即一次性读取多个sector称为block(块)
- 由多个sector组成的block是文件存取的最小单位.block的大小常见的有1KB、2KB、4KB,在Linux中常设置为4KB,即连续8个sector组成一个block
- /boot分区的block一般为1KB,而/data分区或者/分区的block为4KB
# 查看block和inode大小
[root@ali ~]# dumpe2fs /dev/vda1|grep "Block size"
dumpe2fs 1.42.9 (28-Dec-2013)
Block size: 4096
[root@ali ~]# tune2fs -l /dev/vda1|grep "Block size"
Block size: 4096
[root@ali ~]# tune2fs -l /dev/vda1|grep "Inode size"
Inode size: 256
[root@lianxi ~]# stat /boot/|grep "IO Block"
Size: 4096 Blocks: 8 IO Block: 4096 directory
- 创建一个普通10B大小的文件,系统默认设置block为4KB,如果有一万个小文件,由于每个block只能存放一个文件,如果文件的大小比block大,会申请更多的block.相反如果文件的大小比默认block小,仍会占用一个block,这样剩余的空间会被浪费掉
硬盘block及inode
- 操作系统对于文件数据的存放包括两个部分:一是文件内容;二是权限及文件属性.操作系统文件存放是基于文件系统,文件系统会将文件的实际内容存储到block中,而将权限与属性等信息存放至inode中
- 在硬盘分区中,还有一个超级区块(superblock),superblock会记录整个文件系统的整体信息,包括inode、block的总量、使用大小、剩余大小等信息.每个inode与block都有编号对应,方便Linux系统快速定位查找文件
- superblock:记录文件系统的整体信息,包括inode与block的总量、使用大小、剩余大小以及文件系统的格式与相关信息
- block:存储文件的内容,如果文件超过默认block大小,会自动占用多个block
- inode:记录文件的属性、权限,同时会记录该文件的数据所在的block编号
- 每个inode与block都有编号,而每个文件都会占用一个inode,inode内则有文件数据放置的block号码.如果能够找到文件的inode,就可以找到该文件所放置数据的block号码,从而读取该文件内容
- 操作系统进行格式化分区时,操作系统自动将硬盘分成两个区域.一个是数据区,用于存放文件数据,另一个是inode table区,用于存放inode包含的元信息
- inode默认为128KB或256KB,/boot分区inode默认为128KB,其他分区默认为256KB
# 查看Linux系统inode方法
dumpe2fs /dev/vda1|grep "Inode size"
tune2fs -l /dev/vda1|grep "Inode size"
stat /boot/|grep "Inode"
#格式化磁盘时,可以指定inode个block的大小;-b指定默认block,-I指定默认inode值
mkfs.ext4 -b 4096 -I 256 /dev/sdb
硬链接
- 一般情况下,文件名和inode编号是一一对应的关系,每个inode号码对应一个文件名,但UNIX/Linux系统多个文件名也可以指向同一个inode号码.这意味着可以用不同的文件名访问通用的内容,对文件内容进行修改,会影响到所有文件名.但删除一个文件名,不影响另一个文件名的访问.这种情况称为硬链接(hard link)
# 创建硬链接
ln test1.txt test2.txt
# test1.txt为源文件 test2.txt为目标文件
[root@lianxi tmp]# ll -i
total 0
67193826 -rw-r--r--. 1 root root 0 May 23 2020 music.txt.bak
68075908 -rw-r--r--. 2 root root 0 Feb 8 16:17 test1.txt
68075908 -rw-r--r--. 2 root root 0 Feb 8 16:17 test2.txt
- 实用技巧:硬链接不能跨分区链接,硬链接只能对文件生效,对目录无效,也即是目录不能创建硬链接.硬链接源文件与目标文件公用一个inode值,从某种意义上来说,节省inode空间.不管是单独删除源文件还是删除目标文件,文件内容始终存在.链接后的文件不占用系统多余的空间
软链接
- 文件1和文件3的inode虽然不同,但是文件3的内容是文件1的路径.读取文件3时,系统会自动将访问者导向文件1.
- 无论打开哪一个文件,最终读取的文件都是文件1.这时,文件3就称为文件1的软链接(soft link)或者符号链接(symbolic link)
[root@lianxi tmp]# ln -s test1.txt test3.txt
[root@lianxi tmp]# ll -i
total 0
67193826 -rw-r--r--. 1 root root 0 May 23 2020 music.txt.bak
68075908 -rw-r--r--. 2 root root 0 Feb 8 16:17 test1.txt
68075908 -rw-r--r--. 2 root root 0 Feb 8 16:17 test2.txt
67193825 lrwxrwxrwx. 1 root root 9 Feb 8 16:25 test3.txt -> test1.txt
- 实用技巧:软链接可以跨分区链接,软链接支持目录同时也支持文件的链接.软链接文件与目标文件inode不同,从某种意义上说,会消耗更多的inode空间.不管是删除源文件还是重启系统,该软链接还存在,但是文件内容会丢失,一旦新建源同名文件,软链接文件恢复正常
Linux下磁盘实战操作
-
由于磁盘空间不足,需添加新硬盘,新添加的硬盘需要经过格式化、分区才能被Linux系统所使用.操作流程如下:
- 1.检测Linux系统识别的硬盘设备,新添加硬盘会被识别为/dev/sdb,如果有多块硬盘会被识别为/dev/sdc、/dev/sdd等设备名称
- 2.基于新硬盘/dev/sdb设备,创建磁盘分区/dev/sdb1
- 3.fdisk分区命令参数如下,常见参数包括m、n、p、d、w
- b:编辑bsd disklabel(磁盘标签)
- c:切换dos兼容性标志
- d:删除一个分区
- g:创建一个新的空GPT分区表
- G:创建一个IRIX(SGI)分区表
- l:列出已知的分区类型
- m:打印帮助菜单
- n:添加一个新分区
- o:创建一个新的空DOS分区表
- p:打印分区表信息
- q:退出不保存
- s:创建一个新的空sun磁盘标签
- t:更改分区的系统ID
- u:更改显示/输入单元
- v:验证分区表
- w:将分区表写入磁盘并退出
- x:额外功能
- 4.创建/dev/sdb1分区方法,执行fdisk /dev/sdb,然后按屏幕提示一次输入n、p、1,按Enter键,再输入+10G,按Enter键,输入w,最后执行fdisk -l查找磁盘信息
- 5.mkfs.ext4 /dev/sdb1 格式化磁盘分区
- 6./dev/sdb1 分区格式化,使用mount命令挂载到/data目录,命令详解为
- mkdir -p /data:创建/data数据目录
- mount /dev/sdb1 /data:挂载/dev/sdb1分区至/data目录
- df -h:查看磁盘分区详情
- echo "mount /dev/sdb1 /data" >> /etc/rc.local:将挂载分区命令加入/etc/rc.local开机启动
- 7.自动挂载分区除了可以加到/etc/rc.local开机启动之外,还可以加到/etc/fstab文件中
mount -o rw,remount /
# 表示重新挂载/系统,检测/etc/fstab是否有误
基于GPT格式磁盘分区
- MBR分区标准决定了MBR只支持在2TB以下的硬盘分区,为了能支持使用大于2TB硬盘空间,需使用GPT格式进行分区.创建大于2TB的分区,需使用parted工具
- 基于GPT格式对10TB硬盘进行分区,操作如下:
- parted -s /dev/sdc mklabel gpt:设置分区类型为gpt格式
- mkfs.ext3 /dev/sdc:基于ext3文件系统类型格式化
- mount /dec/sdc /data:挂载/dev/sdc设备至/data
- 假设/dev/sdc为10TB硬盘,使用GPT格式来格式化磁盘
- 执行命令parted -s /dev/sdc mklabel gpt
- 基于mkfs.ext3 /dev/sdc格式化磁盘,parted命令行也可以进行分区,依次输入如下命令:
- parted→select /dev/sdc→mklabel gpt→mkpart primary 0 -1→print
- mkfs.ext3 /dev/sdc
- mount /dev/sdc1 /data
mount命令
- mount命令工具主要用于将设备或者分区挂载至Linux系统目录下,Linux系统在分区时,基于mount机制将/dev/sda分区挂载至系统目录,将设备与目录挂载之后,Linux系统方可进行文件的读取和存储
参数选项 | 解释说明 |
---|---|
-V | 显示mount工具版本号 |
-l | 显示已加载的文件系统列表 |
-h | 显示帮助信息并退出 |
-v | 输出指令执行的详细信息 |
-n | 加载没有写入文件/etc/mtab中的文件系统 |
-r | 将文件系统加载为只读模式 |
-a | 加载文件/etc/fstab中配置的所有文件系统 |
-o | 指定mount挂载扩展参数,常见扩展指令rw、remount、loop等 |
-o atime | 系统在每次读取文档时更新文档时间 |
-o noatime | 系统在每次读取文档时不更新文档时间 |
-o defaults | 使用预设的选项rw,suid,dev,exec,auto,nouser等 |
-o exec | 运行执行档被执行 |
-o user、-o nouser | 使用者可以执行mount/umount的动作 |
-o remount | 将已挂载的系统分区重新以其他模式再次挂载 |
-o ro | 只读模式挂载 |
-o rw | 可读可写模式挂载 |
-o loop | 使用loop模式,把文件当成设备挂载至系统目录 |
-t | 指定mount挂载设备类型,常见类型有nfs、ntfs-3g、vfat、iso9660等,如下面: |
iso9660 | 光盘或光盘镜像 |
msods | Fat16文件系统 |
vfat | Fat32文件系统 |
ntfs | ntfs文件系统 |
ntfs-3g | 识别移动硬盘格式 |
smbfs | 挂载Windows文件网络共享 |
nfs | UNIX/Linux文件网络共享 |
mount /dev/sdb1 /data # 挂载/dev/sdb1分区至/data目录
mount /dev/cdrom /mnt # 挂载/dev/cdrom分区至/mnt目录
mount -t ntfs-3g /dev/sdc /data1 # 挂载/dev/sdc移动硬盘至/data1目录
mount -p remount,rw / # 重新以读写模式挂载/系统
mount -t iso9660 -o loop centos7.iso /mnt # 将Centos7.iso镜像文件挂载至/mnt目录
mount -t fat32 /dev/sdd1 /mnt # 将U盘/dev/sdd1挂载至/mnt目录
mount -t nfs 192.168.1.11:/data /mnt # 将远程192.168.1.11:/data目录挂载至本地mnt目录
Linux硬盘故障修复
操作系统的分区变成只读文件系统,错误提示为Read-only file system.出现只读文件系统会导致只能读取而无法写入新文件、新数据等操作
造成该问题的原因包括:磁盘老旧长期大量的读写、文件系统文件被破坏、磁盘碎片文件、异常断电、读写终端等
-
修复步骤:
- 远程备份本地其他重要数据,出现只读文件系统,需先备份其他重要数据,基于rsync|scp远程备份,其中/data为源目录,/data/backup/2020为目标备份目录
rsync -av /data root@192.168.1.11:/data/backup/2020
- 可以重新挂载/系统,挂载命令如下,测试文件系统是否可以读写
mount -o remount,rw /
- 如果重新挂载/系统无法解决问题,则重启CD/DVD光盘引导进入Linux Rescue修复模式.光标选择Troubleshooting,按Enter键,然后选择Rescue a CentOS system,按Enter键
- 选择1)"continue"继续操作
- 进入修复模式,执行chroot /mnt/sysimage ,df -h显示原来的文件系统
chroot /mnt/sysimage df -h
- 对异常的分区进行检测并修复,根据文件系统类型执行
umount /dev/sda3 fsck.ext4 /dev/sda3 -y
- 修复完成后重启系统
reboot