El ile klonlama / sanal diski yeniden oluşturma


7

Sanal bir disk görüntüsünü oldukça manuel bir şekilde klonlamaya çalışıyorum. Metodolojime genel bakış şu şekildedir:

  1. VirtualBox'da 120GB HDD'ye sahip sanal makine oluşturun (hiper yönetici ve HDD boyutu önemli değil, çoğunlukla sorumun tamamıyla bütünlüğü ve tutarlılığı içeriyor, örneğin bölüm boyutları gibi)
  2. Ubuntu 12.04.3'ü sanal makineye yükleyin
  3. Sanal makineyi kapat
  4. Sanal makine ile ilişkilendirilmiş sanal sabit diski takın
  5. Bir dizinde depolamak için işletim sistemi dosyalarını ve verileri ayıklayın
  6. Sanal sabit disk meta verilerini kaydedin
  7. Yeni sanal disk oluşturun ve bölümleri ve önyükleme bilgilerini geri yükleyin (6)
  8. Verileri (5) den doğru bölüme geri yükle

Sorun

Kopyalanan VM'im tam olarak açılmıyor. Grub kopyalamak görünüyor ve görünür (Ubuntu üzerinde yüklü) benim kök bölümü kabul etmek. Grub'u bir kez önyükleyebilir ve Ubuntu'nun yükleneceği gibi mor bir ekran alabilirim. Sonra durur. Ondan sonra Grub'a boot edebilirim, işletim sistemimi seçebilirim, sonra yanıp sönen bir komut satırı imleci elde ederim. Giriş mümkün değil. Klonlama sürecinde eksik olduğum bir şey olduğundan şüpheleniyorum (daha fazla ayrıntı için aşağıya bakın). Not: Grub2 kullanıyorum, eski değil.

Bunu neden yapıyorsun?

Sözleşmeye bağlı bir gereksinimin parçası olarak, sanal diski sürüm denetiminde saklamam gerekiyor. Sürüm kontrolünde muazzam bir ikili bloğun (sanal disk) olması, çoğunlukla klon (git) / ödeme (svn) için değil aynı zamanda farklılıklar için de acı vericidir. Birden fazla dosyaya sıkıştırmayı düşündüm, ancak yukarıda (5) 'te çıkarılan işletim sistemi / verileri değiştirebilmem gerekiyor. VCS depomun hala tam bir VM oluşturmak için gereken tüm bilgilere ihtiyacı olduğunu unutmayın.

detay

Tarif ettiklerimi çoğaltmak için ayrıntılı talimatlar:

  1. Bir VM oluşturun ve Ubuntu Live CD'sini başlatın
  2. "Ubuntu'yu Dene" yi seçin
  3. Bir terminal aç
  4. Bir msdos bölümü oluşturun: sudo parted / dev / sda mklabel msdos
  5. 2GB takas dosyası oluşturun: sudo parted / dev / sda mkpart primer linux-swap 2048'ler 4198399s
  6. Sürücünün geri kalanını kök bölüm için kullanın: sudo parted / dev / sda mkpart birincil ext4 4198400s 100%
  7. Makineyi yeniden başlatın, "Ubuntu Yükle" yi seçin
  8. Gelişmiş bölümleme seçeneğini seçin
  9. Takas bölümünü çift tıklayın, takas olarak kullanmayı seçin
  10. Kök bölümünü çift tıklatın, biçimlendirmeyi seçin ve kök (/) bağlama noktası için kullanın

Şimdi diski klonlamak için aşağıdakileri yapın:

# Set up some parameters
ORIG_DEV="/dev/nbd0"
ORIG_MNT=$(mktemp -d)
ORIG_IMG="orig.vdi" 
CLONE_DEV="/dev/nbd1"
CLONE_MNT=$(mktemp -d)
CLONE_IMG="clone.vdi"
qemu-img info $ORIG_IMG # save the "virtual size" output (in bytes) in the
                        # VIRT_SIZE variable in the next command
VIRT_SIZE="128849018880"

# Create the clone disk
qemu-img create -f vdi $CLONE_IMG $VIRT_SIZE

# Use qemu to make both disks accessible
modprobe nbd
qemu-nbd -c $ORIG_DEV $ORIG_IMG
qemu-nbd -c $CLONE_DEV $CLONE_IMG

