2022年11月23日水曜日

Win11のブートOS選択タイムはわずか0.05秒に過ぎない。ではOS選択プロセスをもう一度見てみよう。

ずっと前に宇宙刑事の蒸着並みに素早く PC をシャットダウン,再起動等できるスクリプトを作って使用していたが,これに OS 選択・ブートデバイス選択・UEFI セットアップ起動 機能を付けたら便利だと思った.
で,やってみる.以下のコマンドはほとんど管理者モードでしか機能しないので注意.

●boot デバイスの選択
bcdedit /enum all の「ファームウェアのブート マネージャー」にブート可能なデバイスの ID 一覧が列挙されている.その ID が具体的に何なのかは,description を見ればだいたい分かる.

C:\Users\yoshi>bcdedit /enum all

ファームウェアのブート マネージャー
--------------------------------
identifier              {fwbootmgr}
displayorder            {f1255e61-6696-11ed-bf20-806e6f6e6963}
                        {c16a79f0-67b4-11ed-bf38-806e6f6e6963} ---+
                        {0d22d0c4-5a00-11ed-bed1-806e6f6e6963}    |
                        {f5f177c6-6ad7-11ed-bf4c-806e6f6e6963}    |
                        {f5f177c7-6ad7-11ed-bf4c-806e6f6e6963}    |
                        {f5f177c8-6ad7-11ed-bf4c-806e6f6e6963}    |
timeout                 0                                         |
                                                                  |
