ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS 下 ext4 迁移 XFS:备份重建与 LVM 实践

CentOS 下 ext4 迁移 XFS:备份重建与 LVM 实践 1. 先把这事说清楚CentOS 上 ext4 换 xfs不是一条转换命令上周又帮朋友处理了一台 CentOS 7.9 数据机需求很直接原来/data分区是 ext4现在想改成 xfs。原因也不复杂业务日志、备份包、虚拟机镜像都往这块盘上堆单个文件早就过了 50GB目录扫描慢、备份窗口长而 CentOS 7 时代默认文件系统就是 xfs很多新装的机器也清一色 xfs于是“把 ext4 改成 xfs”就成了一个看起来顺理成章的念头。但我先把结论放在这里CentOS 下 ext4 换 xfs没有官方支持的一键原地转换mkfs.xfs执行下去那一刻原来的 ext4 元数据和数据都会被清空。你要做的不是“转换”而是“备份、重建文件系统、恢复数据、改挂载配置”这一整套迁移动作。很多人第一次搜这个需求会看到一些奇怪的命令或者实验性工具以为可以像改分区类型那样改文件系统格式。实际上分区表里的类型代码可以随便改真正决定数据怎么存的是文件系统本身。ext4 和 xfs 是两套完全不同的元数据组织方式inode 分配、日志、目录结构、扩展属性都不一样。你想换文件系统底层就必须重新格式化。能接受这个事实后面的事情反而简单选路线、做准备、迁移、验证、保留回滚。下面我按实际生产里最稳的顺序把这套流程拆开讲。适合手里有 CentOS 7.9、CentOS 8 或者类似 RHEL 系发行版想把数据盘、LVM 逻辑卷甚至系统盘从 ext4 换成 xfs 的人参考。小白可以照着思路做实验老手可以直接跳到自己关心的章节。1.1 为什么很多人盯上 XFS不是跟风是大文件和扩容需求先说清楚为什么值得换。ext4 不是不好它稳定、工具成熟、能缩小很多老业务跑得好好的。但 ext4 有几个特点在现在这种数据场景下会显得别扭。第一ext4 的 inode 数量通常在格式化时基本确定虽然可以调但后期遇到海量小文件df -i先满而空间没满的情况并不少见。xfs 采用动态 inode 分配用多少分多少对那种目录里几十万小文件的场景更从容。第二xfs 对超大文件、大容量卷和并行 I/O 更友好它天生带分配组和延迟分配多线程读写时不容易被单一日志拖住。第三CentOS 7 开始默认 xfsxfs_growfs在线扩容非常顺手LVM 扩完逻辑卷直接在挂载点上扩文件系统即可不用卸载。但别误会xfs 不是全面碾压 ext4。xfs 最大的短板是不能缩小文件系统xfs_growfs只能扩不能缩。这意味着如果你习惯先把分区开大再缩回来xfs 会教你做人。另一个差别是修复工具ext4 用fsck.ext4xfs 用xfs_repair而且 xfs 必须卸载后修复根文件系统坏了通常得进救援模式。还有xfs 对条带化存储有更好的感知但前提是你在mkfs.xfs或挂载时传对参数默认参数未必发挥硬件全部性能。所以我的判断标准很简单数据盘、日志盘、备份盘、大文件为主的卷从 ext4 换 xfs 收益明显系统盘如果现在跑得稳没必要为了“统一格式”特意折腾。尤其是/boot、EFI 分区、swap这些跟 ext4 还是 xfs 没多大关系乱动只会把启动链搞坏。下面这张表是我自己在选型时常用的对照不追求教科书式全面但足够判断大多数场景。对比项ext4xfs典型默认场景老系统、通用分区CentOS 7/8 默认大文件、大容量在线扩容支持支持xfs_growfs缩小文件系统支持不支持inode 分配格式化时预留可调动态分配修复方式fsck.ext4可自动xfs_repair通常需卸载大文件表现够用但上限和并发不如 xfs更强适合大文件、并行 I/O元数据日志有有且设计不同运维习惯老手熟悉CentOS 7 后大量机器默认我见过有人为了把/home从 ext4 换 xfs直接把 LVM 逻辑卷删了重建结果忘了备份 SELinux 上下文用户能登录但网页服务死活起不来。这不是文件系统的问题是迁移流程没做全。文件系统格式只是盘子数据、权限、扩展属性、安全标签才是菜。1.2 四种可落地路线新增盘迁移、LVM 新建 LV、备份后重建、系统盘救援迁移实际工作中我不会上来就问“怎么把 ext4 转 xfs”而是先问三件事这块盘上有没有空间再做一份这块盘是不是 LVM机器能不能停机答案不同路线完全不一样。路线一新增盘或新增分区迁移。最稳。你有空闲磁盘、有空闲槽位或者虚拟化环境能加一块虚拟盘那就把新盘格式化成 xfs挂到临时目录用 rsync 把旧数据搬过去改 fstab验证后保留旧盘一周。原 ext4 盘不动出问题随时切回来。这条路唯一成本是要有额外存储空间。路线二LVM 逻辑卷新建 LV 迁移。如果卷组里有空闲 PE那就lvcreate一个新的 xfs 逻辑卷挂到/mnt/newdata把旧 LV 的数据复制过去。好处是可以在线迁移切换时停业务时间很短。缺点是卷组空间要够而且新 LV 不能比数据实际需要小。xfs 不能缩小所以创建时宁可稍大别抠得太紧。路线三备份后原地重建。如果只有这一块盘、一个分区没有额外空间那只能先把数据备份到外部存储或另一台机器然后卸载、mkfs.xfs -f、重新挂载、恢复数据。这是最直接的“格式转换”也是最危险的。备份没验证之前不要执行格式化。路线四系统盘救援迁移。要换的是/或/usr这类系统分区不能在线做。需要关机用 CentOS 安装 ISO 进救援模式或者用 Live 环境挂载外部备份盘备份系统文件创建新分区或新 LV格式化 xfs恢复系统再 chroot 修复 grub2、dracut 和 fstab。这个流程能跑通但细节最多任何一步写错设备名都可能把原系统彻底覆盖。我自己的优先级很明确路线一优于路线二路线二优于路线三系统盘迁移除非有明确收益否则不做。因为文件系统格式带来的性能收益大多数业务根本感知不到但迁移过程中的人为失误一定会被感知到。1.3 红线这些分区别乱碰动了就容易开不了机在动手前先把不能改的东西列出来。第一EFI 系统分区必须是 FAT32通常是/boot/efi不要试图把它格式化成 xfs。第二swap 分区不是普通文件系统它是交换空间用mkswap管理不要和 ext4、xfs 混为一谈。第三/boot分区建议保持 ext4 或者现状。虽然 CentOS 7 的 grub2 支持从 xfs 启动但把/boot也改 xfs 只会增加启动链复杂度收益几乎为零。第四正在使用的根分区、/var、/usr不能在线mkfs因为系统运行时这些目录一直在读写你不可能安全卸载它们。第五有 LVM 快照、DRBD、多路径、加密卷的机器先确认底层依赖不要在加密层上面直接改文件系统。还有一个很隐蔽的红线设备名漂移。/dev/sdb今天可能是数据盘重启后可能变成/dev/sdc或/dev/sda。所有命令里看到/dev/sdb1、/dev/centos/data这种都必须先用lsblk -f、blkid确认。生产环境执行mkfs前我习惯再看一遍挂载点确认目标设备没有挂载也没有在/etc/fstab里承担关键角色。设备名写错比文件系统选错严重得多。注意任何mkfs命令都会销毁目标设备上的文件系统。执行前至少确认三遍设备名、大小、挂载点最好先在虚拟机里用一块测试盘完整走一遍。2. 动手前的信息盘点和备份策略真正的老手在换文件系统之前大部分时间花在盘点和备份上而不是格式化上。因为格式化只要几秒丢数据可能是几天。你要先知道现有系统怎么分区、怎么挂载、哪些是 LVM、哪些目录占用大、哪些服务在用这个盘。然后设计备份方式确保权限、ACL、扩展属性、SELinux 标签都能恢复。最后准备校验手段和回滚方案。这三件事做完后面的操作就是按部就班。2.1 五条命令摸清家底lsblk、blkid、df -Th、findmnt、vgs/lvs先登机器不要急着umount。我会按顺序跑下面这组命令把磁盘、文件系统、挂载关系、LVM 结构全部记下来。lsblk -f blkid df -Th findmnt --fstab cat /etc/fstab vgs lvs -a -o devices pvslsblk -f能直接看到设备名、文件系统类型、UUID、挂载点。blkid更详细能看到 UUID 和 TYPE。df -Th看容量和已用空间判断备份存储要多大。findmnt --fstab和cat /etc/fstab用来核对开机挂载配置。vgs、lvs、pvs是 LVM 三件套确认逻辑卷路径、卷组剩余空间、底层物理卷。重点记录几个信息原文件系统的 UUID、挂载点、大小、已用空间、挂载选项。如果后面要改 fstabUUID 会变因为新格式化的 xfs 会生成新 UUID。不要直接抄旧 UUID必须重新blkid获取。对于 LVM逻辑卷路径也要记清楚例如/dev/mapper/centos-home和/dev/centos/home是同一个东西的不同写法别被绕晕。还要查谁在用这个挂载点。lsof D /data会列出打开的文件但目录大时很慢。更实用的是fuser -mv /data能看到进程。必要时systemctl list-units --mount查 systemd 挂载单元。如果这个盘上跑了数据库、Nginx 日志、Docker 数据目录先停服务别指望umount会成功。2.2 备份要保留 ACL、xattr、SELinuxrsync 还是 tar普通cp -r在文件系统迁移里是不够的因为它不保证保留硬链接、ACL、扩展属性、SELinux 上下文。你恢复出来的数据可能权限对、内容对但服务就是起不来。我的首选是 rsync。rsync -aHAX --numeric-ids --infoprogress2 /data/ /mnt/backup/data/参数含义-a归档模式包含递归、权限、时间戳、符号链接等-H保留硬链接-A保留 ACL-X保留扩展属性和 SELinux 相关属性--numeric-ids保留数字 UID/GID避免跨机器用户映射问题--infoprogress2看总体进度。注意源路径末尾的斜杠/data/表示复制目录内容/data表示连目录本身一起复制。如果备份到 tar 包可以用tar --selinux --acls --xattrs -cpf /backup/data.tar -C /data .恢复时mkdir -p /mnt/newdata tar --selinux --acls --xattrs -xpf /backup/data.tar -C /mnt/newdatatar 的优点是打包后方便传到另一台机器缺点是恢复前没法直接浏览而且大目录打包时间长。rsync 更适合有挂载点可写的场景也方便做增量同步。实际迁移时我通常第一次用 rsync 全量业务停机后再来一次增量最后切换。这样可以把停机窗口压缩到几分钟。注意如果目标文件系统是 xfs恢复后仍然建议执行一次restorecon -Rv /data确保 SELinux 上下文正确。不要假设 rsync 一定把所有安全标签都处理得完美尤其是从 tar 或 cp 恢复时。2.3 校验和回滚快照、旧盘保留、sha256 清单备份完不等于结束必须验证。最简单的方法是抽查文件数量和大小但不够可靠。对关键目录可以做校验和清单。备份前在源端生成find /data -type f -print0 | xargs -0 sha256sum /backup/data.sha256恢复后到新挂载点校验cd /mnt/newdata sha256sum -c /backup/data.sha256如果路径层级不同需要调整清单里的路径或者用rsync -c做校验同步但后者很慢适合小数据量。对于超大目录我会抽几个关键业务文件做校验再对比总文件数。回滚方案也要提前准备。LVM 环境可以在迁移前做快照但要注意快照空间必须足够且快照期间原卷写入不能太猛否则快照溢出会失效。更稳的办法是保留旧盘或旧 LV不要迁移一完成就lvremove或重新分区。至少保留到业务验证一个完整周期比如一周或者一个结算日。旧盘拔掉之前改 fstab 时要确保不会因为旧盘不存在而卡在紧急模式。可以用 UUID 挂载新盘把旧盘从 fstab 注释掉。如果只有一块盘必须原地重建那外部备份就是唯一退路。备份盘可以是 USB 硬盘、NAS 挂载、另一台服务器甚至云存储但必须确认带宽和恢复时间。别等到格式化了才发现在传一个 2TB 的包。3. 数据盘从 ext4 切到 xfs 的完整实操这一章按最常见的数据盘场景走。假设你有一块盘/dev/sdb1现在 ext4挂载在/data要变成 xfs。下面命令里的设备名和挂载点都是示例实际操作前用lsblk -f替换成你的真实设备。整个过程分为准备、备份、卸载、格式化、挂载、恢复、改 fstab、验证。每一步都别跳。3.1 场景一整块数据盘复用备份后 mkfs.xfs如果只有这一块数据盘没有额外盘可挂那就走这条。第一步停止所有写/data的服务。systemctl stop nginx systemctl stop mysqld fuser -mv /data第二步做全量备份到外部存储。假设外接盘挂载在/mnt/backup。mkdir -p /mnt/backup/data rsync -aHAX --numeric-ids --infoprogress2 /data/ /mnt/backup/data/第三步生成校验清单并确认备份大小。du -sh /data /mnt/backup/data find /data -type f | wc -l find /mnt/backup/data -type f | wc -l第四步卸载/data。umount /data如果提示 target is busy回到fuser和lsof排查不要强行umount -l懒卸载只是把问题藏起来文件系统可能还在后台写。第五步再次确认设备。lsblk -f /dev/sdb blkid /dev/sdb1确认/dev/sdb1没有挂载且就是原来的 ext4 数据分区。然后格式化。mkfs.xfs -f -L DATA /dev/sdb1-f表示强制覆盖已有文件系统-L DATA是设置卷标方便识别。格式化完成后查看信息blkid /dev/sdb1 xfs_info /dev/sdb1第六步临时挂载并恢复数据。mkdir -p /mnt/newdata mount /dev/sdb1 /mnt/newdata rsync -aHAX --numeric-ids --infoprogress2 /mnt/backup/data/ /mnt/newdata/第七步恢复安全上下文和权限验证。restorecon -Rv /mnt/newdata ls -l /mnt/newdata第八步更新/etc/fstab。先获取新 UUIDblkid /dev/sdb1然后在 fstab 里写UUID新UUID /data xfs defaults,noatime 0 0注意 xfs 的 dump 和 pass 字段通常写0 0不要照抄 ext4 的0 2。第九步卸载临时挂载点挂载到正式位置。umount /mnt/newdata mount /data df -Th /data确认无误后再启动服务。旧备份保留至少一周。3.2 场景二LVM 逻辑卷创建新 LV 再迁移LVM 环境下如果卷组有空闲空间这是最优雅的路线。假设旧逻辑卷是/dev/centos/dataext4挂载/data。先看卷组剩余空间vgs lvs如果有足够空闲 PE创建新 LVlvcreate -L 200G -n data_xfs centos mkfs.xfs -L DATA_XFS /dev/centos/data_xfs mkdir -p /mnt/newdata mount /dev/centos/data_xfs /mnt/newdata然后用 rsync 把旧数据复制过去。第一次可以在线复制但业务仍在写所以需要停机后再增量一次。rsync -aHAX --numeric-ids --delete --infoprogress2 /data/ /mnt/newdata/停业务再执行一次增量确保差异同步。然后卸载旧挂载点umount /data umount /mnt/newdata更新/etc/fstab把/data指向新 LV 的 UUIDblkid /dev/centos/data_xfsUUID新UUID /data xfs defaults,noatime 0 0挂载测试mkdir -p /data mount /data df -Th /data验证业务正常后旧 LV 可以保留一段时间。确认不需要回滚了再删除lvremove /dev/centos/data这一步会彻底销毁旧数据删之前再确认备份和业务。3.3 场景三VG 空间不够只能备份后删旧 LV 重建如果卷组没有空闲空间但你又必须把/data所在的 LV 改成 xfs那就只能备份后重建。顺序是备份到外部卸载删除旧 LV创建新 LV格式化 xfs恢复。注意删除 LV 是不可逆的。umount /data lvremove /dev/centos/data lvcreate -L 200G -n data centos mkfs.xfs -L DATA /dev/centos/data mkdir -p /data mount /dev/centos/data /data rsync -aHAX --numeric-ids --infoprogress2 /mnt/backup/data/ /data/ restorecon -Rv /data这里创建 LV 时容量不要小于原数据实际使用量也不能小于 xfs 格式化后的可用容量。因为 xfs 不能缩小一旦建小再想扩虽然可以lvextend加xfs_growfs但如果是创建时就太小恢复过程会直接失败。我一般会按原 LV 大小创建或者按已用空间的 1.2 倍以上创建。如果原 LV 上有 LVM 快照先确认快照不再使用或者先把快照合并/删除。快照会占用卷组空间也可能导致你误判剩余容量。3.4 mkfs.xfs 参数、挂载选项与 /etc/fstab 写法大多数场景直接用mkfs.xfs -f /dev/xxx就够了默认参数在 CentOS 7.9 上很稳。但有几个参数值得知道。-b size4096指定块大小默认通常就是 4K不要乱改。-m crc1开启 CRC 校验CentOS 7 默认 xfs v5 已经开启。-d agcount指定分配组数量默认会根据设备大小自动算普通盘不用改。-L设置卷标方便人看。-f强制覆盖。-q安静模式。对于 RAID 或 SAN 存储可以了解sunit和swidth但必须在明确知道底层条带大小和盘数时设置设错反而降性能。SSD 上可以考虑挂载选项noatime、nodiratime减少无谓写入。是否开启discard要看存储是否支持在线 TRIM很多生产环境更偏向定期fstrim而不是挂载时实时 discard。挂载选项里defaults包含 rw、suid、dev、exec、auto、nouser、async。xfs 常用的有UUIDxxx /data xfs defaults,noatime 0 0如果业务需要可以加inode64但 CentOS 7 默认已经启用。不要从网上抄一堆logbufs、logbsize、allocsize参数除非你有明确压测数据。文件系统调优最怕“听说这个参数快”结果把稳定配置改乱。修改 fstab 后先mount -a测试。如果/data已经挂载mount -a不会重新挂载可以umount /data mount /data。更稳的是findmnt --verify但 CentOS 7 不一定支持可以mount -o remount /data检查语法。最保险的是保留一个 root shell再重启测试。远程机器改 fstab 出错可能直接失联最好有带外管理或云控制台。4. 系统盘转换与救援模式最难的是启动链数据盘迁移相对独立系统盘转换完全是另一回事。你要换的是根文件系统/系统运行时根分区一直挂载不可能卸载后格式化。所以必须关机从外部环境启动把系统当成一堆文件备份、恢复到新文件系统再修复引导。这个过程我做过几次每次最耗时的不是 rsync而是 grub2、dracut、fstab 和 SELinux 的修复。4.1 Live/救援环境准备与系统盘备份准备一个 CentOS 安装 ISO或者同版本 Live 环境。虚拟机可以挂 ISO物理机可以用 U 盘启动。进入救援模式后选择 shell不要自动挂载原系统避免干扰。先激活 LVMvgchange -ay lsblk -f blkid挂载外部备份盘例如/dev/sdc1挂到/mnt/backup。然后挂载原系统根分区到/mnt/sysroot。如果根在 LVM 上可能是/dev/centos/root。mkdir -p /mnt/sysroot /mnt/backup mount /dev/centos/root /mnt/sysroot mount /dev/sda1 /mnt/sysroot/boot如果 EFI 分区存在也挂上mount /dev/sda2 /mnt/sysroot/boot/efi然后用 rsync 备份整个系统排除虚拟文件系统和临时目录rsync -aHAX --numeric-ids --infoprogress2 \ --exclude{/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lostfound} \ /mnt/sysroot/ /mnt/backup/sysroot/备份完成后校验关键文件例如/etc/fstab、/etc/passwd、业务数据目录。系统盘备份动辄几十 GB耐心等完不要中途拔盘。4.2 新盘分区、格式化、恢复系统文件如果目标是新盘先对新盘分区。BIOS 引导通常需要一个小分区挂/boot根分区可以是 xfs。EFI 引导必须有 FAT32 的 EFI 分区。假设新盘/dev/sdb分区后mkfs.xfs -f -L ROOT /dev/sdb2 mkfs.ext4 -L BOOT /dev/sdb1如果/boot保持 ext4兼容性最好。EFI 分区用mkfs.vfat -F32 /dev/sdb1然后挂载新根到/mnt/newroot创建目录恢复系统文件。mkdir -p /mnt/newroot mount /dev/sdb2 /mnt/newroot mkdir -p /mnt/newroot/boot mount /dev/sdb1 /mnt/newroot/boot rsync -aHAX --numeric-ids --infoprogress2 /mnt/backup/sysroot/ /mnt/newroot/恢复完成后不要急着重启。先检查/mnt/newroot/etc/fstab把根、boot、EFI、swap 的 UUID 改成新分区的 UUID。可以用blkid获取。然后挂载虚拟文件系统准备 chroot。mount --bind /dev /mnt/newroot/dev mount --bind /proc /mnt/newroot/proc mount --bind /sys /mnt/newroot/sys mount --bind /run /mnt/newroot/run chroot /mnt/newroot4.3 chroot 修复 grub2、dracut、fstab进入 chroot 后先重新生成 initramfs让内核识别新的根文件系统。CentOS 7 用 dracutdracut -f如果/boot单独分区确保dracut -f把 initramfs 写到正确位置。然后重新安装 grub2。BIOS 引导grub2-install /dev/sdb grub2-mkconfig -o /boot/grub2/grub.cfgEFI 引导grub2-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idcentos grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg还要检查/etc/default/grub里的GRUB_CMDLINE_LINUX确保没有写死旧 UUID 或旧设备名。很多启动失败是因为内核参数里还残留root/dev/sda2或旧 LVM 路径。用 UUID 挂载更稳。退出 chroot卸载所有挂载exit umount -R /mnt/newroot然后关闭救援环境从新盘启动。第一次启动可能进紧急模式别慌按提示输入 root 密码检查journalctl -xb通常是 fstab 某个 UUID 不对或者 SELinux 上下文导致服务失败。4.4 哪些目录保持 ext4/vfat/swap不要全盘 xfs系统盘转换最容易犯的错是追求“全盘 xfs”。实际上完全没必要。/boot保持 ext4减少引导复杂度。EFI 分区必须 FAT32。swap 用mkswap管理不是 xfs。/根分区可以 xfs/home、/var、/data如果单独分区也可以 xfs。但如果/var上有数据库、容器数据迁移前要评估服务恢复顺序。SELinux 开启的机器恢复后执行restorecon -Rv /etc /var /home /data如果系统使用selinux且之前有自定义策略重新生成策略可能需要semodule。普通业务一般恢复安全上下文就够。此外CentOS 7.9 默认根 xfs 是经过大量验证的但你从 ext4 迁移过去不等于自动获得默认安装的优化。initramfs 里需要包含 xfs 模块dracut -f会处理。grub2 读取 xfs 也支持但/boot如果改 xfsgrub2 的模块和配置要更谨慎。我的建议是根可以 xfsboot 不动。5. 常见问题与排查速查迁移过程中遇到的问题大多集中在卸载、格式化、挂载、启动和 SELinux 五类。下面按实际排查顺序整理能帮你少走弯路。5.1 卸载失败、格式化报错、挂载失败卸载失败最常见的原因是进程占用。umount /data提示 target is busy先跑fuser -mv /data lsof D /data找到进程后停服务或者把工作目录切出/data。如果挂载来自 systemd 单元systemctl stop对应 mount 单元。不要随便kill -9数据库进程先正常停。mkfs.xfs报错appears to contain an existing filesystem说明目标设备已有文件系统需要-f强制。但如果设备名确认错了-f就是灾难。格式化前再看一次lsblk -f。挂载失败wrong fs type, bad option, bad superblock先确认 xfsprogs 是否安装rpm -q xfsprogsCentOS 7 默认有但精简系统可能没有。再确认blkid里 TYPE 是 xfs。如果内核加载不了 xfsmodprobe xfs试试。极少见的老系统可能需要额外模块但 CentOS 7 以后不用。现象常见原因处理umount target is busy进程占用挂载点fuser -mv、lsof D、停服务mkfs.xfs 报已有文件系统未加-f或设备错确认设备后加-fmount 提示 wrong fs typexfsprogs 缺失或设备错安装 xfsprogs检查 blkid开机进紧急模式fstab UUID 错控制台登录注释错误行改 UUID服务起不来SELinux 上下文丢失restorecon -Rv查 audit 日志xfs_growfs 报不是挂载点对设备而非挂载点执行对挂载点执行如xfs_growfs /dataxfs_repair 设备忙文件系统仍挂载先卸载再修复5.2 启动进紧急模式、SELinux 拒绝改完 fstab 重启进紧急模式第一反应是看journalctl -xb找到带failed的挂载项。常见是 UUID 写错、文件系统类型写错、设备不存在。此时根文件系统通常只读挂载需要mount -o remount,rw / vi /etc/fstab把错误行注释掉保存后reboot。如果根是 xfsxfs_repair不能在线跑必须进救援模式。SELinux 拒绝的表现是服务启动失败systemctl status看到 permission denied但文件权限看起来正常。用ausearch -m avc -ts recent查拒绝记录。大多数情况是迁移时安全上下文丢了执行restorecon -Rv /data restorecon -Rv /var/www如果自定义目录需要特定上下文用semanage fcontext -a -t httpd_sys_content_t /data/www(/.*)?然后restorecon -Rv /data/www。别直接关 SELinux那只是把问题藏起来。5.3 XFS 不能缩小后续扩容和修复怎么做xfs 最大的限制是不能缩小。所以规划容量时要留余量。后续扩容倒是很方便。LVM 环境lvextend -L 100G /dev/centos/data xfs_growfs /data注意顺序先扩底层 LV 或分区再扩 xfs。如果是普通分区先growpart /dev/sda 2扩分区再pvresize或resize2fs不适用xfs 用xfs_growfs。xfs_growfs对挂载点执行不是对设备。扩完用df -Th确认。修复 xfs 用xfs_repair必须卸载umount /data xfs_repair -n /dev/sdb1 xfs_repair /dev/sdb1-n是只读检查看有没有错误。真正修复不带-n。-L会清空日志只在文件系统无法挂载且没有其他办法时使用可能丢失最近未落盘元数据使用前尽量备份。如果根文件系统损坏进救援模式vgchange -ay卸载后修复。日常可以用xfs_info /data查看文件系统参数xfs_db做高级调试但普通运维不需要。定期跑xfs_repair -n不是必须xfs 没有像 ext4 那样的定期 fsck 习惯更多依赖底层 RAID 和备份。6. 实操心得我踩过的坑和压箱底建议这套流程看起来长但真正执行时只要路线选对大多数机器一两小时能搞定。真正让我吃亏的从来不是mkfs.xfs命令本身而是那些看起来不相关的细节。6.1 三个最容易翻车的细节第一个细节rsync 路径斜杠。rsync -a /data /mnt/newdata会在新目录下创建/mnt/newdata/data而rsync -a /data/ /mnt/newdata/才是把内容复制过去。迁移前先用小目录测试别拿生产目录练手。第二个细节fstab 字段。ext4 通常写defaults 0 2xfs 我习惯写defaults,noatime 0 0。虽然 pass 字段对 xfs 影响不大但保持一致能避免systemd产生奇怪等待。第三个细节旧盘保留。迁移完成后不要因为“看着清爽”立刻删除旧 LV 或把旧盘格式化。至少保留一个业务周期等备份、监控、告警都验证完再清理。还有一个特别隐蔽的坑LVM 快照和 thin pool。如果旧 LV 在 thin pool 里lvremove、lvcreate可能影响 thin pool 元数据操作前先lvs -a -o segtype看清楚。普通线性 LV 简单得多thin pool 和快照需要额外小心。另一个坑是云服务器上的磁盘序列号变化重启后设备名可能变所以 fstab 一定用 UUID不要用/dev/sdb1。6.2 如果重来一次我会这样安排如果让我重新安排一次 ext4 换 xfs我会先确认有没有额外盘。有额外盘就绝不原地重建先把新盘 xfs 挂到/mnt/newdata用 rsync 全量加增量停业务后切换 fstab。切换前用sha256sum抽查关键文件切换后保留旧盘一周。系统盘能不换就不换除非有足够停机窗口和完整备份。对于 CentOS 7.9 数据盘我还会顺手做两件事把挂载选项加上noatime减少无意义写入把xfs_growfs和lvextend的扩容步骤写成内部文档方便下次直接照做。最后再分享一个小技巧。迁移完不要只看df -Th显示 xfs 就放心进入挂载点实际读写几个大文件重启一次机器确认 fstab 自动挂载正常再让业务跑一轮。文件系统切换这件事真正的完成标准不是命令返回成功而是机器重启后服务照常、数据没丢、权限没乱、SELinux 没拒绝。做到这几点ext4 到 xfs 的活才算收尾。
返回列表