Câu trả lời:
Đầu tiên, chạy grep -E '(menuentry |submenu )' /boot/grub/grub.cfg
để có được một danh sách các mục menu grub của bạn. Bạn sẽ thấy một cái gì đó như:
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' {
Ở đây bạn có thể thấy mục menu đầu tiên của tôi là Ubuntu , tiếp theo là tùy chọn Nâng cao cho menu con Ubuntu (với bốn mục khác), 2 bài kiểm tra bộ nhớ và cuối cùng là Windows 7 .
Nếu chúng ta tạo một tệp có tên /boot/grub/custom.cfg
, nó sẽ được tải sau đó /boot/grub/grub.cfg
, vì vậy chúng ta có thể dễ dàng thay đổi cấu hình mặc định của GRUB.
Tôi đã sử dụng mô-đun của GRUB datehook
để có được thời gian hiện tại.
/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
Mô-đun datehook
cung cấp các biến: NGÀY, GIỜ, PHÚT, THÁNG, THỨ HAI, TUẦN và NĂM, trả về các giá trị ngày / giờ thực tế dựa trên đồng hồ phần cứng.
Hãy lấy if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then
một ví dụ. Điều đó có nghĩa là: nếu thời gian hiện tại lớn hơn hoặc bằng 6 giờ sáng và dưới 4:59 chiều (16:59) thì thực hiện lệnh tiếp theo ( set default="Windows 7 (loader) (on /dev/sda2)"
), đặt default
biến với tên mục nhập menu Windows 7 được lấy từ grep
lệnh đó ở trên.
Khối cuối cùng if
minh họa việc lựa chọn một mục menu con. Trong trường hợp đó "Ubuntu, với Linux 3.16.0-25-generic" nằm trong một menu con là mục thứ hai trong menu chính. Vì vị trí mục nhập trong menu bắt đầu từ 0, mục nhập menu có tên "Ubuntu" là 0
và menu con "Tùy chọn nâng cao cho Ubuntu" 1
, đó là lý do tại sao tôi phải thêm 1>
trước tên mục : set default="1>Ubuntu, with Linux 3.16.0-25-generic"
.
Không cần phải chạy update-grub
.
Các đồng hồ phần cứng có thể không đáng tin cậy, đặc biệt nếu pin đã chết. Ngoài ra, nhập thiết lập BIOS và kiểm tra thời gian. Nếu là UTC, bạn sẽ phải thay đổi phạm vi thời gian trong tập lệnh.
Để bắt đầu, hãy chạy lệnh sau trong terminal :
grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2
Điều này sẽ trả về một danh sách các mục menu grub của bạn. Tôi giả sử rằng trong trường hợp của bạn, danh sách này là như thế này:
Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE
Bây giờ, đối với mỗi mục này, bạn nên gán một số theo thứ tự tăng dần bắt đầu bằng 0 (cho "Slitaz" - 0
, cho "Tùy chọn nâng cao" - 1
v.v.). Bạn sẽ sử dụng số này để đặt mục mặc định trong menu grub.
Tiếp theo và điều cuối cùng, bạn nên chỉnh sửa /boot/grub/grub.cfg
tệp như sau:
Từ thiết bị đầu cuối mở trong gedit tệp bằng cách sử dụng:
sudo -H gedit /boot/grub/grub.cfg
Tìm dòng nơi default
biến được đặt; nó sẽ trông giống như:
set default="..."
Thay thế dòng trên bằng mã tiếp theo:
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
Lưu file và đóng nó lại.
Đó là tất cả! Khởi động lại PC của bạn và kiểm tra xem nó có hoạt động không.
Lưu ý: để hoàn nguyên các cài đặt này, chỉ cần chạy
sudo update-grub
trong thiết bị đầu cuối. Trong thực tế, lệnh này sẽ tự động tạo và thay thế/boot/grub/grub.cfg
tệp bằng các mẫu từ/etc/grub.d
và cài đặt từ/etc/default/grub
. Vì vậy, sẽ tốt hơn nếu đặt mã trên vào một mẫu trong/etc/grub.d
thư mục.
Nguồn cảm hứng: Viết kịch bản Máy trạng thái thời gian khởi động đơn giản trong GRUB2 .
Những nguồn khác:
Bạn có 2 khả năng. Đầu tiên, bạn có thể thêm vào mọi hệ điều hành một tập lệnh cron thay đổi cấu hình theo đồng hồ. Tuy nhiên, bạn sẽ không thích những gì sẽ xảy ra nếu tập lệnh này khởi động trong khi hệ điều hành đang tắt, vì vậy hãy cẩn thận. Một ý tưởng tốt hơn sẽ là mua bo mạch chủ UEFI cho PC của bạn. Ở đó bạn có thể cài đặt Shellx86, một giao diện điều khiển kịch bản tiền khởi động. Tạo tập lệnh cho những gì bạn muốn trong Shellx64 không khó hơn tập lệnh trong bash. Tôi đã sử dụng nó để khởi động hệ điều hành khác nhau tùy thuộc vào việc bạn có kết nối Internet hay không.
/boot/grub/grub.cfg
, việc chọn một mục nhập grub trong một giờ nhất định chỉ có thể bằng cách chỉnh sửa các tệp trên/etc/grub.d
. Nhưng tôi nghĩ ngày / giờ trước khi tải grub thậm chí sẽ không phải là nguồn được hiệu chỉnh (ví dụ như NTP). Vì vậy, điều đó sẽ để lại cho bạn với đồng hồ nội bộ PC.