ファームウェア アプリケーション (101fffff                         |
--------------------------------                                  |
identifier              {0d22d0c4-5a00-11ed-bed1-806e6f6e6963}    |
device                  partition=\Device\HarddiskVolume1         |
path                    \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI          |
description             Windows Boot Manager                      |
                                                                  |
ファームウェア アプリケーション (101fffff                         |
--------------------------------                                  |
identifier              {c16a79f0-67b4-11ed-bf38-806e6f6e6963} ←-+
device                  unknown
description             UEFI: Generic-Multi-Card 1.00, Partition 1
bcdedit /set {fwbootmgr} bootsequence {デバイスのID}
shutdown /r /t 0

を実行すると,再起動後に指定したデバイスがブートする.

●マルチブート OS の選択
BCD でマルチブートを構成している場合,bcdedit /enum all の「Windows ブート マネージャー」にブート可能な OS の ID 一覧が列挙されている.

その ID が具体的に何なのかは,description を見ればだいたい分かる.で

bcdedit /bootsequence {ID}
shutdown /r /t 0

を実行すると,再起動後に指定した OS がブートする.

●UEFI setup 起動

shutdown /r /t 0 /fw

を実行すると,再起動後に UEFI セットアップが起動する (はず).

で powershell でスクリプト組んで作ってみた.で使ってみたら我ながら超便利.
UEFI setup のための [DEL] キー連打に失敗してストレスが溜まる,なんてことが皆無だし,ブート OS 変更のために何回もマウスクリックしてたのが一発だし.超快適ヽ(´ー`)ノ

というわけで以下 powershell のコード.

##############################################################################
# -*- mode: powershell -*-
$Debug = $False
#$Debug = $True
Set-StrictMode -Version 3.0
$ErrorActionPreference = "Stop" # エラーで即停止
$global:Selected = ''
$DialogWidth = 300
$DialogButtonHeight = 50
##############################################################################
# BCD リード
function ReadBCD {
$BcdItems = @{}
foreach($Line in (bcdedit /enum all) -Split '`n'){
if($Line -eq ''){
if(Test-Path Variable:BcdItem){
$BcdItems.Add($BcdItem."identifier", $BcdItem)
Remove-Variable BcdItem
}
}
elseif(!(Test-Path Variable:BcdItem)){
$BcdItem = @{"title" = $Line}
}
elseif($Line -cmatch "^(\w+) +(.*)"){
if($Matches[1] -eq "displayorder"){
$BcdItem.Add($Matches[1], @($Matches[2]))
}else{
$BcdItem.Add($Matches[1], $Matches[2])
}
}
elseif($Line -cmatch "^ +(.*)" -and ($BcdItem.ContainsKey("displayorder"))){
$BcdItem."displayorder" += $Matches[1]
}
}
return $BcdItems
}
##############################################################################
# ボタン追加
function AddButton( $Table, [ref]$Pos, $Label, $OnClick ){
$Button = New-Object System.Windows.Forms.Button
$Button.Dock = "Fill"
$Button.Margin = 0
$Button.text = $Label
$Button.DialogResult = "OK"
$Button.Add_Click($OnClick)
$Table.RowStyles.Add((New-Object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::Percent, 100))) | Out-Null
$Table.Controls.Add($Button, 0, $Pos.Value)
++$Pos.Value
}
##############################################################################
# Form 作成
Add-Type -Assembly PresentationCore
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object System.Windows.Forms.Form
# Form のサイズ
$Form.StartPosition = "CenterScreen"
$Form.MinimizeBox = $False
$Form.MaximizeBox = $False
$Form.TopMost = $True
$Form.Add_Shown({$Form.WindowState = [System.Windows.Forms.FormWindowState]::Normal})
$Table = New-Object System.Windows.Forms.TableLayoutPanel
$Table.ColumnCount = 1
$Table.Dock = "Fill"
# BCD ブートメニューボタン
$ButtonNum = 0
$Form.Font = New-Object System.Drawing.Font("Segoe UI Emoji", 12)
$Form.Text = "BootNext Menu"
# UEFI setup
AddButton $Table ([ref]$ButtonNum) `
"(&A) UEFI Setup" `
({$global:Selected = "setup"}.GetNewClosure())
$BcdItems = ReadBCD
# bootmgr
for($i = 1; $i -lt $BcdItems."{bootmgr}"."displayorder".Length; ++$i){
$BcdItem = $BcdItems.($BcdItems."{bootmgr}"."displayorder"[$i])
AddButton $Table ([ref]$ButtonNum) `
('(&' + [System.Convert]::ToChar(65 + $ButtonNum) + ') ' + $BcdItem."description") `
({$global:Selected = $BcdItem}.GetNewClosure())
}
# disk
for($i = 1; $i -lt $BcdItems."{fwbootmgr}"."displayorder".Length; ++$i){
$BcdItem = $BcdItems.($BcdItems."{fwbootmgr}"."displayorder"[$i])
$Title = ('(&' + [System.Convert]::ToChar(65 + $ButtonNum) + ') ' + $BcdItem."description")
if($BcdItem.ContainsKey("device") -and ($BcdItem."device" -cmatch "Volume(\d+)$")){
$Title += " [Vol:" + $Matches[1] + "]"
}
AddButton $Table ([ref]$ButtonNum) $Title ({$global:Selected = $BcdItem}.GetNewClosure())
}
$Form.ClientSize = [string]$DialogWidth + ',' + ($ButtonNum * $DialogButtonHeight)
$Form.Controls.Add($Table)
# シャットダウン処理
if($Form.Showdialog() -eq 'OK'){
# UEFI setup
if($Selected -eq 'setup'){shutdown /r /f /t 0 /fw}
# 次回ブート設定 (Disk)
elseif($Selected."title" -cmatch "Firmware Application"){
bcdedit /set '{fwbootmgr}' bootsequence $Selected."identifier"
Restart-Computer -Force
}
# 次回ブート設定
else{
bcdedit /bootsequence $Selected."identifier"
Restart-Computer -Force
}
}
view raw bootnext.ps1 hosted with ❤ by GitHub

2022年11月13日日曜日

岐阜基地航空祭2022

岐阜航空基地祭に応募してみたら当たったので行ってきた.航空機地祭に行くのは実は初めてなので超楽しみにしていた.
会場の全貌.例年は 6万人くらいで,今年はコロナ対策で抽選 3.5万人に制限かけてるそうで,それでもこの人の多さ.

電車の都合で開始から少し遅れて到着したら,すでに上空を,今まで見たこと無い低さで飛んでてテンション爆上げ!!
戦闘機のエンジン音が想像のはるか上を行く爆音でワラタwww こういう音圧は現地でないと味わえないから,はるばる来た価値あったわ.

地上展示物も充実していて,もう退役した (多分) F-4EJ なんかは,手でペタペタ触れる位の距離まで近づけるので,細部まで観察できる.その気になればキャノピーイジェクションレバーも触れそうだったけど,これ誰か触ったらどうするんだろうw

