Skąd mam wiedzieć, z której partycji się uruchomiłem?

12

Mam komputer z partycjami wielokrotnego rozruchu. Mam Ubuntu 14.04 na jednej partycji, Ubuntu 15.04 na drugiej i Ubuntu 16.04 na trzeciej. Czy istnieje sposób, aby dowiedzieć się z wiersza poleceń, z której partycji uruchomiłem, aby znaleźć cię na której partycji /boot/grub/grub.cfgużyto procesu rozruchu? Mam /boot/grub/grub.cfg na każdej z trzech partycji.

Kevin Wilson
źródło
3
Nie możesz tego zrobić z absolutną ogólnością i niezawodnością. Z tego co wiesz, /boot/grub/grub.cfgplik użyty do rozruchu mógł zostać usunięty, partycja mogła zostać usunięta z tablicy partycji, a dysk fizycznie usunięty z systemu.
Federico Poloni

Odpowiedzi:

10

Gdy GRUB przekaże bootowanie do jądra, jądro nie ma pojęcia, co go uruchomiło i /bootmoże nie być tym, którego używał GRUB. Możesz sprawdzić czasy dostępu boot/grub/grub.cfgw każdej z partycji, aby zobaczyć, która z nich była ostatnio dostępna. To może ci powiedzieć, którego pliku konfiguracyjnego GRUB użył.

stat -c %x /boot/grub/grub.cfg

Jeśli czasy dostępu nie zostaną zaktualizowane, będziesz musiał poszukać różnic w parametrach jądra używanych przez różne pliki konfiguracyjne GRUB. Jeśli możesz je zmienić, na przykład dodać foo=1, foo=2itp. Do GRUB_CMDLINE_LINUXkażdego z nich, uruchom sudo update-grub2i uruchom ponownie, możesz sprawdzić, /proc/cmdlinektóre z tych wartości zostały użyte.

muru
źródło
ciekawy! czy to oznacza, że ​​moje rozwiązanie ma również wyższy wskaźnik dokładności niż Ravexina i Katu?
tatsu
@tatsu IMO wszystkie pozostałe odpowiedzi są niepoprawne - Ravexina lokalizuje partycję, w której się /bootznajduje, ale to może nie być to, czego używa grub, a ty i Katu znajdujesz zamontowaną partycję /, ale, jak zauważył Ravexina, prawdopodobnie jeszcze mniej połączenia
muru
1
tak, ale w jaki sposób odmontowanie może zrobić coś innego niż uszkodzenie partycji, na której zamontowano: dyski dostarczają takich informacji, jak urządzenie zamontowanego adresu, wszelkie dane identyfikacyjne, których możesz potrzebować, które z nich próbowałeś odmontować. Jako pierwszy przyznam, że moje rozwiązanie jest brzydkie, ale ma 100% skuteczność, prawda?
tatsu
1
Wskaźnik skuteczności @tatsu dla czego? Znalezienie zamontowanej partycji, na /pewno. Znalezienie konfiguracji GRUB partycji użytej podczas uruchamiania? Nie rozumiem, jak to się odnosi.
muru
4
Czy grub faktycznie ustawia ten znacznik czasu dostępu, biorąc pod uwagę, że jest to jego własny DOS i nie jest związany konwencjami sterowników systemu plików Linux?
rackandboneman
4

Jak wiesz, plik, którego szukasz, znajduje się w /bootkatalogu twojego systemu operacyjnego. albo /bootjest oddzielną partycją, albo nie jest; Jeśli /bootjest oddzielną partycją należy zwracać uwagę, aby:

$ lsblk -r | grep '/boot'
sda2 8:1 0 400M 0 part /boot

Oznacza, że grub.cfgużyto znajduje się w sda2.

W przeciwnym razie powinieneś poszukać root:

$ lsblk -r | grep '/$'
sda1 8:1 0 121.2G 0 part /

tym razem znajduje się w sda1.

Lub nawet dla zabawy możemy sprawdzić parametry czasu rozruchu:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-686-pae root=UUID=938495-1fe2-3302 ro quiet

następnie użyj, UUIDaby dowiedzieć się, która partycja jest Twoim rootem.

