Windowsをリモートで操作してUbuntuのLive版を一度だけ起動する
Windowsが動いているPCにリモート接続してUbuntuのLive DVDを一度だけ起動する方法のメモ
きっかけ
自宅でサーバ機として使っているPCのOSドライブをHDDからSSDに変更するために適当なLinuxのLiveCDを起動させようと思ったが、このPCには画面やキーボードを繋いでおらず繋ぐのも面倒くさかったため、なんとかRDP接続やシリアルコンソールだけでHDDからSSDへのデータコピーができないか頑張ってみることにした。
注意
- もし失敗すると面倒くさいことになるので、必ず物理的なアクセスができる状態で実施する。
環境
- OS: Windows Server 2019 / Ubuntu 22.04.1 (Desktop版, Live CD)
- EFIブートな環境
Ubuntu起動
Ubuntuに限らずEFIブートができるCD/DVDは、適当なFAT32パーティションに中身をすべてコピーすることで起動することができる。
例えばESXiをインストールするときには、FAT32でフォーマットしてあるUSBメモリにESXiのISOの中身をすべて展開して、PCのBIOS画面からUSBドライブを選択すると普通に起動する。
このことを応用して今回は
- Windowsのパーティションを縮小し
- 空いた領域にFAT32のパーティションを作成し
- UbuntuのDesktop版のISOの中身を展開し
- EFIに新しく作ったパーティションを認識させるためにPCを再起動し
- BIOS(EFI)のブート順を一度だけ変更し
- PCを再起動
することでPCに物理的に触れることなくUbuntuのLive版を起動することにした。
ここでは1-4は省略し、5の手順を記載する。
リモートからBIOS(EFI)のブート順を一度だけ変更するのは bcdedit
を使えば実現できる。
コマンドプロンプトを管理者起動して bcdedit /enum firmware
とすると、現在EFIが認識しているパーティションやOSが表示される。
C:\Windows\system32>bcdedit /enum firmware
ファームウェアのブート マネージャー
--------------------------------
identifier {fwbootmgr}
displayorder {bootmgr}
{ea432f94-8e62-11ed-9f50-806e6f6e6963}
timeout 2
Windows ブート マネージャー
--------------------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume1
path \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description Windows Boot Manager
locale ja-JP
inherit {globalsettings}
badmemoryaccess Yes
bootems Yes
isolatedcontext Yes
bootshutdowndisabled Yes
default {current}
displayorder {current}
toolsdisplayorder {memdiag}
timeout 10
displaybootmenu Yes
ファームウェア アプリケーション (101fffff
--------------------------------
identifier {ea432f94-8e62-11ed-9f50-806e6f6e6963}
device partition=X:
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
badmemoryaccess Yes
今回はXドライブにUbuntuのISOを展開しているため、{ea432f94-8e62-11ed-9f50-806e6f6e6963}
が起動するように設定を変更すればよい。
C:\Windows\system32>bcdedit /set {fwbootmgr} bootsequence {ea432f94-8e62-11ed-9f50-806e6f6e6963}
この操作を正しく終了しました。
C:\Windows\system32>bcdedit /enum firmware
ファームウェアのブート マネージャー
--------------------------------
identifier {fwbootmgr}
displayorder {bootmgr}
{ea432f94-8e62-11ed-9f50-806e6f6e6963}
bootsequence {ea432f94-8e62-11ed-9f50-806e6f6e6963}
timeout 2
Windows ブート マネージャー
--------------------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume1
path \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description Windows Boot Manager
locale ja-JP
inherit {globalsettings}
badmemoryaccess Yes
bootems Yes
isolatedcontext Yes
bootshutdowndisabled Yes
default {current}
displayorder {current}
toolsdisplayorder {memdiag}
timeout 10
displaybootmenu Yes
ファームウェア アプリケーション (101fffff
--------------------------------
identifier {ea432f94-8e62-11ed-9f50-806e6f6e6963}
device partition=X:
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
badmemoryaccess Yes
C:\Windows\system32>
上記のようにbootsequenceに該当パーティションのidentifierを指定すればOK。
これで再起動すればUbuntuが立ち上がってくる。
Ubuntu終了
UbuntuのLive版はシャットダウン時に Please remove the installation medium, then press ENTER:
というメッセージを出してきて、Enterキーを押すまで待機する。
今回は遠隔から操作している都合上、Enterキーは押せないのでこの仕組みを回避してからシャットダウン/再起動を実施する。
この仕組みを実装しているのは /sbin/casper-stop
というシェルスクリプトなので、テキストエディタで exit 0
を上の方に記載し、即時にこのスクリプトが終了するようにすればOK。
UbuntuのLive版でシリアルコンソールを使う
ここまでやってUbuntuが立ち上がったが、残念なことにLive版ではsshdが起動しておらず遠隔から接続ができなかった。
今回のPCではシリアルコンソールが使えるため、GRUB2の設定を変更してシリアルコンソールを有効にした。
修正するファイルは boot/grub/grub.cfg
以下のように linux の行に console=ttyS0,115200n8
を追記する。
menuentry "Try or Install Ubuntu" {
set gfxpayload=keep
linux /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet console=ttyS0,115200n8 splash ---
initrd /casper/initrd
}
蛇足
-
SSHができないと不便なので、多分netinstとかserver版のISOとかを使った方が良い。
-
HDD -> SSD移行時にパーティションのUUIDを移行し忘れて、結局Windowsがブートしなくて画面(キャプチャボード)とキーボードを繋ぐことになった。悲しい。
-
ちなみにこれは
bcdedit
でdevice
とosdevice
を再設定してあげたら直った。