답변:
먼저 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 인 경우 스크립트에서 시간 범위를 변경해야합니다.
처음에는 터미널 에서 다음 명령을 실행하십시오 .
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에서 간단한 부팅시 상태 머신 .
다른 출처 :
두 가지 가능성이 있습니다. 먼저 모든 OS에 시계별로 구성을 변경하는 cron 스크립트를 추가 할 수 있습니다. 그러나 OS가 종료되는 동안이 스크립트가 시작되면 어떤 일이 발생하든 마음에 들지 않으므로주의하십시오. 더 나은 아이디어는 PC 용 UEFI 마더 보드를 얻는 것입니다. 사전 부트 로더 스크립팅 콘솔 인 Shellx86을 설치할 수 있습니다. Shellx64에서 원하는 스크립트를 작성하는 것은 bash에서 스크립트를 작성하는 것보다 어렵지 않습니다. 인터넷 연결 여부에 따라 다른 OS를 부팅하는 데 사용했습니다.
/boot/grub/grub.cfg의 파일을 편집하기 만하면 지정된 시간 동안 그룹 항목을 선택할 수 있습니다/etc/grub.d. 그러나 grub로드 전의 날짜 / 시간은 보정 된 소스 (예 : NTP)조차도 아닐 것이라고 생각합니다. 따라서 PC 내부 시계가 남습니다.