Memperbaiki instalasi yang tidak bisa di-boot pada root LVM dari Desktop LiveCD

9

Saya baru saja melakukan instalasi dari Desktop 10.10 LiveCD, membuat volume root menjadi LVM LV.

Rupanya ini tidak didukung; Saya mengelolanya dengan mengambil langkah-langkah ini sebelum memulai aplikasi pemasang GUI:

  • menginstal lvm2paket pada sistem yang sedang berjalan
  • membuat partisi tipe-LVM pada hard drive sistem
  • membuat volume fisik, grup volume dan root LV menggunakan alat LVM. Saya juga membuat LV kedua untuk /var; ini menurut saya tidak relevan.
  • membuat sistem file (ext4) pada masing-masing dari dua LV.

Setelah mengambil langkah-langkah ini, penginstal GUI menawarkan dua LV sebagai target instalasi; Saya dengan senang hati menerima, juga meletakkan /bootpartisi utama terpisah dari partisi LVM.

Instalasi tampaknya berjalan dengan lancar, dan saya telah memverifikasi bahwa volume root dan var memang mengandung struktur direktori yang tampak dapat diterima.

Namun, boot gagal; jika saya mengerti benar apa yang terjadi, saya dimasukkan ke busybox yang sedang berjalan di initrd filesystem.

Walaupun saya belum mengerjakan keseluruhan dokumen grub2, sepertinya entri yang mencoba mem-boot sistem baru saya sudah benar:

menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos3)'
    search --no-floppy --fs-uuid --set $UUID_OF_BOOT_FILESYSTEM
    linux   /vmlinuz-2.6.35-22-generic root=/dev/mapper/$LVM_VOLUME_GROUP-root ro   quiet splash
    initrd  /initrd.img-2.6.35-22-generic
}

Perhatikan bahwa $ VARS diganti secara aktual grub.cfgdengan nilainya yang sesuai.

Saya reboot kembali ke livecd dan telah membongkar initrd image ke direktori temp. Sepertinya gambar initrd tidak memiliki fungsionalitas LVM. Sebagai contoh, jika saya membaca /usr/share/initramfs-tools/hooks/lvm2(diinstal dengan lvm2pada sistem livecd-booted, tidak hadir pada yang diinstal) dengan benar, sebuah lvmexecutable harus terletak di /sbin; bukan itu masalahnya.

Apa cara terbaik untuk memperbaiki situasi ini? Saya menyadari bahwa akan lebih mudah untuk hanya menggunakan CD instalasi alternatif, yang tampaknya mendukung LVM, tetapi saya tidak ingin menunggu untuk mengunduh dan kemudian harus menginstal ulang.

intuisi
sumber

Jawaban:

9

