Windowsをリモートで操作してUbuntuのLive版を一度だけ起動する

目次

Windowsが動いているPCにリモート接続してUbuntuのLive DVDを一度だけ起動する方法のメモ

きっかけ

自宅でサーバ機として使っているPCのOSドライブをHDDからSSDに変更するために適当なLinuxのLiveCDを起動させようと思ったが、このPCには画面やキーボードを繋いでおらず繋ぐのも面倒くさかったため、なんとかRDP接続やシリアルコンソールだけでHDDからSSDへのデータコピーができないか頑張ってみることにした。

注意

  1. もし失敗すると面倒くさいことになるので、必ず物理的なアクセスができる状態で実施する。

環境

  • 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ドライブを選択すると普通に起動する。

このことを応用して今回は

  1. Windowsのパーティションを縮小し
  2. 空いた領域にFAT32のパーティションを作成し
  3. UbuntuのDesktop版のISOの中身を展開し
  4. EFIに新しく作ったパーティションを認識させるためにPCを再起動し
  5. BIOS(EFI)のブート順を一度だけ変更し
  6. 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がブートしなくて画面(キャプチャボード)とキーボードを繋ぐことになった。悲しい。

    エラー画面

  • ちなみにこれは bcdeditdeviceosdevice を再設定してあげたら直った。