F-2A.こっちはペタペタ触るというわけにはいかないが,全周回って見れるので,兵装とか間近で見れて良かった.

その他の展示物.武装とかエンジンとか.

航空祭には初めて行ってみたが,やはり間近に戦闘機を見れて轟音を体感できるのはかなり良かった.
人の大さから入場と帰宅時の混雑が心配だったが,JR で行った自分は特に言うほど混雑はなかった.ただし離陸・着陸が見れる観覧スペース最前列はかなりの競争率だし,地上展示物を見るのにも長時間並んで待たされたり,と,人の多さはネックになった.今年は制限してこれなので,例年はもっと酷いんだろうか.
自分は現地行くのも遠いので,次は F-35 とかオスプレイとか来るんだったら見に行こうかな.

2022年11月6日日曜日

AMD StoreMI を試してみる

PC パーツ入替えで 40GB という微妙な容量の SSD が余ったので,この SSD を HDD キャッシュに使えないかいろいろ調べてみた.
ReadyBoost はシステムドライブが SSD の場合は有効にできなかったが,AMD StoreMI という仕組みがあることがわかったので,早速インストール.

ストレージのベンチマークで数値的に効果があるのは他のサイトの計測で分かっているので,自分の使用シーンでどれだけ効果があるか試してみる.
お題は Cygwin 上で SystemC ライブラリのビルドで,configure ~ make の時間を time コマンドで計測する.make は disk 負荷を高めるために -j 16 で 16スレッド実行する.
で,結果は…

HDD のみStoreMI
1回目2:29.242:38.47
2回目1:55.971:56.61
3回目1:55.361:56.00

全く有意な差なしwww.考えられる原因を推測してみると,
・キャッシュアルゴリズムとしてはおそらくライトスルー制御を行っていると思われるので,ライトには効果がない
・SystemC ライブラリビルドでは,データ量が少な過ぎて OS の DRAM キャッシュが効いてしまっている?
・SSD がそんなに速くない (リード 190MB/s ほど).

StoreMI のいいところを挙げるとすれば,
・HDD が特殊なディスクにならない.HDD のデータは常に最新なので,キャッシュ SSD がおもむろに壊れたとしても,普通の HDD として読めてデータ破壊を起こすことがない
・PC 再起動無しでキャッシュ構築・解除ができる.ちなみに解除時も特にデータを HDD に書き戻してる様子がないので,この点からもライトスルー制御を行っているのは間違いないと思われる.

自分の使い方としてはライトバック制御を実装してほしいところ.ゲームとか大量の ReadOnly データを読み込むと効果あったりするんかな.

2022年11月3日木曜日

PC 更新

ちょっと前に 4K モニタを買ったが,特に動画表示が少しもたつくので,もう 6年もパーツを変えていないしなぁ,と 6年ぶりに PC を新調.
 
CPUAMD Ryzen 5 5600G¥18,000
CPUクーラー(CPU 付属)¥0
マザボASRock A520M Pro4¥10,800
メモリCFD W4U3200CS-8G 8GBx2¥6,090
SSDKIOXIA EXCERIA G2 SSD-CK500N3G2/N (500GB)¥4,980
HDD(使い回し) WDC WD60EZAZ-00ZGHB0 (6TB)¥0
光学ドライブ(使い回し) ASUS DRW-24d5MT¥0
ケース(使い回し) Antec ThreeHundred ¥0
電源(使い回し) SILVERSTONE SST-ST50F-ES¥0
合計¥39,870

基本的にローエンド構成で,PC ゲームもしないので GPU 内蔵 CPU だが,今回は壊れた PS2 の代替として PS2 エミュレータを動かしたいので,珍しく 2万近い CPU を購入 (いつもは 1万ちょっとのやつしか買わない).
 SSD は 128GB の使い回しでも良かったけど,ちょうど Amazon でセールしてたので衝動買い.

ケチって電源使いまわしのため,データ移行作業が大変w PC 起動してないと取り出せない設定データとかもあり,旧 PC も起動できないといけないので.

組み上がって使ってみた感想としては,もとからそんなに重い処理してないので,速さは体感できない.ただし,YouTube 複窓してもカクつかなくなったので,そこだけは体感できたかな.