Recreating an XFS file system with `ftype=1`
My proposed method seemed to work fine. Here's my procedure:
- Boot into
CentOS-7-x86_64-LiveGNOME-1804.iso
. - Open a terminal and
sudo -s
. - Scan for LVM volumes:
vgscan
- Change into the appropriate volume group (
centos
in my case):vgchange -ay centos
- Scan for the logical volumes in that group:
lvscan
- Create a mount point for the root FS:
mkdir /mnt/root
- Mount the logical volume corresponding to the root FS:
mount /dev/centos/root /mnt/root
- Dump to remote host:
xfsdump -J - /mnt/root | ssh <host> 'cat >/data/rootfs.dump'
- Unmount the root FS:
umount /mnt/root
- Recreate the root FS:
mkfs.xfs -f -n ftype=1 /dev/centos/root
- Mount the recreated root FS:
mount /dev/centos/root /mnt/root
- Restore from remote host:
ssh <host> 'cat /data/rootfs.dump' | xfsrestore -J - /mnt/root
- Reboot. Everything should be as it was before, except
xfs_info /
should now showftype=1
.
Note: My xfsdump
call resulted in a number of warnings of the form
xfsdump: WARNING: failed to get bulkstat information for inode 10485897
According to someone who appears to be an XFS developer (http://xfs.9218.n7.nabble.com/xfs-and-lvm-snapshots-tp1241p1246.html):
They can be ignored - they are inodes that were previously unlinked, but are still partially there on the snapshot volume, and visible to the by-handle interfaces that xfsdump is using to extract all of the inodes in the snapshot.
Related videos on Youtube
jjlin
Updated on September 18, 2022Comments
-
jjlin over 1 year
I have a CentOS 7 system where the root file system is XFS (created with
ftype=0
, the default CentOS setting at the time the system was installed). Unfortunately, the Dockeroverlay2
storage driver requires that file system to have been created withftype=1
:https://docs.docker.com/storage/storagedriver/overlayfs-driver/#prerequisites
So now I'd like to recreate the root FS with
ftype=1
. I was thinking of doing that as follows:- Boot into a rescue image of some sort.
-
xfsdump
the root FS to a remote location. - Recreate the root FS with
ftype=1
. -
xfsrestore
the root FS from the remote dump.
One thing I'm not sure about, though, is whether the
xfsdump
output carries anything related to theftype
setting. That is, would there be any issues doing thexfsrestore
onto an XFS file system with a differentftype
setting?Or is there a better approach to solving this specific problem (that doesn't involve reinstalling the whole system, repartitioning, etc.)?
-
Alex Mazzariol over 5 yearsDon't forget to check your dracut initramfs and/or GRUB config for UUID references:
mkfs.xfs
generates a new UUID, and grub/initramfs will not be able to find it with the old reference. Rebuild if needed! -
jjlin over 5 years@AlexMazzariol I didn't run into this issue, and I'm kind of curious why. Is your install pretty standard? Anyway, I guess it might be a good idea to use
xfs_admin
to get (-u
) the UUID before recreating, and if needed, set (-U
) the UUID in the recreated FS back to the original. -
Alex Mazzariol over 5 yearsYes, tried on both LVM and plain partitioning, plain CentOS installation. In both cases on
/etc/fstab
the partitions are identified by UUID, and dracut fails to recognize the root after themkfs.xfs
; when not using LVM also GRUB passed the old UUIDs asroot=
to the kernel. Can be solved by remaking grub-options and dracut, or as you said, by restoring the previous UUID withxfs_admin
. -
Bruce Adams almost 5 yearsI can independently confirm this procedure works on Rhel7 and is safe to use. I saved and restored the uuid with xfs_admin just in case. I used a local usb drive rather than ssh myself and save and restore was pretty quick.
-
Richard over 4 yearsThanks for working out the detailed procedure, but why would you do this for Docker, since when you switch storage drivers you lose all existing containers/images installed anyway (under ./devicemapper they will not be visible in the new overlay2 mode which will have its own subdir ./overlay2)?
-
jjlin over 4 years@RichK. Your Docker state likely won't be too hard to recreate, but if your Docker host is also used for other things, recreating all that configuration could be painful.