본문 바로가기
IT/linux

grub installer, 부트로더 스크립트 예제

by 어느해겨울 2022. 1. 15.

grub installer

이전 linux 와 windows 운영체제의 swap 이 필요한 환경이 있었다.

그때 작성한 부트로더 변경 스크립트이다. 

이 것도 어디 고이 짱박혀 있던걸 가져온건데.. 예전에 난 뭐하던 사람이지?? 왜 하나도 모르겠지??

분명 주석 스타일, 네이밍 스타일, 인덴트 억지로 맞추는 부분까지 내 스타일이 맞는데..

날이 갈수록 멍청해지고 있는게 명백한 사실인듯 하다..

혹시 쓸 일이 생길지 몰라 기록을 남겨둔다.

 


 

grub config 파일

grub.cfg
0.00MB

 

스크립트 파일 첨부

install_grub.sh
0.00MB

 

스크립트 내용

#!/bin/bash 
echo "Install grub boot loader"
sudo -k /usr/bin/zenity --info \
    --width=300 --height=50 --no-wrap \
    --timeout=5 \
    --title="알림" \
    --text="부트로더 패치를 시작합니다.\n확인 버튼을 눌러주세요." 

# grub.cfg 파일은 스크립트와 동일한 위치에 둘것
cfg_path=`dirname "$0"`

# Windows 및 Linux 의 partition 이름 지정
# part_windows : windows partion
# part_linux   : linux   partion
part_linux=`ls -l /dev/disk/by-uuid \
       | awk '{print $9 " " $11}' \
       | grep '^.\{8\}-' \
       | awk '{sub("../../","",$2); print}' \
       | awk '{print $2}' \
       | sort -r \
       | tail -1`
echo " - Linux partion   : [$part_linux]"

part_windows=`ls -l /dev/disk/by-uuid \
       | awk '{print $9 " " $11}' \
       | grep '^.\{16\} ' \
       | awk '{sub("../../","",$2); print}' \
       | awk '{print $2}' \
       | sort \
       | tail -1`
echo " - Windows partion : [$part_windows]"

device_list=("$part_windows" "$part_linux")
os_list=("WINDOWS" "LINUX");

# device_list의 드라이버명에 해당하는 UUID 저장
uuid_list=()

# 갱신이 필요한 boot image file 지정
linux_boot_list=("vmlinuz" "initrd")

echo " - Partition uuid acquiring."
for dev in "${device_list[@]}"; do
    uuid_list+=(`ls -l /dev/disk/by-uuid | grep $dev | awk {'print $9'}`)
done

if mountpoint -q /mnt; then
    echo " - Already grub device mounted."
else 
    sudo -k mount /dev/$part_linux /mnt
fi

# grub.cfg UUID 변경
echo " - Change partition UUID."
sudo -k cp $cfg_path/grub.cfg /tmp/.
for idx in ${!device_list[*]}; do
    echo "  -- Partition[${device_list[$idx]}] UUID[${uuid_list[$idx]}]"
    sudo -k sed -i "s/UUID_DEV_${os_list[$idx]}/${uuid_list[$idx]}/gi" /tmp/grub.cfg
done

# Linux boot image 변경
for idx in ${!linux_boot_list[*]}; do
    target_file=`ls -tr /mnt/boot | grep ${linux_boot_list[$idx]} | tail -1`
    echo "  -- update boot image : [$target_file]"
    sudo -k sed -i "s/BOOT_${linux_boot_list[$idx]}/$target_file/gi" /tmp/grub.cfg
done

sudo -k cp /tmp/grub.cfg /mnt/boot/grub/.

echo " - Install grub boot directory."
sudo -k grub-install --boot-directory=/mnt/boot /dev/${part_windows%[0-9]} 2> /dev/null 

echo " - Unmount grub partition."
sudo -k umount /mnt 2> /dev/null

echo "Finished. Will reboot."
sudo -k /usr/bin/zenity --info \
    --width=300 --height=50 --no-wrap \
    --timeout=5 \
    --title="알림" \
    --text="부트로더 패치가 완료되었습니다.\n확인 버튼을 누르면 재부팅됩니다." 

sudo -k reboot

 

끝.

 

 

댓글