在生产环境中我们大量使用了 kvm 的虚拟技术,虚拟机的镜像系统使用的是 Cloud-init 的技术
不可避免的,虚机会遭到各种损坏,维护的手段就十分必要了
假设我们有一个虚机文件 vis-16-41-18.qcow2 坏了
一、安装支持包
1yum install libguestfs libguestfs-tools
二、查看日志
1virt-log -a vis-16-41-18.qcow2
没有什么特殊的报错信息
三、分析文件系统组成
virt-filesystems和virt-df都可以,用virt-df看的更多一些
1virt-filesystems -l -a vis-16-41-18.qcow2
2Name Type VFS Label Size Parent
3/dev/sda1 filesystem ext4 - 209715200 -
4/dev/sda2 filesystem ext4 - 214536355840 -
5
6virt-df -a vis-16-41-18.qcow2
7Filesystem 1K-blocks Used Available Use%
8vis-16-41-18.qcow2:/dev/sda1 194241 31706 152295 17%
9vis-16-41-18.qcow2:/dev/sda2 206088704 5639856 189973444 3%
四、挂载文件系统开始修复(方法1)
从上面可以看到 vis-16-41-18.qcow2 里面有两个分区,/dev/sda1 和/dev/sda2
第一个应该是/boot,第二个是/
把 / mount 出来
1mkdir 18
2guestmount -a vis-16-41-18.qcow2 -m /dev/sda2 --rw ./18
或者全自动mount
1guestmount -a vis-16-41-18.qcow2 -i --rw ./18
这样就可以直接进18目录进行修复操作了
1cd 18/lib64
2ls libc*.*
发现同事胡乱升级glibc,把libc的基础库弄坏了,少libc.so.6的软链接,建立一个修复即可
1ln -s libc-2.15.so libc.so.6
五、挂载文件系统开始修复(方法2)
我们可以用 guestmount,也可以直接用 guestfish 。
guestfish 是个命令行工具。它使用 libguestfs 的所有功能。
1guestfish
2
3Welcome to guestfish, the libguestfs filesystem interactive shell for
4editing virtual machine filesystems.
5
6Type: 'help' for help on commands
7 'man' to read the manual
8 'quit' to quit the shell
9
10><fs> add vis-16-41-18.qcow2
11><fs> run
12><fs> list-filesystems
13/dev/sda1: ext4
14/dev/sda2: ext4
15><fs> mount /dev/sda2 /
16><fs> cat /etc/fstab
17
18#
19# /etc/fstab
20# Created by anaconda on Mon Dec 29 15:24:53 2014
21#
22# Accessible filesystems, by reference, are maintained under '/dev/disk'
23# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
24#
25UUID=9fdc111c-3042-4527-b3f8-a2961e55077e / ext4 defaults 1 1
26UUID=1855d5e1-18f8-48ea-8c3b-c52cdd512a5e /boot ext4 defaults 1 2
27tmpfs /dev/shm tmpfs defaults 0 0
28devpts /dev/pts devpts gid=5,mode=620 0 0
29sysfs /sys sysfs defaults 0 0
30proc /proc proc defaults 0 0
31
32><fs>
guestfish的常用命令:
1add vis-16-41-18.qcow2
2run
3list-filesystems
4
5ll /
6ls /
7cat /etc/fstab
8write-append /etc/rc.d/rc.local "service sshd start"
9edit /etc/fstab.
10less /var/log/messages
11mkdir /tmp/a
12touch /tmp/a/b.txt
13write /tmp/a/b.txt
14rm /tmp/a/b.txt
15
16upload Upload a local file to the disk. ###注意:是上载本地文件到镜像文件去!!!
六、virt对应guestfish的一些命令
1virt-cat vis-16-41-18.qcow2 /home/supdev/.bash_history
2
3virt-copy-in Copy files and directories into a guest.
4virt-copy-out Copy files and directories out of a guest.
5
6virt-edit Edit a file in a guest.
7virt-ls List files and directories in a guest
七、virt-rescue救援模式
如果虚机系统起不来,可以先尝试进入 rescue 救援模式
virt-rescue
类似于救援 CD,但用于虚拟机,且无需提供 CD。
virt-rescue 为用户提供救援外壳和一些简单的恢复工具,可用于检查和更正虚拟机或磁盘映像中的问题。
1virt-rescue -a vis-16-41-18.qcow2
2Welcome to virt-rescue, the libguestfs rescue shell.
3
4Note: The contents of / are the rescue appliance.
5You need to mount the guest's partitions under /sysroot
6before you can examine them. A helper script for that exists:
7mount-rootfs-and-do-chroot.sh /dev/sda2
8
9><rescue>
10[ 67.194384] EXT4-fs (sda1): mounting ext3 file system
11using the ext4 subsystem
12[ 67.199292] EXT4-fs (sda1): mounted filesystem with ordered data
13mode. Opts: (null)
14mount: /dev/sda1 mounted on /sysroot.
15mount: /dev bound on /sysroot/dev.
16mount: /dev/pts bound on /sysroot/dev/pts.
17mount: /proc bound on /sysroot/proc.
18mount: /sys bound on /sysroot/sys.
19Directory: /root
20Thu Jun 5 13:20:51 UTC 2014
21(none):~ #