
다음과 같은 문제가 있습니다. 직접 물리적으로 액세스할 수 없는 전용(베어메탈) 하드웨어 서버(Debian 10)가 있습니다. 이제 이 서버에 있는 모든 데이터와 애플리케이션을 VM으로 전송하고 KVM 호스트에서 실행하려고 합니다.
VM에 애플리케이션을 직접 설치하지 않는 이유는 무엇입니까? 이 애플리케이션(약 10년 동안 동일한 서버에서 실행되는 Apache 웹 서버와 Perl 관련)의 설치는 너무 복잡해서 뭔가를 깨뜨리고 싶을 정도입니다. 그래서 누구도 감히 그렇게 하지 못합니다. 하지만 이제 우리는 움직여야 하고 이런 이유로 현명한 해결 방법이 필요합니다.
모든 Perl 및 Apache 서비스를 끄고 dd
네트워크를 통해 하드 디스크를 전송할 생각을 했지만 문제는 대상 KVM 호스트가 sda
베어메탈 서버의 큰 호스트보다 공간이 적다는 것입니다(결국에는 호스트보다 적은 공간을 사용합니다). 사용 가능하며 sda
크기가 매우 큽니다).
두 번째 옵션은 (에 따라) 정확히 동일한 버전 번호로 동일한 패키지를 KVM에 설치하고 dpkg --list
, 베어메탈 서버의 모든 서비스를 비활성화하고(데이터 일관성을 유지하기 위해) /etc
, /var/
, /usr
및 기타 중요한 모든 항목을 넣는 것입니다. 베어 메탈 서버를 tarball에 넣고 KVM에서 압축을 풀면 됩니다. 물론 rsync를 통해서도 이 작업을 수행할 수 있지만 원칙은 거의 동일합니다.
마지막 아이디어에 대해 어떻게 생각하시나요?
다른 아이디어가 있나요?
그러한 작업을 어떻게 진행하시겠습니까?
답변1
처럼불안나에게 요청하면 내 질문에 대답하겠습니다. :) 내 솔루션은 그다지 정교하지 않았습니다.불안하지만 어쨌든 나는 그것을 여러분과 공유하고 싶습니다.
실제로 내가 한 일은 두 파일 시스템의 Inode 및 블록 크기를 먼저 확인하여 서로 동일한지 확인하는 것입니다( 를 사용하여 tune2fs
).
그런 다음 SSHd와 같은 실존 서비스를 제외한 모든 서비스를 껐습니다.
apt-clone
그런 다음 패키지와 바이너리를 한 컴퓨터에서 다른 컴퓨터로 복사하지 않고 사용하기로 결정했습니다 .
# on the physical machine:
apt-get install apt-clone
apt-clone clone packages
# on the virtual machine:
apt-get install apt-clone
apt-clone clone packages.apt-clone.tar.gz
# check on the VM:
vimdiff <(dpkg --list) physical_mchine_packages.txt
다음으로 rsync
. 내가 동기화한 디렉터리:
/root
/etc
hostname
( ,fstab
,/default/grub
및/network/interfaces
kernel/initram/lvm과 관련된 기타 디렉토리와 같은 파일은 제외했습니다 .)/usr
(모든 것이 다 그런 것은 아니며 사용하는 소프트웨어에 따라 다릅니다)/var
(모든 것이 다 그런 것은 아니며 사용하는 소프트웨어에 따라 다릅니다)
마지막 단계는 이전 물리적 시스템의 호스트 이름이나 IP 주소가 일부 구성 파일에 있는지 확인하는 것입니다.
find . ! \( -path "*proc*" -o -path "*sys*" -o -path "*var/mail*" -o -path "*var/spool/mqueue*" -o -path "*var/log*" \) -type f -exec grep -iH -- "x.x.x.x" {} \;
그게 다야. Everythink는 이제 VM에서 작동합니다. 누구에게나 도움이 되었으면 좋겠습니다 :)
답변2
(이 답변은블록 장치 수준대안으로, 가상으로 마이그레이션하는 동안 파티셔닝 및 부팅 관리자 구성을 그대로 유지하려는 경우 가장 적합합니다)
설명하신 문제가 실제로 실제로 발생하는 것은 아닙니다. 나우연히최근에 이것을 피했습니다.
하지만 문제는 대상 KVM 호스트가 베어메탈 서버의 sda보다 공간이 적다는 것입니다.
파티션을 생성, 루프 마운트 및 편집하는 것은 완벽하게 유효합니다.부족한파일의 건너뛴 영역에 실제로 데이터를 쓰는 작업을 수행하지 않는 한 호스트 파일 시스템보다 훨씬 더 큰 파일입니다.
내가 한 일은 대략 fstrim / && systemctl stop appserver && mount -o remount,ro / && sync && dd bs=64k if=/dev/nvme0n1 | ssh vmhost dd bs=64k conv=sparse of=..
. 그런 다음 VM 호스트에서 losetup
이미지를 사용 가능하게 만들고 fdisk
( resize2fs
가상) 크기를 변경했습니다. 이미지의 끝 부분에는 이미 0만 포함되어 있었기 때문에 이미지에 대한 작업을 수행해도 실제 크기가 크게 늘어나지 않았습니다.
이 가장 간단한 접근 방식에 대한 최악의 공간 요구 사항은 기존 서버의 데이터 콘텐츠의 3배입니다. 한 번은 희소 이미지를 복사하고, 한 번은 크기를 조정하고(즉, 끝에 새 구멍을 뚫지 않고 모든 내용을 처음으로 이동), 한 번 더 원시 디스크 이미지를 형식으로 변환(또는 당시 파일을 이동) 기반 이미지를 자체 논리 볼륨으로) 가상 머신 관리에 사용됩니다.
참고할 사항:
- 이 작업을 수행하는 방식은 계획된 가상화의 소프트웨어/설정에 따라 달라집니다(예: 현재 시스템이 EFI를 통해 부팅되지만 가상화가 이를 선호하지 않는 경우,디스크 사본어쨌든 부트로더 관련 작업을 언제 다시 실행해야 합니까?)
- fstrim(특히 불량 SSD 또는 RAID와 결합된 경우)은 데이터 손실 수준으로 위험할 수 있습니다. 설정이 안전한지 확신할 수 없다면 다음을 수행하십시오.널 바이트만 포함하는 거대한 파일 작성대안 - 우리는 디스크가 인식하는지 여부가 아니라 사용되지 않는 영역을 감지할 수 있는 것(제로화)에만 관심이 있습니다.
- 루트를 읽기 전용으로 설정하면 작업이 완료되지만 결과는 얻습니다.마치 가상 머신에서 다시 시작되기 전에 서버가 충돌한 것처럼 보입니다.. 애플리케이션을 중지한 후 이미지를 복사하면 다음과 같은 문제가 발생할 수 있습니다.충분하다: 결국 당신은 서버가 이미 충돌로부터 계속될 수 있다고 예상합니다.