Naprawianie niemożliwej do uruchomienia instalacji w katalogu głównym LVM z Desktop LiveCD

9

Właśnie wykonałem instalację z LiveCD 10.10 Desktop, dzięki czemu wolumin root to LVM LV.

Najwyraźniej nie jest to obsługiwane; Udało mi się to, wykonując następujące kroki przed uruchomieniem aplikacji instalatora GUI:

  • instalowanie lvm2pakietu w działającym systemie
  • tworzenie partycji typu LVM na systemowym dysku twardym
  • tworzenie woluminu fizycznego, grupy woluminów i głównego LV za pomocą narzędzi LVM. Stworzyłem także drugą LV dla /var; to nie wydaje mi się istotne.
  • tworzenie systemu plików (ext4) na każdym z dwóch LV.

Po wykonaniu tych kroków instalator GUI zaoferował dwa LV jako cele instalacji; Z przyjemnością się zgodziłem, także /bootna partycję podstawową oddzielną od partycji LVM.

Wydawało się, że instalacja przebiegła bezproblemowo, a ja zweryfikowałem, że zarówno woluminy root, jak i var zawierają struktury katalogów, które wyglądają na akceptowalne.

Jednak uruchamianie nie powiedzie się; jeśli dobrze zrozumiałem, co się stało, zostałem upuszczony do busybox działającego w systemie plików initrd.

Chociaż nie przepracowałem jeszcze całej dokumentacji grub2, wygląda na to, że wpis, który próbuje uruchomić mój nowy system, jest poprawny:

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
}

Zauważ, że $ VARS są zastępowane w rzeczywistości grub.cfgich odpowiednimi wartościami.

Uruchomiłem ponownie z powrotem do livecd i rozpakowałem obraz initrd do katalogu tymczasowego. Wygląda na to, że obrazowi initrd brakuje funkcjonalności LVM. Na przykład, jeśli czytam /usr/share/initramfs-tools/hooks/lvm2(zainstalowany lvm2w systemie uruchomionym na LIVECD, nieobecny na zainstalowanym) poprawnie, lvmplik wykonywalny powinien znajdować się w /sbin; tak nie jest.

Jaki jest najlepszy sposób na zaradzenie tej sytuacji? Zdaję sobie sprawę, że łatwiej byłoby po prostu użyć alternatywnej instalacyjnej płyty CD, która najwyraźniej obsługuje LVM, ale nie chcę czekać na pobranie, a następnie ponowne zainstalowanie.

intuicyjny
źródło

Odpowiedzi:

9

