Просмотр исходного кода

Add xfs_repair

fsck.xfs is a noop. As the man page sais, "it does nothing, successfully"

This does an xfs_repair. To repair an XFS filesystem, you first need to
mount it to replay any log (because why not?), umount it, then run xfs_repair
Gabriel Adrian Samfira 8 лет назад
Родитель
Сommit
7f8eb68ed6
2 измененных файлов с 23 добавлено и 1 удалено
  1. 4 1
      coriolis/osmorphing/osmount/base.py
  2. 19 0
      coriolis/utils.py

+ 4 - 1
coriolis/osmorphing/osmount/base.py

@@ -173,7 +173,10 @@ class BaseLinuxOSMountTools(BaseSSHOSMountTools):
                 "sudo blkid -o value -s TYPE %s || true" %
                 dev_path).decode().split('\n')[0]
             if fs_type in valid_filesystems:
-                utils.check_fs(self._ssh, fs_type, dev_path)
+                if fs_type == "xfs":
+                    utils.run_xfs_repair(self._ssh, dev_path)
+                else:
+                    utils.check_fs(self._ssh, fs_type, dev_path)
                 dev_paths_to_mount.append(dev_path)
 
         os_root_device = None

+ 19 - 0
coriolis/utils.py

@@ -193,6 +193,25 @@ def check_fs(ssh, fs_type, dev_path):
         LOG.warn("Checking file system returned an error:\n%s", str(ex))
 
 
+def run_xfs_repair(ssh, dev_path):
+    try:
+        tmp_dir = exec_ssh_cmd(
+            ssh, "mktemp -d").decode().rstrip("\n")
+        LOG.debug("mounting %s on %s" % (dev_path, tmp_dir))
+        mount_out = exec_ssh_cmd(
+            ssh, "sudo mount %s %s" % (dev_path, tmp_dir)).decode()
+        LOG.debug("mount returned: %s" % mount_out)
+        LOG.debug("Umounting %s" % tmp_dir)
+        umount_out = exec_ssh_cmd(
+            ssh, "sudo umount %s" % tmp_dir).decode()
+        LOG.debug("umounting returned: %s" % umount_out)
+        out = exec_ssh_cmd(
+            ssh, "sudo xfs_repair %s" % dev_path).decode()
+        LOG.debug("File system repaired:\n%s", out)
+    except Exception as ex:
+        LOG.warn("xfs_repair returned an error:\n%s", str(ex))
+
+
 def _check_port_open(host, port):
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     try: