23

从PTTYPE="dos"到TYPE="LVM2_member"的救援

 4 years ago
source link: https://zhangguanzhang.github.io/2019/12/03/dos-to-gpt/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

同事叫我救援一台云主机,虽说是虚拟机,但是类比到硬件服务器还是一样的操作,这里记录下给后来者查阅

故障信息

控制台进去看到centos7的背景虚化的数字7+转圈,重启下看下完整的错误,重启选了内核然后进到图形界面的时候按下ecs取消,观察终端

[  OK ] Started Show Plymouth Boot Screen.
[  OK ] Reached target Paths.
[  OK ] Reached target Basic System.
[  124.522110] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
[  125.034736] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
[  125.542788] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
[  126.522110] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
[  127.068643] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
[  127.576830] dracut-initqueue[240]: Warning: dracut-initqueue timeout - starting timeout scripts
...
[  185.082387] dracut-initqueue[240]: Warning: Could not boot.
[  185.118736] dracut-initqueue[240]: Warning: /dev/centos/root does not exist
[  185.119239] dracut-initqueue[240]: Warning: /dev/mapper/centos-root does not exist
          Starting Dracut Emergency Shell...
Warning: /dev/centos/root does not exist
Warning: /dev/mapper/centos-root does not exist
Generating "/run/initramfs/rdsosreport.txt"

Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stack or /boot
after mounting them and attach it to a bug report.

dracut:/#

处理

挂载iso进救援模式

关闭虚机,后台拷贝下系统盘的卷。然后给虚机的IDE光驱挂载了个centos的iso,修改虚机启动顺序到ISO,进 Troubleshooting –> Rescue a CentOS Linux system

1) Continue
2) Read-only mount
3) Skip to shell
3) Quit (Reboot)
Please make a selection from the above: 1

选择了1后提示没有任何Linux分区

=====================================================================================
=====================================================================================
Rescue Mount

You don't have any Linux partitions. The system will reboot automatically when you exit from the shell.
Please press <return> to get a shell.

按下回车进入交互式shell

sh-4.2# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
vda             252:0    0    40G  0 disk 
├─vda1          252:1    0     2M  0 part
├─vda2          252:2    0   200M  0 part
└─vda3          252:3    0  39.8G  0 part
vdb             252:16   0   400G  0 disk
loop0             7:1    0 420.3M  1 loop
loop1             7:1    0     2G  1 loop
├─live-rw       253:0    0     2G  0 dm    /
└─live-base     253:1    0     2G  1 dm
loop2             7:2    0   512M  1 loop
└─live-rw       253:0    0     2G  0 dm    /
sh-4.2# fdisk -l /dev/vda

Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ad4f2

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1            2048        6143        2048   83  Linux
/dev/vda2   *        6144      415743      204800   83  Linux
/dev/vda3          415744    83886079    41735168   8e  Linux LVM
sh-4.2# blkid
/run/install/repo/LiveOS/squashfs.img: TYPE="squashfs"
/dev/sr0: UUID="2018-05-03-20-55-23-00" LABEL="Centos 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/sr1: UUID="2019-11-01-16-33-37-00" LABEL="config-2" TYPE="iso9660"
/dev/vda1: UUID="e438c18a-c97d-432c-ae66-a538cd1fbb4d" TYPE="xfs"
/dev/vda3: PTTYPE="dos"
/dev/loop0: TYPE="squashfs"
...

查看下块,vda2是boot,vda3是lvm也就是根所在,问题是 /dev/vda3: PTTYPE="dos" 不知道为何变成了dos类型,正常应该是 TYPE="LVM2_member"

/dev/vda3: UUID="xxxxxxxxxxxxxx" TYPE="LVM2_member"

重做lvm为了去掉PTTYPE=”dos”

尝试着重做pv试试

sh-4.2# vgremove centos
Do you really wanto ro remove volume group "centos" containing 1 logical volumes? [y/n]: y
  Logical volume "root" successfully removed
  Volume group "centos" successfully removed
sh-4.2# pvremove /dev/vda3
  Labels on physical volume "/dev/vda3" successfully wiped.
sh-4.2# pvcreate /dev/vda3
WARNING: dos signature detected on /dev/vda3 at offset 510. Wipe it? [y/n]: y
  Wiping dos signature on /dev/vda3.
  Physical volume "/dev/vda3" successfully created.
sh-4.2# vgcreate centos /dev/vda3
  Volume group "centos" successfully created
sh-4.2# lvcreate -n root -l 100%FREE centos
  Logical volume "root" created
sh-4.2# mkdir /mnt/root
sh-4.2# mount /dev/centos/root /mnt/root

输出被滚动冲没了,大致就是lvcreate的时候提示有xfs标签,不擦除,最终得到了个残缺的的 /dev/centos/root ,然后 xfs_repair 后重启也无法开机。再次进救援模式挂载了chroot进去发现报错 /bin/bash no such file ,才意识到损坏了文件,很多so都丢了

留有备份,打算在文件层面恢复

最后也应该是最开应该做的正确操作

下发了台不是lvm的centos7.6机器,然后给该机器挂载了数据盘为vdb(50G,其实大于等于故障机器根的真实占用大小即可),备份的卷挂载为vdc。利用数据盘中转下原有的文件

打算把lvm的文件系统文件拷贝到数据盘vdb的文件系统,然后在故障机器的救援模式下挂载这个数据盘,把数据盘的根文件拷贝到残缺的系统盘的根下

格式化vdb

[root@fix-data ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
sr1     11:1    1  464K  0 rom  
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0   50G  0 disk 
[root@fix-data ~]# parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                      
(parted) mkpart                                                           
Partition name?  []? 1                                                    
File system type?  [ext2]? xfs                                            
Start? 1                                                                  
End? 100%                                                                 
(parted) p                                                                
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  53.7GB  53.7GB               1

(parted) q                                                                
Information: You may need to update /etc/fstab.

[root@fix-data ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=3276672 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=13106688, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=6399, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
mkdir[root@fix-data ~]# mkdir -p /mnt/{root,data}

挂载需要修复的系统盘的克隆卷

后台挂载好后

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
sr1     11:1    1  464K  0 rom  
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0   50G  0 disk 
└─vdb1 253:17   0   50G  0 part 
vdc    253:32   0   40G  0 disk 
├─vdc1 253:33   0    2M  0 part 
├─vdc2 253:34   0  200M  0 part 
└─vdc3 253:35   0 39.8G  0 part

安装lvm2工具(新机器因为不是lvm的根分区所以系统没有安装这个)

yum install -y lvm2

激活lvm状态

$ vgchange -a y
  1 logical volume(s) in volume group "centos" now active

根 –> /mnt/root/

/boot –> /mnt/root/boot

数据盘 –> /mnt/data/

mount /dev/centos/root /mnt/root/
mount /dev/vdc2 /mnt/root/boot
mount /dev/vdb1 /mnt/data

然后拷贝

cp -a /mnt/root/* /mnt/data/

拷贝完后取消挂载并关机

umount /mnt/data/
umount /mnt/root/boot/
umount /mnt/root/
poweroff

拷贝

后台把该数据盘挂载到故障机器上,故障机器在救援模式里操作

sh-4.2# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0              11:0    1   4.2G  0 rom  /run/install/repo
sr1              11:1    1   464K  0 rom 
vda             252:0    0    40G  0 disk 
├─vda1          252:1    0     2M  0 part
├─vda2          252:2    0   200M  0 part /mnt/sysimage/boot
└─vda3          252:3    0  39.8G  0 part 
  └─centos-root 253:2    0  39.8G  0 lvm  /mnt/sysimage
vdb             252:16   0   400G  0 disk
vdc             252:32   0    50G  0 disk
└─vdc1          252:33   0    50G  0 part
loop0             7:1    0 420.3M  1 loop
loop1             7:1    0     2G  1 loop
├─live-rw       253:0    0     2G  0 dm    /
└─live-base     253:1    0     2G  1 dm
loop2             7:2    0   512M  1 loop
└─live-rw       253:0    0     2G  0 dm    /

可以看到数据盘为vdc,挂载vdc1到 /mnt/data ,然后拷贝到 /mnt/sysimage

sh-4.2# mkdir /mnt/data
sh-4.2# mount /dev/vdc1 /mnt/data
sh-4.2# ls -l /mnt/data
total 16
lrwxrwxrwx    1 root root    7 Jul 24  2018 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jul 24  2018 boot
drwxr-xr-x.   2 root root   18 Dec  3 04:24 dev
drwxr-xr-x. 143 root root 8192 Dec  3 03:54 etc
drwxr-xr-x.   3 root root   20 Jul 25  2018 home
lrwxrwxrwx    1 root root    7 Jul 24  2018 lib -> usr/lib
lrwxrwxrwx    1 root root    9 Jul 24  2018 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   4 root root   34 Nov  1 17:19 opt
drwxr-xr-x.   2 root root    6 Jul 24  2018 proc
dr-xr-x---.   9 root root  258 Nov  5 16:14 root
drwxr-xr-x.   2 root root    6 Jul 24  2018 run
lrwxrwxrwx    1 root root    8 Jul 24  2018 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
drwxr-xr-x.   2 root root    6 Jul 24  2018 sys
drwxrwxrwt.   7 root root  114 Dec  3 04:55 tmp
drwx------    7 root root   66 Jul 24  2018 usr
drwxr-xr-x.  21 root root 4096 Jul 24  2018 var
drwxr-xr-x.   2 root root    6 Nov  4 02:09 version
sh-4.2# cd /mnt/sysimage
sh-4.2# cp -a /mnt/data/* .

重做grub.cfg,该系统不是grub2,如果是grub2则/boot下有grub2目录

mount -o bind /dev /mnt/sysimage/dev
mount -o bind /proc /mnt/sysimage/proc
mount -o bind /run /mnt/sysimage/run
mount -o bind /sys /mnt/sysimage/sys
mv boot/grub/grub.cfg{,.bak}

然后chroot进来生成 grub.cfg

chroot .
grub-mkconfig -o /boot/grub2/grub.cfg

开机正常


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK