本文共 8814 字,大约阅读时间需要 29 分钟。
我们先讲什么是文件系统和需要的工具。
现在的存储种类众多、堆栈繁杂。但是用户直接的接口还是。对于Linux和开源社区而言,众多的软件也是依赖。比如MySQL和PostgreSQL数据库就是直接调用文件系统接口的,而不像Oracle数据库,能够越过文件系统层。
Linux系统上文件系统众多。但是比较常用的是和文件系统。当前使用比较普遍的是Ext4文件系统。
这里我们以Ext4文件系统为例。
关于工具的重要性我们就不絮叨了。解决启停问题,一定要有三大利器的辅助:快照、VNC和录屏工具。
关于这些工具,请参考。
修复启停时经常需要做chroot操作,即我们要在一个新的根文件系统内操作。但是,只执行chroot是不够的。我们还需要挂载/dev、/proc和/sys目录。这样才能使用在chroot后继续使用系统数据。
关于bind挂载,同样请参考有关章节。
损坏,是导致系统启动失败比较常见的原因。文件系统损坏,比较常见的原因是分区丢失和文件系统需要手工修复。
我们人为的破坏分区表信息。
我们先准备一个供测试的文件系统。具体操作如下
## 下面我们以第二块磁盘为例,并且假设其磁盘路径是/dev/vdb## 1. 检查新磁盘的情况fdisk -l -u /dev/vdb# 2. 新建分区fdisk /dev/vdb# 3. 创建文件系统mkfs.ext4 /dev/vdb1# 4. 配置系统启动挂载新建文件系统echo '/dev/vdb1 /opt ext4 defaults 0 2' >> /etc/fstab# 5. 重启系统以便验证配置符合预期reboot# 6. 验证挂载成功mount -l | egrep /dev/vdb1
先看准备文件系统的具体操作
[root@iz2ze122w6gewwurz1e637z ~]# fdisk -l -u /dev/vdb 1. 检查新磁盘的情况Disk /dev/vdb: 1099.5 GB, 1099511627776 bytes, 2147483648 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x00088bd9 Device Boot Start End Blocks Id System[root@iz2ze122w6gewwurz1e637z ~]# fdisk /dev/vdb # 2. 新建分区Welcome to fdisk (util-linux 2.23.2).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Command (m for help): nPartition type: p primary (0 primary, 0 extended, 4 free) e extendedSelect (default p): pPartition number (1-4, default 1): First sector (2048-2147483647, default 2048): Using default value 2048Last sector, +sectors or +size{K,M,G} (2048-2147483647, default 2147483647): Using default value 2147483647Partition 1 of type Linux and of size 1024 GiB is setCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@iz2ze122w6gewwurz1e637z ~]# mkfs.ext4 /dev/vdb1 # 3. 创建文件系统mke2fs 1.42.9 (28-Dec-2013)Filesystem label=OS type: LinuxBlock size=4096 (log=2)Fragment size=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks67108864 inodes, 268435200 blocks13421760 blocks (5.00%) reserved for the super userFirst data block=0Maximum filesystem blocks=24159191048192 block groups32768 blocks per group, 32768 fragments per group8192 inodes per groupSuperblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): doneWriting superblocks and filesystem accounting information: done [root@iz2ze122w6gewwurz1e637z ~]# echo '/dev/vdb1 /opt ext4 defaults 0 2' >> /etc/fstab # 4. 配置系统启动挂载新建文件系统
现在重启系统,验证挂载情况
可见挂载是成功的。
我们通过下面的方式测试下
# defaults -> default# 可以直接手工调整# 可以用eded -s /etc/fstab <
看下启动失败情况(后续的记录系统抱怨截图时的按键无法识别)。系统启动中断了
我们先把文件系统的挂载恢复正常,再手工破坏分区表进行测试
# 1. 卸载文件系统umount /dev/vdb1# 2. 检查分区情况fdisk -l -u /dev/vdb# 3. 直接使用fdisk来删除分区fdisk -u /dev/vdb# 4. 验证删除了分区fdisk -l -u /dev/vdb
操作示例如下
看下启动失败情况(系统启动过程止步不前,但是也没有明显的报错信息。所以录屏工具是有必要的)
因为当前实例启动失败,这种情况下在当前实例上,我们没有用shell来解决问题。所以,我们需要先解决在哪里来修复的问题。
解决这个问题的方案比较多,运维人员常见的手段是使用LiveCD。这里我们推荐使用快照的方式。具体使用请参考的有关信息。
这种情况只要把错误配置修改完毕即可解决问题,我们略过不谈。
分区表丢失,只要重新创建分区表即可。因为分区表信息只涉及变更磁盘上第1个扇区指定位置的内容。所以,只要确认有分区情况,在分区表丢失的情况下,重做分区是不会损坏磁盘上的数据的。但是分区起始位置和尺寸需要正确,否则不能解决问题。
分区的大小,因为大家(基本)都是一个磁盘分一个区,所以(几乎)不用考虑分区大小(从文件系统信息是可以计算分区大小的)。起始位置确定后,大小选择fdisk给出的就好。所以,问题的关键是如何确定分区的开始位置。
我们以常见的Ext文件系统为例,具体请参看。
重建分区可以按照下面的步骤来实现。
首先,我们需要先确认分区上的文件系统信息。这有多种方式:
我们看下直接检查文件系统魔数的例子,并用fdisk工具核实下
## 1. ext*文件系统的魔数是: 53 ef#[root@iz2ze122w6gewwurz1e637z ~]# dd if=/dev/vdb bs=512 count=4096 2>/dev/null | \> od -tx1 | perl -ne '> chomp;> if (/^([0-7]+)\s # 磁盘数据的位置> ([0-9a-f][0-9a-f]\s){8} # 越过无关数据> 53\sef\s # 模数> 0[124]\s00\s0[123]\s00\s # 文件系统状态和出错后的行为配置> /x) {> my $s=int((oct $1)/512)-2;> print qq[$s $_\n];> }'56 0072060 72 46 cd 5b 00 00 ff ff 53 ef 01 00 01 00 00 00## 2. 检查到魔数,即是Ext*文件系统。从魔数反推出的分区起始扇区是56扇区。#[root@iz2ze122w6gewwurz1e637z ~]# fdisk -l -u /dev/vdb磁盘 /dev/vdb:1099.5 GB, 1099511627776 字节,2147483648 个扇区Units = 扇区 of 1 * 512 = 512 bytes扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘标签类型:dos磁盘标识符:0x00088bd9 设备 Boot Start End Blocks Id System/dev/vdb1 56 2147483647 1073741796 83 Linux[root@iz2ze122w6gewwurz1e637z ~]### 3. fdisk给出的起始扇区是56。这与我们从魔数推断到的结果是一致的。#
我们如果通过fdisk工具来对/dev/vdb重新分区。如果在/etc/fstab中做了配置,那么重启会失败。具体失败报错请参考上面的信息。如果不重启直接挂载,则会遇到下面的报错
## 1. 直接挂载#[root@iz2ze122w6gewwurz1e637z ~]# mount /dev/vdb1 /optmount: /dev/vdb1 is write-protected, mounting read-onlymount: unknown filesystem type '(null)'## 2. 挂载失败了# [root@iz2ze122w6gewwurz1e637z ~]# mount -l | egrep /dev/vdb## 3.为什么挂载失败了呢?因为fdisk把分区起始位置设定为2048了#[root@iz2ze122w6gewwurz1e637z ~]# fdisk -u -l /dev/vdbDisk /dev/vdb: 1099.5 GB, 1099511627776 bytes, 2147483648 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x00088bd9 Device Boot Start End Blocks Id System/dev/vdb1 2048 2147483647 1073740800 83 Linux[root@iz2ze122w6gewwurz1e637z ~]#
因为fdisk工具总是把起始扇区设定为2048,不能调整,所以我们使用parted工具。具体修复过程如下
[root@iz2ze122w6gewwurz1e637z ~]# parted /dev/vdbGNU Parted 3.1Using /dev/vdbWelcome to GNU Parted! Type 'help' to view a list of commands.## 1. 使用扇区作为默认单位#(parted) unit s ## 2. 检查当前的分区情况#(parted) print Model: Virtio Block Device (virtblk)Disk /dev/vdb: 2147483648sSector size (logical/physical): 512B/512BPartition Table: msdosDisk Flags: Number Start End Size Type File system Flags 1 2048s 2147483647s 2147481600s primary## 3. 删除问题分区#(parted) rm 1## 4. 重建分区#(parted) mkpart Partition type? primary/extended? primary File system type? [ext2]? ext4 Start? 56 # 起始扇区调整为56 End? 2147483647 # 扇区编号是从0开始的。因此最后一个扇区,是扇区总数减1Warning: The resulting partition is not properly aligned for best performance.Ignore/Cancel? Ignore # 这是我们所要的分区情况,因此忽略报警(parted) q Information: You may need to update /etc/fstab.## 5. 分区重建成功#[root@iz2ze122w6gewwurz1e637z ~]# tune2fs -l /dev/vdb1 tune2fs 1.42.9 (28-Dec-2013)Filesystem volume name:Last mounted on: Filesystem UUID: 0d51624e-5f97-46bb-8423-63a6e5e72d1cFilesystem magic number: 0xEF53Filesystem revision #: 1 (dynamic)Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isizeFilesystem flags: signed_directory_hash Default mount options: user_xattr aclFilesystem state: cleanErrors behavior: ContinueFilesystem OS type: LinuxInode count: 67108864Block count: 268435449Reserved block count: 13421772Free blocks: 264170080Free inodes: 67108853First block: 0Block size: 4096Fragment size: 4096Group descriptor size: 64Reserved GDT blocks: 1024Blocks per group: 32768Fragments per group: 32768Inodes per group: 8192Inode blocks per group: 512Flex block group size: 16Filesystem created: Mon Oct 22 11:39:29 2018Last mount time: Mon Oct 22 12:12:30 2018Last write time: Mon Oct 22 12:12:30 2018Mount count: 1Maximum mount count: -1Last checked: Mon Oct 22 11:39:29 2018Check interval: 0 ( )Lifetime writes: 134 MBReserved blocks uid: 0 (user root)Reserved blocks gid: 0 (group root)First inode: 11Inode size: 256Required extra isize: 28Desired extra isize: 28Journal inode: 8Default directory hash: half_md4Directory Hash Seed: 0f70f076-e2f1-4f0e-bc37-e950a58e0d0cJournal backup: inode blocks[root@iz2ze122w6gewwurz1e637z ~]# mount /dev/vdb1 /opt[root@iz2ze122w6gewwurz1e637z ~]# [root@iz2ze122w6gewwurz1e637z ~]# mount -l | egrep /dev/vdb1/dev/vdb1 on /opt type ext4 (rw,relatime,data=ordered)[root@iz2ze122w6gewwurz1e637z ~]#
祝探索愉快。
转载地址:http://qzvra.baihongyu.com/