Trafiłeś w sedno problemu: initramfs nie obsługuje LVM. Oto jak to naprawić:

  1. Uruchom ponownie LiveCD
  2. Zainstaluj lvm2ponownie w środowisku Live
  3. Wyświetl grupę woluminów (jeśli -ay nie działa, spróbuj -a tak)

    vgchange -a y
    
  4. Pobierz katalog główny LV, / boot i / dev pod oddzielnym drzewem

    mkdir /newroot
    mount /dev/yourVG/rootLV /newroot
    mount /dev/yourbootpartition /newroot/boot
    mount -o bind /dev /newroot/dev
    
  5. Skopiuj potrzebne pakiety do drzewa / newroot

    cp /var/cache/apt/archives/*deb /newroot/tmp/
    
  6. Chroot do nowego drzewa i zainstaluj pakiety

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

W tym momencie wszystko powinno wrócić do normy (ponieważ initramfs zostaną zregenerowane po zainstalowaniu lvm2). Jeśli nie, możesz grać biegając update-initramfs -uw chroot.

Kees Cook
źródło
Jaki jest powód dla bind-mount / dev?
intuicyjnie
Dodałem / dev na wypadek, gdyby grub został ponownie uruchomiony i chciałem dowiedzieć się, gdzie znajdują się dyski rozruchowe. Użyłem dpkg w przypadku, gdy sieć nie działa lub jest dziwnie w chroot. Jeśli praca w sieci działa, polecam „apt-get” zamiast „aptitude”, ponieważ w dzisiejszych czasach ma lepszą rozdzielczość dep.
Kees Cook
Dzięki za podpowiedź na temat tego apt-get, co jest trudne. Czy masz link do dodatkowych informacji na ten temat?
intuicyjnie
1

Po zainstalowaniu systemu na dysku twardym musisz zainstalować lvm2 w tym systemie, zanim będzie można go uruchomić. Jeśli zainstalowałeś lvm2 na livecd, pakiety nadal będą w / var / cache / apt / archives. Przejdź do tego katalogu, podłącz dysk twardy i zainstaluj pakiety na dysku twardym, używając dpkg --root = / mnt * .deb. W twoim przypadku musisz zamontować root fs w / mnt, a także var fs w / mnt / var.

Nie potrzebujesz też oddzielnej partycji / boot, a osobna partycja / var jest wątpliwa.

psusi
źródło
Fajnie ... to łatwiejsze niż chroot. Myślę, że to nie zarejestruje się w aptitudedb pakietów, które zostały wyraźnie zainstalowane, więc prawdopodobnie powinienem po prostu zainstalować lvm2i jego zależności w ten sposób. Jakieś wady używania osobnego /var? Innym zagadnieniem jest konieczność przydzielenia dodatkowego „luzu”? Chciałbym móc go zrobić migawkę, więc nie chcę mieszać go z innymi dużymi zmiennymi plikami; Planuję dowiązać symbolicznie lub zamontować mój katalog domowy do katalogu w osobnym /datawoluminie, który utworzę po uruchomieniu systemu, aby przechowywać muzykę i tym podobne.
intuicyjnie,
Ponadto: Będę też musiał zainstalować boot fs /mnt/boot, nie? Rozumiem, że lvm2buduje nowy initrd podczas instalacji.
intuicyjnie,
@zainicjowano nie, zostanie nagrany jako zainstalowany ręcznie, jak zawsze. Tak, musisz także zamontować / boot, jeśli masz osobny. Posiadanie osobnego / var nie pomaga w tworzeniu migawek.
psusi
Oddzielna /varpartycja nie pomoże w tworzeniu migawek, nie, ale na przykład pomoże zapobiec nieoczekiwanemu zapełnieniu roota. Czy mówisz, że spowoduje to problemy z robieniem migawek? Och, czekaj, to ty w innym wątku komentarza do pytania. Nieważne ..
intuicyjny
1

Skończyło się na tym, że robiłem głównie to, co ładnie układa Kees Cook, z pewną pomocą z ostatniej części tego przewodnika . Jednak:

  • Nie związałem /dev. Wygląda na to, że spowodowało to później pewne komunikaty o błędach; patrz poniżej.
  • /varOprócz tego zamontowałem wolumin na nowym katalogu głównym /boot.
  • Nie skopiowałem debsów do /tmpnowego katalogu głównego. Zamiast tego pobiegłem # apt-get install aptitude; aptitude install lvm2po chrooting.

    • Zrobiłem to, aby zarejestrować te działania w bazie danych apt: na przykład, aptitudea być może również apt-get, będę śledził, które pakiety zostały zainstalowane jawnie, a które zostały zainstalowane automatycznie jako zależności.
    • Ponieważ faktycznie otrzymuję moje pakiety za pośrednictwem lokalnego serwera proxy (działającego apt-cacher-ng), nie musiałem nawet czekać na ich ponowne pobranie. Musiałem zrobić plik /etc/apt/apt.conf.d/02proxyzawierający Acquire::http::Proxy "http://local-apt-proxy-server:3142";przed uruchomieniem apt-get. Zrobiłem to samo przed rozpoczęciem instalowania pakietów podczas uruchamiania LiveCD przed instalacją.
    • Kilka razy dostałem komunikat o błędzie lub ostrzeżenie

      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.
intuicyjny
źródło
Przyjmuję własną odpowiedź, ponieważ zadziałała dla mnie dobrze; zobacz odpowiedź Keesa na podobne rozwiązanie, które może być bardziej niezawodne w niektórych sytuacjach.
intuicyjnie