Anda menekan masalah tepat di kepala: initramfs tidak memiliki dukungan LVM. Berikut cara memperbaikinya:

  1. Boot LiveCD lagi
  2. Pasang lvm2lagi di lingkungan Langsung
  3. Memunculkan Volume Group (jika -ay tidak berfungsi coba -a ya)

    vgchange -a y
    
  4. Dapatkan root LV, / boot, dan / dev terpasang di bawah pohon terpisah

    mkdir /newroot
    mount /dev/yourVG/rootLV /newroot
    mount /dev/yourbootpartition /newroot/boot
    mount -o bind /dev /newroot/dev
    
  5. Salin paket yang dibutuhkan ke pohon / newroot

    cp /var/cache/apt/archives/*deb /newroot/tmp/
    
  6. Chroot ke pohon baru dan instal paket

    chroot /newroot
    cd /tmp
    dpkg -i *.deb
    

Pada titik ini, semuanya harus kembali normal (karena initramfs akan dibuat ulang ketika lvm2 diinstal). Jika tidak, Anda bisa bermain dengan berlari update-initramfs -udi dalam chroot.

Kees Cook
sumber
Apa alasan bind-mount / dev?
intuited
Saya menambahkan / dev jika grub dijalankan kembali dan ingin mencari tahu di mana boot drive berada. Saya menggunakan dpkg dalam hal jaringan tidak naik atau aneh di dalam chroot. Jika jaringan bekerja, saya sarankan "apt-get" over "aptitude" karena ia melakukan resolusi dep yang lebih baik hari ini.
Kees Cook
Terima kasih atas tipnya apt-get, sulit untuk melacak apa. Apakah Anda memiliki tautan ke info lebih lanjut tentang itu?
intuited
1

Setelah menginstal sistem ke hard disk, Anda perlu menginstal lvm2 ke sistem itu sebelum dapat boot. Jika Anda menginstal lvm2 pada livecd, maka paket-paket tersebut masih ada di / var / cache / apt / arsip. Ubah ke direktori itu, pasang hard disk, dan instal paket ke hard disk menggunakan dpkg --root = / mnt * .deb. Dalam kasus Anda, Anda perlu me-mount root fs ke / mnt, dan juga var fs ke / mnt / var.

Anda juga tidak memerlukan partisi / boot terpisah, dan partisi / var terpisah dipertanyakan.

psusi
sumber
Bagus .. itu lebih mudah daripada chroot-ing. Saya kira ini tidak akan terdaftar dalam aptitudedb paket yang diinstal secara eksplisit, jadi saya mungkin harus menginstal lvm2dan dependensinya dengan cara ini. Adakah kerugian menggunakan terpisah /var? Selain masalah harus mengalokasikan ruang 'kendur' ekstra? Saya ingin dapat memotretnya, jadi saya tidak ingin mencampurnya dengan file variabel besar lainnya; Saya berencana untuk menghubungkan atau mengikat direktori home saya ke direktori dalam /datavolume terpisah yang akan saya buat setelah sistem dinyalakan & dijalankan, untuk menampung musik dan semacamnya.
intuited
Juga: Saya juga perlu me-mount boot fs di /mnt/boot, bukan? Saya mengumpulkan yang lvm2membangun initrd baru pada instalasi.
intuited
@intuited no, itu akan direkam sebagai diinstal secara manual seperti biasa. Ya, Anda juga perlu / boot mount jika Anda memiliki salah satunya. Memiliki / var yang terpisah tidak membantu membuat snapshot.
psusi
/varPartisi yang terpisah tidak akan membantu dengan snapshot, tidak, tetapi itu akan, misalnya, membantu mencegah root fs dari mengisi secara tak terduga. Apakah Anda mengatakan bahwa itu akan menimbulkan masalah dengan mengambil foto? Oh, tunggu, itu Anda di utas komentar pertanyaan lainnya. Nevermind ..
intuited
1

Saya akhirnya melakukan sebagian besar apa yang Kees Cook menjabarkan dengan baik, dengan bantuan dari bagian terakhir dari penelusuran ini . Namun:

  • Saya tidak mengikat /dev. Sepertinya ini menyebabkan beberapa pesan kesalahan nanti; Lihat di bawah.
  • Saya memasang /varvolume saya di root baru sebagai tambahan /boot.
  • Saya tidak menyalin hutang ke /tmproot baru. Sebaliknya, saya berlari # apt-get install aptitude; aptitude install lvm2mengejar chroot.

    • Saya melakukan ini untuk mendaftarkan tindakan ini dalam database apt: misalnya aptitude,, dan mungkin juga apt-get, akan melacak paket mana yang diinstal secara eksplisit dan yang diinstal secara otomatis sebagai dependensi.
    • Karena saya benar-benar mendapatkan paket saya melalui proxy apt lokal (berjalan apt-cacher-ng), saya bahkan tidak perlu menunggu mereka untuk mengunduh lagi. Saya memang harus membuat file /etc/apt/apt.conf.d/02proxyberisi Acquire::http::Proxy "http://local-apt-proxy-server:3142";sebelum menjalankan apt-get. Saya telah melakukan hal yang sama sebelum mulai menginstal paket saat menjalankan LiveCD sebelum melakukan instalasi.
    • Saya mendapat pesan kesalahan atau peringatan beberapa kali, menyatakan

      Can not write log, openpty() failed (/dev/pts not mounted?)
      

** mount -o bind / dev / pts / mnt / YouNameIt / dev / pts

    This did not prevent the appropriate lines from being added to `/var/log/dpkg.log`.

    I suspect that this issue could have been averted by bind-mounting `/dev`, but I don't really understand what it means, i.e. I don't know what log it's referring to, or why it would need to access a pty in order to write to a log.
intuisi
sumber
Saya menerima jawaban saya sendiri karena itu bekerja dengan baik untuk saya; lihat jawaban Kees untuk solusi serupa yang mungkin lebih dapat diandalkan dalam beberapa situasi.
intuited