# Set up the clone disk partition table and partitions
parted $CLONE_DEV mklabel msdos
parted $CLONE_DEV mkpart primary linux-swap 2048s 4198399s
parted $CLONE_DEV mkpart primary ext4 4198400s 100%

# Format the clone disk partitions and clone the UUIDs
mkswap $CLONE_DEVp1 -U $(blkid $ORIG_DEVp1 -s UUID -o value)
mkfs.ext4 $CLONE_DEVp2 -U $(blkid $ORIG_DEVp2 -s UUID -o value)

# Mount both disks and copy root from the original to the clone
mount $CLONE_DEVp2 $CLONE_MNT
mount $ORIG_DEVp2 $ORIG_MNT
find $ORIG_MNT -maxdepth 1 -mindepth 1 | xargs -I{} cp -ar {} $CLONE_MNT
umount $ORIG_MNT
umount $CLONE_MNT

# Copy the boot sector and partition table from the original
dd if=$ORIG_DEV of=$CLONE_DEV bs=$((2048*512)) count=1

# Disconnect the disks
qemu-nbd -d $CLONE_DEV
qemu-nbd -d $ORIG_DEV

Başka ne denedin?

  1. grub-install --root-directory = / yol / to / klon / aygıt / önyükleme / / dev / clone_device. Bu, Grub'u doğru cihaza kurdu ancak ana bilgisayarımın cihaz detayları. VM önyükleme yapmaz.
  2. Klon disk içine chroot, sonra grub-install. Karşılaştığım sorun, 32 bit konukları klonlamak için 64 bit ana bilgisayarı kullanabilmem gerektiğinden. Bu, araştırılacak umutlu bir yol gibi görünüyor, ancak bunu nasıl yapacağım konusunda sıkıştım.
  3. Sanal diski takın, tüm dosyaları kullanarak veri bölümünden çıkarın, verileri mvsıfırlayın ve bölümleri değiştirin ( dd if=/dev/zero of=/dev/nbd0p2) ve sanal diski (kullanarak VBoxManage modifyhd clone.vdi --compress) sıkıştırın . Disk, bu boş alanla (hah!) Doldurduğu için ana bilgisayar dosya sistemimde genişlemeye başladı. Bunun ddolduğunu fark ettiğimde durdum , sonra disk görüntüsünü sıkıştırdım. Hala 3GB bitti. (Gzip / bzip'i kullanmayı denemedim, bu akşam bu denemeye başlayacağım. Ayrıca dd silme işleminin tamamlanmasına izin vermeye çalışacağım, ancak bu işe yarasa bile daha az zaman alan bir çözüm tercih ederim.) .
  4. e2image. Diğer sorumu görün: e2image dosya sistemi meta verilerini geri yükleme . Bunu çözmedim. Adımlar Ben de sağladığını unutmayın Detay bölüm oluşturma, biçimlendirme ve önyükleme kesimi kopyalama dahil bölümünde, ancak önce ben kök bölümü kopyalamak, e2image yarattığı buna çok benzer bir büyüklükte görüntü dosyası üretmek.
  5. Grub-install programını çalıştırmak için başka bir VM'ye önyükleme yapın. Bunu aslında yapmadım, ancak birinin önermesi durumunda buraya dahil ettim. Kullanıcılarım için sanal makinenin yeniden kodlanabilmesi için yeniden düzenlemeye ihtiyacım var; Bu, ilgili bir kurulum sürecini engeller.
  6. Grub yerine extlinux'u kurun. Başarısız olsa da, bu alıştırma (sanırım!) Bootloader'ın ram diskini bölümümden başarıyla yüklediğini ancak bu noktada takılıp kaldığını gösteriyor.

Eğer bu kadar ileri girdiysen, şimdiden teşekkür ederim! Soruşturma yolları için yapılan öneriler, ancak ne yazık ki, çok fazla takdir edilmeyecektir. Şimdiden teşekkürler.


Bütünlüğü için +1; Keşke daha fazla yardım edebilseydim
Kanadalı Luke

1
e2image adam -ryerine parametreden bahseder -Q. Size kesinlikle yardımcı olabilecek, yaratıcısı Theodore Ts'o ile bağlantı kurmayı deneyebilirsiniz .
harrymc

Teşekkürler @CanadianLuke, ben de! @harrymc, kullanmayı düşünmemiştim, e2image -rçünkü deneyimlerime göre Windows, seyrek dosyaları depolamak konusunda çok iyi bir iş çıkarmıyor; Bununla birlikte, söz konusu Windows deneyimimdeki seyrek dosyalar ile olan deneyimim çok sınırlı, bu zorlukla takip ettim ve kesinlikle daha fazla araştırma yapmak için gerekli görünüyor; öneri için çok teşekkür ederim, ben bir göz atacağım ve nasıl gideceğini size bildireceğim.
mkingston

Yanıtlar:


4

Sanal disk içeriğini çıkarma ve yeniden oluşturma gereksinimini ortadan kaldıran alternatif bir teklifim var.

Git kullanıyorsanız, doğrudan takılı sanal disk üzerinde çalışabilir ve .git dizininizi başka bir yerde saklayabilirsiniz. Tek şey, muhtemelen sanal diskinizde kök bölümünün kök dizininde .gitignore (varsa) olması gerekir.

EDIT:
Klonlamak için, ilk kurulumdan sonra normal VirtualBox mekanizmasını kullanabilirsiniz. Belirli bir sürümü geri yüklemek istediğinizde, orijinal belgeden başka bir klon oluşturun, sonra ekleyin ve git check-out yapın.
Grub sürümü farklı olmadığı sürece, yapmanız gereken tek şey bu. Grub sürümü farklıysa, VM'yi 12.04.3.iso'dan başlatmanız ve grub kurulumu yapmanız gerekecektir.

Bu şekilde, alternatif iş akışı şöyledir (yeni adım 4, değiştirilmiş adım 5) :

  1. 120 GB HDD ile VirtualBox'da sanal makine oluşturun
  2. Ubuntu 12.04.3'ü sanal makineye yükleyin
  3. Sanal makineyi kapat
  4. Sanal makine klonu, bir kenara bırakın
  5. Oringinal veya ilk klonun sanal sabit diskini takın (örn. / Media / virtual)
  6. cd / medya / sanal
  7. git --git-dir = / başka bir yer / else / virtual.git --work-tree =. içinde
  8. git --git-dir = / başka bir yer / else / virtual.git --work-tree =. eklemek .
  9. git --git-dir = / başka bir yer / else / virtual.git --work-tree =. commit -m "İlk içe aktarma"
  10. ... başka git git görevler ...

Her zaman eklemek istemiyorsanız --git-dir = / başka bir yerde / else / virtual.git --work-tree =. , Stackoverflow'ta ondan nasıl kurtulacağımı açıklayan bir soru var: .git klasörünü izlemek istediğim dosyaların dışında saklayabilir miyim?

Tam olarak istediğin gibi değil, ama problem tanımın bana işini bitirmekle daha çok ilgilendiğin izlenimini veriyor.


Bu cevabı yazarken, klonlamadan bahsetmeyi unuttum. Bunu şimdi ekledim.
Markus N.

Cevabınız için teşekkür ederim. Cevap vermedeki gecikme için özür dilerim. Yanılıyor olabilirim ama bunun benim sorunumu çözmediğini düşünüyorum. İşletim sistemi / veri dosyalarını VHD'nin kendisine değil sürüm bilgisinde saklar (yanılıyorsam düzeltin). VHD'yi yeniden kurmaya çalışıyordum çünkü işletim sistemi ve verilerde sürüm kontrolü olması gerekiyordu . Temel bölüm bilgisini ve önyükleme sektörünü içeren bir "kabuk" olarak yönetilebilir bir boyuttur, ancak ext4 meta verileri ve / veya işletim sistemi dosyaları üzerinde olduğunda, çok büyüktür. Her durumda akıllıca bir fikir için +1, tekrar teşekkürler.
mkingston,

Evet, doğru ... sadece dosya saklar. Belki seni yanlış anladım, ama tüm sanal diski blob olarak kullanmaktan kaçınmak için istediğin şeyin bu olduğunu düşündüm.
Markus N.

İletişim hatası benim. VCS deposunda, çalışan bir OVA oluşturmak için tüm bilgilere ihtiyacım var. İdeal olarak, işletim sisteminin / verilerin bir kopyasını (ayrı dosyalar olarak), çok küçük bir "kabuk" VHD'yi ve VHD ve işletim sistemini / verilerini çalışan bir VM'de yeniden birleştirmeye yarayan bir komut dosyası içerecektir. Sorumun bu gereksinimi gidermek için gerekli bilgilere sahip olduğunu düşünüyorum, ancak olabileceğinden daha az açık. Bunu yansıtacak şekilde soruyu güncelleyeceğim. Zekice bir fikir ve soruyu cevaplamak için gösterdiğiniz çaba için tekrar teşekkürler, gerçekten minnettarım.
mkingston

Cevabınız benim sorunumu çözdüğü için (size cevabı vermedim!) Fakat açıkça yarısını alacağınız için ödül aldım, çünkü bunun yine de yarısını alacağınız için, ve zekice düşünmeniz ve öneriniz için bir teşekkür olarak .
mkingston

3

Belki bunu zaten denedin, belki yapmadın. Ancak Grub2'yi "yinelenen VM" içindeki bir Live CD'den yeniden yüklemeyi denediniz mi? Okuduğum her şey, sanki ana makineden Grub 2'yi yüklüyor gibiydi.

  • Önyüklenmeyecek bir kopyalanmış VM'nin olduğu noktaya geldiğinizde
  • VM'ye Ubuntu Takma diski gibi bir Canlı CD takın
  • VM'yi önyükleyin ve Canlı CD'den önyüklemek için F12'ye basın
  • Grub'u komut satırından (VM içinde) yeniden kurun

İşlemi otomatikleştirmek istiyorsanız, VBoxManagebaşlangıçta Grub2'yi yeniden yüklemek için bir komut dosyası çalıştıran özel bir Ubuntu Live CD'si yerleştirmek için kullanabilirsiniz .

VBoxManage storageattach "io" --storagectl "IDE Controller" \
--port 1 --device 0 --type dvddrive --medium debian-6.0.2.1-i386-CD-1.iso

Örnek Kaynak

Umarım çok eski değildir , Live CD'yi özelleştirmek için help.ubuntu.com adresinde bir kılavuz ve askubuntu.com adresinde özelleştirilmiş bir Live CD'ye bir başlangıç ​​komut dosyası eklenmesini içeren bir Stack Exchange sorusu / yanıtı bulunur.


Bunun işe yarayacağını kesinlikle umuyorum; ancak bir betiği olan çözümü çalıştırabilmeliyim (bkz. madde 5 What else have you tried?), böylece bir kullanıcı depoyu makinelerine aktardığında (git klonlama veya svn ödeme) vm'yi kurucu dosyalardan kolayca oluşturabilir. Bunu yazmanın mümkün olabileceğinden şüpheleniyorum, ancak muhtemelen şimdiki çabalarımın bazılarını takip etmekten daha fazla çalışma gerektiriyor. Bunun yanlış olduğunu düşünüyorsanız, bilmek isterim. Her durumda katkınız için teşekkür ederiz.
mkingston

"Başka bir sanal makine" demek istediğini yanlış anlamış olmalıyım. Aklıma gelen bir şey VBoxManage, Live CD'yi takma komutunu kullanmak ve Grub2'yi yeniden yüklemek için başlangıçta bir komut dosyası çalıştıran özel bir canlı CD oluşturmak. Buradaki bariz zorluk özel Live CD'dir, ancak çevrimiçi Live CD'leri kolayca oluşturabilmenizi sağlayan birkaç öğreticim ve aracım var. İstediğiniz paketleri seçmenize ve bir başlangıç ​​betiği yüklemenize izin veren bir OpenSUSE Live CD'si oluşturmanıza izin veren çevrimiçi bir araç vardı.
Drew Chapin

Zamanım olursa, bugün daha sonra etrafa bakacağım ve özel Live CD'nin nasıl yapılacağına dair bir öneride bulunacağım.
Drew Chapin

Sadece güncellemenizi ve yorumlarınızı gördüğümü ve henüz herhangi bir işlem gerçekleştirecek zamanım olmadığını söylemek istedim. En kısa zamanda biraz okuma / deneme yapacağım. Bunun için teşekkürler.
mkingston

Maalesef bugüne kadar bununla başa çıkamadım. Görünen o ki, canlı CD'den başarılı bir şekilde kurmak için grubumu alamam. Bazı dosya sistemi meta verilerinde sorun olduğunu düşünüyorum. Yine de önerin için teşekkürler.
mkingston

3

Ubuntu bağlama noktası hakkında fazla bir fikriniz yok gibi görünüyor? VM'yi birden fazla bölüme ayırmayı düşündünüz mü?

aşağıdaki linkten:

http://www.easy-ubuntu-linux.com/ubuntu-installation-606-12.html

basit bir kurulum SWAP için sadece 4G, + 1G, / tmp için + 2G, sonra / usr, / var, / home, / opt için ayrı bölümler oluşturabilirsiniz.

Başlangıçta her biri için sadece 1G yapın, gerektiğinde sanal kutu ile dinamik olarak büyütün

referans:

http://www.ubuntugeek.com/linux-or-ubuntu-directory-structure.html

Daha sonra, SVC kapsamınızı belirleyebilir, yalnızca kullanıcı dosyaları veya günlükleri veya işletim sistemi? hangi sürümünde çok daha az acı olabilir.

çoğu durumda, /, / usr ve / opt'i salt okunur ve kurulumdan sonra değiştirilemez hale getirebilir ve genel sürüm baş ağrısını azaltabilirsiniz.

ancak bir şey hatırlatmaktır, sözleşme durumunuz olarak sanal diskinizi saklamanız gerekir, sanırım sanal diskten ayıklanan verileri depolamak sözleşmenizle uyuşmuyor. Ancak birden fazla sanal disk eşleşmesini saklamak. Bu yüzden size montaj noktası yaratmanızı ve sonra bunların bir kısmını sadece okumalarını sağlamanızı öneriyorum (yani bunların sadece 1 versiyonu var).

sadece bir not daha, bağlama noktasının dosya erişim tarihini kapatabilir misiniz kontrol etmeyi unutmayın? (bazı çok yüksek güvenlik ayarları bilgisayar kapatılmasına izin vermez)

Erişim tarihi, erişim tarihi açıksa, aslında diske yazıldığından. Bu nedenle, 2. günde erişilen sanal disk / bağlama noktası, hiçbir şey yazılmamış olsa bile, 1. günde sanal disk / bağlama noktasıyla farklıdır.

başvuru (erişim zamanı yok):

https://askubuntu.com/questions/59179/how-do-i-make-noatime-mounts-default


Bu senaryoda, birden fazla bölüm içeren bir sanal disk yerine birden fazla sanal disk öneririm. Aksi takdirde, onları VCS'nin görünümünden ayıramazsınız.
Markus N.

Bu işlem, ödeme sırasında büyük dosyaların aktarılması sorununu çözmez. Ancak, farklı bölümler içeren birden fazla VHD kullanmak bunu yapabilir. Bu, serbest bırakma gereksinimlerime biraz bağlı olabilir (ki henüz henüz net değilim). Öneriniz için teşekkür ederiz.
mkingston,

0

Bunun üzerine bir düşünce daha düşüneceğim /etc/fstab. Bölümleriniz burada nasıl tanımlanır? Onlar tarafından tanımlanırsa UUID, belki de bu bilginin klonlama işlemiyle çoğaltılmaması ihtimali vardır. Bunları, /dev/sda0örneğin , cihaz adları ile tanımlanmış hale getirmek isteyebilirsiniz .

Bir diğer nokta, neden olmasın budala çalıştırmak için içeriden sanal makinenin kendisi? Deponuzun bulunduğu ana bilgisayarda bir dizin olduğunu düşünebilirim. Sanal makine daha sonra bu dizini bağlayabilir ve gitsanal makine üzerinde çalışabilir .


Öneriniz için teşekkür ederiz. Gerçekten UUID'leri klonladım ve fstab'ın cihaz adları yerine bunlara referans verdiğini onayladım. Ne yazık ki, VHD'nin kendisinin VCS deposunda olması gerekir, çünkü VM'in içinden gitmekte olan cevabınızı yanlış anlamadığım sürece, depodaki büyük ikili dosyaların klonlama / ödeme / farkından kaynaklanan sorunu azaltmaz.
mkingston
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.