$ sudo blkid | grep 938495-1fe2-3302
/dev/sda1: UUID="938495-1fe2-3302"

Co oznacza z sda1.

Możesz również sprawdzić parametry rozruchu, aby zobaczyć, który z grub.cfgnich zawiera. Działa to tylko wtedy, gdy parametry rozruchu grub.cfgróżnią się od siebie.

Ravexina
źródło
2
Łatwiejszym sposobem (który nie wymaga uprawnień superużytkownika) znalezienie węzła urządzenia za identyfikatorem UUID systemu plików readlink -f /dev/disk/by-uuid/<UUID>.
David Foerster,
3

Aby wyświetlić urządzenie z aktualnie zamontowanym głównym systemem plików:

awk '$2=="/"{print $1}' /proc/mounts

Aby wyświetlić aktualnie działającą wersję wydania Ubuntu:

lsb_release -rs
David Foerster
źródło
co w istocie robi wiele sensu w odniesieniu do pytania i wydaje się być najbardziej odpowiednią odpowiedzią do tej pory. Założę się, że w jego konfiguracji nie ma dwóch dystrybucji mających ten sam numer wersji, którego użyje lsb_release -rsza każdym razem. KISS
tatsu
Niestety to nie działa. Przetestowałem twoje polecenie na moim komputerze z wieloma systemami operacyjnymi, tylko mój „master`-OS ma gruba zainstalowanego w MBR, inne systemy mają gruba zainstalowanego w PBR, polecenie wydaje się pokazywać lokalizację, w której system grub ma zainstalowanego Gruba, ale nie pokaż, z którego OS Grub ładuje plik konfiguracyjny
mook765
@ mook765: Moja odpowiedź nie ma absolutnie nic wspólnego z Grubem lub MBR (lub jakimkolwiek programem ładującym lub tablicą partycji). Nie jestem pewien, czego dokładnie próbowałeś i czego się spodziewałeś.
David Foerster,
Zatem ta odpowiedź nie ma nic wspólnego z pytaniem ...
mook765
@ mook765: Jeśli weźmiesz to dosłownie, to tak. Wydaje mi się jednak, że OP chce wiedzieć, która z jego wielu instalacji Ubuntu jest aktualnie uruchomiona i na to moja odpowiedź powinna być w porządku.
David Foerster,
2

Możemy dodać prostą niestandardową pozycję menu w każdym systemie operacyjnym i zobaczylibyśmy w menu Grub, z którego OS Grub załadował swój plik konfiguracyjny.

Przykład:

Uruchamiamy do 16.04 i edytujemy plik, /etc/grub.d/40_customaby dodać pozycję menu.

#! / bin / sh
exec tail -n +3 $ 0
# Ten plik zapewnia łatwy sposób dodawania niestandardowych pozycji menu. Po prostu wpisz
# pozycji menu, które chcesz dodać po tym komentarzu. Uważaj, aby się nie zmienić
# linia „exec tail” powyżej.
#

menuentry „grub.conf załadowany z 16.04” {        
            restart  
    }

Dbamy o to, aby plik był wykonywalny i działał sudo update-grub.

Następnie robimy te same zmiany w innych systemach operacyjnych, po prostu używamy różnych nazw dla menu, ig zmieniamy 16.04na 15.04i tak dalej.

Jeśli wybierzemy tę pozycję menu w menu Grub podczas rozruchu, maszyna po prostu uruchomi się ponownie, stworzyliśmy je, aby nie uruchamiały żadnego systemu operacyjnego, ale aby zobaczyć, który system operacyjny jest faktycznie używany do załadowania grub.conf.

Dodatkowe informacje

Tego rodzaju zamieszanie pojawia się, gdy instalujemy wiele systemów operacyjnych, z których wszystkie używają Gruba, a podczas instalacji systemu operacyjnego wybieramy tę samą lokalizację programu ładującego. Potrzebujemy rzeczywiście tylko jednego systemu operacyjnego, który instaluje Grub, Grub może uruchomić się z dowolną dystrybucją Linuksa, więc jeśli mamy zainstalowaną jedną dystrybucję (w tym Grub), moglibyśmy zainstalować dodatkowe systemy operacyjne bez instalowania Grub.

W starszych instalacjach dość łatwo jest obsługiwać lokalizację instalacji modułu ładującego, ponieważ możemy wybrać rekord partycji-rozruchu jako lokalizację, ale musimy zadbać o to, aby wybrać odpowiednią partycję. Tak więc jeden system operacyjny instaluje moduł ładujący do MBR, a dodatkowy system instaluje moduł ładujący do PBR partycji OS. Tę możliwość mamy tylko wtedy, gdy użyjemy opcji Something else-podczas instalacji.

W instalacjach UEFI jest to nieco dziwniejsze, moduł ładujący zostanie zainstalowany w folderze na partycji systemowej EFI (ESP), a wiele modułów ładujących może z łatwością współistnieć. Problem polega na tym, że wszystkie smaki Ubuntu, a także niektóre inne dystrybucje linuksa zainstalują Gruba w tym samym folderze w ESP i nie mamy wyboru. Więc zainstalowanie dodatkowej dystrybucji Linuksa zastąpiłoby nasz już istniejący moduł ładujący. Jedynym sposobem, aby tego uniknąć, jest uruchomienie sesji na żywo i uruchomienie instalatora sudo ubiquity -b.

Kolejne proste rozwiązanie

Załóżmy, że mamy trzy dystrybucje Linuksa zainstalowane na partycjach sda1, sda2a sda3. Spójrzmy teraz na pozycje menu rozruchowego Grub. Podczas uruchamiania zobaczymy coś takiego:

1 Ubuntu
2 Zaawansowane opcje dla Ubuntu
3 Test pamięci (memtest86 +)
4 Test pamięci (memtest86 +, konsola szeregowa 115200)
5 Ubuntu (on / dev / sda2)
6 Zaawansowane opcje dla Ubuntu (on / dev / sda2)
7 Ubuntu 17.04 (on / dev / sda3)
8 Zaawansowane opcje dla Ubuntu (on / dev / sda3)

Pierwsze dwa wpisy to wpisy dla systemu operacyjnego, który wygenerował grub.confplik, którego faktycznie używamy. Wpisy 3 i 4 nie są w tej chwili interesujące. Wpisy # 5, # 6, # 7 i # 8 to wpisy wygenerowane za pomocą sondy systemu operacyjnego i widzimy, na których partycjach znajdują się systemy operacyjne dla tych wpisów. Tak więc w przypadku tej małej przykład możemy stwierdzić, że grub.config-file faktycznie stosowanie nie należą do systemu operacyjnego na sda2lub sda3tylko do systemu operacyjnego na sda1. W przypadku, gdy jeden lub więcej systemów operacyjnych jest instalowanych z osobną /bootpartycją, musielibyśmy sprawdzić, która /bootpartycja należy do którego systemu operacyjnego, ale można to łatwo zrobić, uruchamiając findmntkomendę w każdym systemie operacyjnym.

mook765
źródło
+1 Mimo długiej odpowiedzi ta faktycznie zawiera odpowiednie punkty. W przypadku systemów BIOS użytkownicy wykonujący rozruch wielokrotny powinni w instalatorze wybrać opcję „Coś innego”, aby mieć większą kontrolę; Nie trzeba zmuszać „nie instalować modułu ładującego GRUB” (patrz moja starsza odpowiedź ). W przypadku systemów UEFI konfiguracja uruchamiania wielokrotnego wydaje się być znacznie niewyjaśniona lub niesprawdzona.
clearkimura
1
lsblk

I sprawdź, w który dysk jest podłączony /. Przeczytaj poniższe komentarze lub odpowiedź Ravexiny, jeśli masz /bootzamontowane punkty.

Jeśli nie masz pewności, sprawdź UUID

lsblk -o UUID,NAME,SIZE,MOUNTPOINT
Katu
źródło
2
To nieprawda, co jeśli moja /bootoddzielna partycja? wtedy /boot/grub/grub.cfgnie znajduje się w /partycji.
Ravexina,
@Ravexina Uzyskaj techniczne, to może być prawda. Jednak dla potrzeb tego użytkownika /partycja się nie liczy?
@ MarkYisri Myślę, że powinienem powiedzieć, że nie zawsze jest to prawda, jednak OP mówi nam, że dostał plik na trzy różne partycje, więc myślę, że lepiej /bootnajpierw sprawdzić osobną .
Ravexina,
1
Dzięki za zwrócenie uwagi na @Ravexina Zaktualizowałem odpowiedź.
Katu
0

Aby dowiedzieć się, z której partycji uruchomił się użytkownik, sprawdź menu modułu ładującego przed uruchomieniem dowolnego z zainstalowanych systemów. Trudno powiedzieć, nie widząc menu modułu ładującego.

Gdzie patrzeć

Na poniższych połączonych zrzutach ekranu oznaczyłem trzy wskazówki, które można wiedzieć, z której partycji uruchomił się użytkownik.

Menu wielokrotnego rozruchu z wykorzystaniem wersji GNU GRUB PC / BIOS z adnotacją

Etykieta (1): Pozycje menu GNU GRUB poniżej pierwszego wpisu

Etykieta (2): Wersja GNU GRUB na górze menu modułu ładującego

Etykieta (3): Obraz w tle GNU GRUB (wymagana ręczna konfiguracja)

Najbardziej widoczną wskazówką jest etykieta (3), która ma zmienić obraz tła GNU GRUB w systemie, który kontroluje menu modułu ładującego. Najłatwiej to powiedzieć, pod warunkiem, że użytkownik wcześniej go skonfigurował.

Wyjaśnienie etykiety (1)

Poszukaj partycji, która nie jest wymieniona w pozycjach menu poniżej pierwszej pozycji. Na zrzucie ekranu instalowane są tylko dwa systemy operacyjne, tj. „Ubuntu” i „Ubuntu 14.04.5 LTS”.

Ubuntu
Advanced options for Ubuntu
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)
Advanced options for Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)

Ten drugi wspomniał (on /dev/sda3), co oznacza, że ​​ten pierwszy może znajdować się na /dev/sda2lub /dev/sda1. Aby mieć pewność, po uruchomieniu systemu, tj. „Ubuntu”, uruchom odpowiednie polecenie, aby wyświetlić listę dostępnych partycji ( lsblkwydaje się to najbardziej proste).

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    13G  0 disk 
├─sda1   8:1    0   976M  0 part [SWAP]
├─sda2   8:2    0     6G  0 part /
└─sda3   8:3    0     6G  0 part 
sr0     11:0    1  55.7M  0 rom 

Dopiero po porównaniu z danymi wyjściowymi lsblk, wiemy, że system, tj. „Ubuntu”, znajduje się w /dev/sda2(który nie był wymieniony w pozycjach menu), z którego zarządzane jest menu modułu ładującego.

Wyjaśnienie etykiety (2)

Poszukaj wersji GRUB, która jest wydrukowana u góry menu modułu ładującego. Zwróć uwagę na tę wersję i porównaj ją z wersją GRUB, która znajduje się w systemie rozruchowym, tj. „Ubuntu”.

Na zrzucie ekranu (dolna połowa): GNU GRUB version 2.02~beta2-9

Po uruchomieniu systemu, tj. „Ubuntu”, uruchom odpowiednią komendę, aby sprawdzić wersję pakietu GRUB ( grub-install --versionjest odpowiednia i najprostsza).

$ grub-install --version
grub-install (GRUB) 2.02~beta2-9

Jak to ma znaczenie? Ponieważ grub-installi update-grubpolecenia są dostarczane przez ten sam pakiet grub2-common. Ponieważ menu modułu ładującego jest tworzone i aktualizowane przy użyciu narzędzi z tego samego pakietu, wersja drukowana u góry menu modułu ładującego będzie taka sama.

Wyjaśnienie etykiety (3)

Ta podpowiedź wymaga ręcznej konfiguracji, ponieważ domyślnym obrazem tła menu modułu ładującego jest brak (zwykła czerń). Obraz w tle musi mieć 8-bitową głębię.

Jeśli desktop-basepakiet jest zainstalowany w twoim systemie, takie obrazy tła, które zostały stworzone specjalnie dla GRUB, można łatwo znaleźć z przyrostkiem nazwy pliku *grub.pngw katalogu docelowym.

$ ls /usr/share/images/desktop-base/*grub.png
/usr/share/images/desktop-base/desktop-grub.png
/usr/share/images/desktop-base/joy-grub.png
/usr/share/images/desktop-base/moreblue-orbit-grub.png
/usr/share/images/desktop-base/spacefun-grub.png

Aby skonfigurować obraz tła:

  1. Otwórz /etc/default/grubplik jako superużytkownik, a następnie dodaj wiersz GRUB_BACKGROUND=z pełną ścieżką do wybranego obrazu i cudzysłowu.

    $ sudo nano /etc/default/grub 
    ...
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""
    
    # Show background in GRUB boot menu
    GRUB_BACKGROUND="/usr/share/images/desktop-base/spacefun-grub.png"
    ...
    
  2. Następnie uruchom sudo update-grubaktualizację, /boot/grub/grub.cfgktóra zawiera menu modułu ładującego. Użytkownik zobaczy dane wyjściowe podobne do poniższych.

    $ sudo update-grub
    Generating grub configuration file ...
    Found background: /usr/share/images/desktop-base/spacefun-grub.png
    Found background image: /usr/share/images/desktop-base/spacefun-grub.png
    Found linux image: /boot/vmlinuz-3.13.0-24-generic
    Found initrd image: /boot/initrd.img-3.13.0-24-generic
    Found memtest86+ image: /boot/memtest86+.elf
    Found memtest86+ image: /boot/memtest86+.bin
    Found Ubuntu 14.04.5 LTS (14.04) on /dev/sda3
    done
    
  3. Uruchom ponownie komputer i sprawdź, czy w menu modułu ładującego nie ma widocznych zmian wprowadzonych przez polecenie aktualizacji z systemu.

W przeciwnym razie powtarzaj kroki dla innych systemów, jeden po drugim. Powtarzanie kroków byłoby niepotrzebne, gdyby użytkownik wiedział, który system ma kontrolę nad menu modułu ładującego (ponownie, zależy to od sposobu instalacji).

Zrzeczenie się

Ta odpowiedź wyjaśnia sprawdzone i dobrze przetestowane kryteria dla systemu BIOS z konfiguracją wielokrotnego rozruchu przy użyciu wersji GNU GRUB PC / BIOS. Obowiązują następujące wyjątki.

  • Dla UEFI odpowiednikiem systemu za pomocą wersji GNU GRUB EFI, to nie gwarantuje ani nie wiadomo, czy wydaje się być kryteria takie same jak opisane powyżej.

  • Nacisk kładziony jest na wygląd menu modułu ładującego (jak może wyglądać inaczej, tj. Górna połowa zrzutu ekranu), zamiast na pokazanie, jak działa ładowanie łańcucha. W związku z tym w tej odpowiedzi nie zostanie wyjaśnione, w jaki sposób „skonfigurowano rozruch wielokrotny, jak pokazano na zrzucie ekranu” .

  • Jeśli konfiguracja wielokrotnego rozruchu jest kiedykolwiek wykonana z dokładnie takich samych kopii podobnego systemu operacyjnego, tj. Ubuntu 14.04, Kubuntu 14.04, Xubuntu 14.04 itd., To jedynym niezawodnym sposobem na sprawdzenie, z której partycji uruchomił się użytkownik, jest etykieta (3).

  • Etykieta (3) może działać lepiej przy użyciu niestandardowego obrazu tła, który wyraźnie zapisuje, z którego jest uruchamiany, tj. „To menu rozruchowe jest zarządzane z / dev / sda1”. Podobnie, w odniesieniu do „jak utworzyć niestandardowy obraz tła dla GRUB” nie zostanie wyjaśnione w tej odpowiedzi.

TL; DR Spójrz na menu modułu ładującego przed uruchomieniem dowolnego z zainstalowanych systemów. Najłatwiejszym i najbardziej niezawodnym sposobem na poznanie jest label (3), który polega na ręcznym ustawieniu obrazu tła GRUB.

clearkimura
źródło