GRUB을 예약 할 수 있습니까? 이것은 정의 된 시간에 기본 '항목'(자동 로그인)을 자동으로 변경하는 것을 의미합니까?


10

예를 들면 다음과 같습니다.

00:00:00 to 06:00:00 -> Slitaz
06:00:01 to 13:00:00 -> Ubuntu
13:00:01 to 19:00:00 -> Fedora
19:00:01 to 23:59:59 -> openSUSE

grub이 기본 '항목'을 자동으로 변경할 수 있습니까?


1
이론적으로에 날짜 및 시간 관련 명령을 사용할 수있는 경우 /boot/grub/grub.cfg의 파일을 편집하기 만하면 지정된 시간 동안 그룹 항목을 선택할 수 있습니다 /etc/grub.d. 그러나 grub로드 전의 날짜 / 시간은 보정 된 소스 (예 : NTP)조차도 아닐 것이라고 생각합니다. 따라서 PC 내부 시계가 남습니다.
edwin

답변:


5

먼저 grep -E '(menuentry |submenu )' /boot/grub/grub.cfggrub 메뉴 항목 목록을 가져옵니다. 다음과 같이 보일 것입니다 :

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-25-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
menuentry 'Windows 7 (loader) (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-chain-C84087BD4087B12C' {

여기에서 첫 번째 메뉴 항목이 Ubuntu 이고 Ubuntu 하위 메뉴 의 고급 옵션 (4 개의 다른 항목 포함), 2 개의 메모리 테스트 및 마지막으로 Windows 7이 표시 됩니다.

이라는 파일을 만들면 /boot/grub/custom.cfg이후 /boot/grub/grub.cfg에 로드 되므로 GRUB의 기본 구성을 쉽게 변경할 수 있습니다.

GRUB의 모듈 datehook을 사용 하여 현재 시간을 얻었습니다.

/boot/grub/custom.cfg:

# This module creates special variables that return the current date/time
insmod datehook

# Add and extra 0 to minutes if it's less than 10 (force a 2-digit minute) 
if [ $MINUTE -lt 10 ]; then PADDING="0"; else PADDING=""; fi
TIME=$HOUR$PADDING$MINUTE

# Boot "Ubuntu" from midnight to 5:59AM
if [ $TIME -ge 0 -a $TIME -lt 559 ]; then
    set default="Ubuntu"
fi

# Boot "Windows 7" from 6AM to 4:59PM
if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then
    set default="Windows 7 (loader) (on /dev/sda2)"
fi

# If you want to boot an entry that's inside a submenu,
# you have to prepend its name with the submenu position, starting from 0.
# Boot "Ubuntu, with kernel 3.16.0-25-generic" from 5PM to 11:59PM
if [ $TIME -ge 1700 -a $TIME -lt 2359 ]; then
    set default="1>Ubuntu, with Linux 3.16.0-25-generic"
fi

모듈 datehook은 DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY 및 YEAR 변수를 사용 가능하게하며 하드웨어 시계를 기반으로 실제 날짜 / 시간 값을 리턴합니다.

if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then예를 들어 봅시다 . 이 의미 : 현재 시간이보다 크거나 오전 6시 같으면 오후 4시 59분 (16시 59분) 그 다음 명령 (실행 미만 set default="Windows 7 (loader) (on /dev/sda2)"설정된) default이 찍은 윈도우 7 메뉴 항목 이름 변수를 grep상기 명령.

마지막 if블록은 하위 메뉴 항목의 선택을 보여줍니다. 이 경우 "우분투, Linux 3.16.0-25- 일반"은 기본 메뉴의 두 번째 항목 인 하위 메뉴 안에 있습니다. 메뉴의 입력 위치가 0에서 시작하면 이름이 "Ubuntu"이고 "Ubuntu의 0고급 옵션"하위 메뉴가 1이므로 1>항목 이름 앞에 추가해야하는 이유는 다음과 같습니다 set default="1>Ubuntu, with Linux 3.16.0-25-generic".

실행할 필요가 없습니다 update-grub.

하드웨어 시계는 배터리가 죽었다는 특별히 경우, 신뢰할 수 있습니다. 또한 BIOS 설정으로 들어가서 시간을 확인하십시오. UTC 인 경우 스크립트에서 시간 범위를 변경해야합니다.


커널 업데이트 (또는 사용자)가 새 항목을 추가 할 때 update-grub을 호출 할 수 있기 때문에 /etc/grub.d/00_header를 통해 수행하는 것이 좋습니다. cf : linuxquestions.org/questions/linux-desktop-74/…
KIAaze

2

처음에는 터미널 에서 다음 명령을 실행하십시오 .

grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2

그러면 grub 메뉴 항목 목록이 반환됩니다. 귀하의 경우이 목록은 다음과 같다고 가정합니다.

Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE

이제 이러한 각 항목에 대해 0부터 시작하여 오름차순으로 번호를 지정해야합니다 ( "Slitaz"- ​​" 0,"고급 옵션 "- 1등). 이 숫자를 사용하여 그룹 메뉴에서 기본 항목을 설정합니다.

다음으로 마지막 /boot/grub/grub.cfg으로 다음과 같이 파일을 편집해야합니다 .

  • gedit에서 열린 터미널에서 다음을 사용하여 파일을 편집하십시오.

    sudo -H gedit /boot/grub/grub.cfg
    
  • default변수가 설정된 행을 찾으십시오 . 다음과 비슷한 모양이어야합니다.

    set default="..."
    
  • 위 코드를 다음 코드로 바꾸십시오 :

    insmod datehook
    
    if [ "$HOUR" -ge "0" -a "$HOUR" -lt "6" ]; then set default="0"      #Slitaz time
    
    elif [ "$HOUR" -ge "6" -a "$HOUR" -lt "13" ]; then set default="4"   #Ubuntu time
    
    elif [ "$HOUR" -ge "13" -a "$HOUR" -lt "19" ]; then set default="5"  #Fedora time     
    
    else set default="6"                                                 #openSUSE time
    
    fi
    
  • 파일을 저장하고 닫습니다.

그게 다야! PC를 다시 시작하고 작동하는지 확인하십시오.

참고 : 이 설정을 되돌리려면 sudo update-grub터미널에서 실행하십시오 . 실제로이 명령은의 /boot/grub/grub.cfg템플릿 /etc/grub.d과 설정을 사용하여 파일을 자동으로 생성하고 바꿉니다 /etc/default/grub. 따라서 위의 코드를 /etc/grub.d디렉토리 내의 하나의 템플릿에 넣는 것이 좋습니다 .

영감의 출처 : 스크립팅 GRUB2에서 간단한 부팅시 상태 머신 .

다른 출처 :


0

두 가지 가능성이 있습니다. 먼저 모든 OS에 시계별로 구성을 변경하는 cron 스크립트를 추가 할 수 있습니다. 그러나 OS가 종료되는 동안이 스크립트가 시작되면 어떤 일이 발생하든 마음에 들지 않으므로주의하십시오. 더 나은 아이디어는 PC 용 UEFI 마더 보드를 얻는 것입니다. 사전 부트 로더 스크립팅 콘솔 인 Shellx86을 설치할 수 있습니다. Shellx64에서 원하는 스크립트를 작성하는 것은 bash에서 스크립트를 작성하는 것보다 어렵지 않습니다. 인터넷 연결 여부에 따라 다른 OS를 부팅하는 데 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.