본문 바로가기

IT

GRUB 환경에서 단일 명령어로 윈도우로 1번만? 부팅하기

반응형

리눅스 개발환경을 주로 사용하지만, 간혹 native windows 에서만 동작하는 프로그램 등을 실행하기 위해서 부팅할 때가 있습니다.

 

boot loader 로 grub 을 사용하는 경우, 간혹 바이오스 화면이 지난 다음 5초 10초 내로 위 조작을 하지 않는 경우 다시 리눅스로 부팅하는 경우가 있고, 저의 경우 노트북, 썬더볼트 허브, KVM 으로 연결된 환경에서 간혹 바이오스 화면과 GRUB 메뉴를 보지 못하고 지나가는 경우가 많이 있었습니다. grub 메뉴에서 뭔가 조작없이 windows 나 linux 로 부팅을 하고 싶었습니다.

검색해보니, grub-reboot, reboot 명령을 조합해서 리부팅시 한 번만 windows entry 로 키 조작없이 부팅이 가능하다는 것을 알았습니다.

일단 리눅스, 윈도우 다중부팅이 가능한 상황이라고 가정하고, GRUB 에서도 windows entry 가 정상적으로 인식되어 있다는 상황하에서 설명드립니다. 자신의 리눅스 GRUB 에 windows entry 가 있는지 확인하는 방법은 /boot/grub/grub.cfg 파일을 확인해보면 됩니다. 이 파일을 보기 위해서는 root 권한이 필요합니다. 아래 명령어로 내용을 확인해봅니다.

sudo cat /boot/grub/grub.cfg

 

보이는 내용중 아래와 비슷한 구문이 있어야 합니다. 저의 경우는 아래와 같습니다.

 

여기서 중요한 내용은 menuentry 명칭인 "Windows Boot Manager (on /dev/nvme0n1p1)" 부분이고, grub-reboot 명령어와 조합하면 아래와 같이 단발적으로 윈도우로 재부팅하도록 할 수 있습니다.

sudo grub-reboot "Windows Boot Manager (on /dev/nvme0n1p1)" && reboot

 

위와 같은 명령어를 실행하면 리부팅시 선택되는 entry 를 windows 로 고정할 수 있고(1회만), reboot 명령어를 통해서 재부팅을 수행합니다. 위 명령어를 실행하면 GRUB 메뉴에서 자동으로 windows entry 가 선택되고 있고, 카운트가 지나갈 것입니다. 이후 윈도우에서 원하는 작업을 수행하고 다시 재부팅하면 이번에는 windows entry 가 아닌 linux entry 가 선택되어 있는 것을 확인할 수 있고, 리눅스로 부팅되는 것을 볼 수 있습니다. 이런 식으로 리눅스를 사용하다가 windows 가 필요한 경우 위 명령어를 이용해서 1회 재부팅만 windows 로 할 수 있습니다. 위 명령어를 /usr/local/bin 등에 reboot-to-windows 등으로 저장해서 사용하시면 편리합니다.

 

아래는 제가 사용중인 스크립트이고, windows entry 를 검색해서 부팅 가능한 entry 가 있으면 부팅하는 스크립트입니다.

/boot/grub/grub.cfg 파일을 열어보는 행동과 grub-reboot 명령어는 일반 user 권한으로는 불가능하여 root 권한이 필요합니다.

 

#!/bin/zsh

if [[ $(id -u) -ne 0 ]]; then
  echo "reboot-to-windows needs root privileges."
  sudo "$0" "$@"
  exit $?
fi

WINDOWS_ENTRY=$(grep -i "windows boot manager" /boot/grub/grub.cfg | cut -d"'" -f2)
if [[ -z "$WINDOWS_ENTRY" ]]; then
  echo "Not found bootable windows entry."
  exit 1
fi

echo "Ready to reboot into windows."
grub-reboot "$WINDOWS_ENTRY" && reboot

 

간단히 스크립트를 설명하면, 첫번째 if 블록은 root 권한이 없는 경우 sudo  명령어를 추가해서 명령어를 다시 실행합니다. 그러면 cli 에서 비밀번호 입력을 받게 됩니다.

두번째 if 블록은 /boot/grub/grub.cfg 파일에서 windows entry 를 발견하지 못하는 경우 재부팅을 수행하지 않습니다.

마지막으로 windows entry 를 찾게 된다면 grub-reboot 로 entry 를 설정하고, reboot 명령어를 통해서 재부팅을 수행합니다.

 

저는 위 스크립트를 /usr/local/bin/reboot-to-windows 라는 파일로 만들어 놓았습니다.

반응형