grub 의 기본 timeout 이 아마 5초였던가 10초였던가 입니다. 그 시간동안에 선택을 하지 못하면 찰나의 순간 원하는 OS로 부팅을 하지 못하는 경우가 생깁니다. 하여, 리눅스에서 재부팅하는 경우 윈도우 entiry 를 자동으로 선택해서 부팅하도록 하는 기능을 스크립트로 작성해봤습니다.
이게 장점인지 단점인지 모르겠지만, (저에게는 장점) 해당 스크립트는 1회성으로 grub 의 윈도우 entry 를 선택해주는 기능이라서, 다시 한번 리부팅하는 경우 원래대로 이전에 선택했던 OS로 부팅이 진행됩니다.
저의 경우 1번 entry 가 리눅스, 2번 entry 가 윈도우인데, PC를 켜고 그냥 기다리면 1번 리눅스로 리부팅이 되고, 아래 스크립트로 리부팅을 하면 2번 윈도우로 리부팅이되고, 다시 윈도우에서 리부팅하면 1번 리눅스로 리부팅이 됩니다.
간혹 윈도우 업데이트중에서 리부팅이 필요한 케이스에 윈도우 - 리눅스 - 윈도우 순으로 리부팅을 해야 하는 불편함이 있긴하지만, 저 케이스를 제외하고는 잘 사용하고 있습니다.
사용하는 스크립트는 아래와 같고, 조건은 단 1개입니다. 윈도우가 1군데 설치되어 있어야 한다는 겁니다. 만약 어떤 이유로 부팅 가능한 윈도우 파티션이 2개 이상인 경우 윈도우 entry 가 2개 이상 발견되어 스크립트가 정상 동작하지 않습니다. 그런 경우 windows_title 을 획득하는 커맨드에서 head 를 사용하여 원하는 위치의 entry 를 조회할 수 있도록 변경해야 합니다.
#!/bin/zsh
if [[ $(id -u) -ne 0 ]]; then
sudo "$0" "$@" # 현재 스크립트를 sudo 권한으로 다시 실행
exit $?
fi
windows_title=$(grep -i windows /boot/grub/grub.cfg | cut -d"'" -f2)
if [[ -n "$windows_title" ]]; then
grub-reboot "$windows_title" && reboot
else
echo "Not found bootable windows entiry."
exit 1
fi
shell 이 zsh 로 되어 있지만, bash 로 해도 잘 동작할 겁니다.
스크립트를 보면 별게 없습니다.
- sudo 권한 없이 실행되는 경우, sudo 명령어로 승격하는 if 블럭이 있습니다. (아래 /boot/grub/grub.cfg 파일은 root 권한이 있어야 조회가 가능합니다.)
- 다음 /boot/grub/grub.cfg 파일에서 windows 라는 이름을 가지는 entry 를 조회합니다.
- 조회가 정상적으로 이루어진 경우 해당 entry 를 선택하여 리부팅시 사용한다고 지정하고, 리부팅합니다.
- entry 를 발견하지 못하는 경우 종료합니다.
이상 리눅스에서 grub 의 entry 선택없이 바로 리부팅할 수 있는 기능을 소개해봤습니다. 끝.