GRUB có thể được lên lịch? Điều này có nghĩa là: tự động thay đổi 'mục nhập' (đăng nhập tự động) vào các khoảng thời gian xác định?


10

Ví dụ:

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 có thể tự động thay đổi 'mục nhập' mặc định không?


1
Về lý thuyết, nếu bạn có thể sử dụng các lệnh liên quan đến ngày và thời gian trên /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.
edwin

Câu trả lời:


5

Đầ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 datehookcung 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 ]; thenmộ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 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 defaultbiến với tên mục nhập menu Windows 7 được lấy từ greplệnh đó ở trên.

Khối cuối cùng ifminh 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à 0và 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.


Có thể tốt hơn để thực hiện thông qua /etc/grub.d/00_header, vì các bản cập nhật kernel (hoặc người dùng) có thể gọi update-grub khi thêm các mục mới. cf: linuxquestions.org/questions/linux-desktop-74/ cường
KIAaze

2

Để 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" - 1v.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.cfgtệ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 defaultbiế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-grubtrong 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.cfgtệp bằng các mẫu từ /etc/grub.dvà 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.dthư 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:


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.