Ubuntu22.04でのOpenVPNサーバーの設定

前提条件

※tun(ルーティング)方式で設定する
※自宅用なのでセキュリティリスク(CAの秘密鍵へのアクセス)を承知した上でOpenVPNサーバーとCAを同じマシンにインストールする

・ Ubuntu: 22.04.1
・ openvpn: 2.5.5
・ easy-rsa: 3.0.8
・ openssl: 3.0.2

サーバー設定手順

openvpnとeasy-rsaをインストールする。

# apt install openvpn easy-rsa

ルート証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CA_EXPIRE=7300

公開鍵基盤(PKI)を初期化して認証局(CA)を設置する。CA作成時に秘密鍵のパスフレーズを聞いてくる。このパスフレーズは新しい証明書発行時に必要になる。

# cd /usr/share/easy-rsa/
# ./easyrsa init-pki
# ./easyrsa build-ca

認証局(CA)が発行する証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_EXPIRE=3650

VPNサーバー用の証明書を作成する。
※パスフレーズは不要なのでnopassを指定

# ./easyrsa build-server-full vpn.example.com nopass

Diffie-Hellmanパラメーターファイルを作成する。

# ./easyrsa gen-dh

TLS-AuthのHMACに使用する共通鍵を作成する。

# openvpn --genkey secret /etc/openvpn/server/ta.key

OpenVPNサーバーの設定ファイルをサンプルからコピーする。

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/

設定ファイルを下記のように変更する。
※重要そうな箇所のみ記載
※serverにはクライアントに割り当てられるipアドレスを定義
※push(route)にはクライアントにアクセスを許可するサーバーのプライベートネットワークを指定
※push(redirect-gateway)でクライアントのIPトラフィックがVPNを通過するよう設定
※push(dhcp-option DNS)でクライアントが使用するDNSサーバーを指定
※client-to-clientでクライアント同士の通信を許可
※duplicate-cnで同じ証明書を使用した複数のクライアント接続を許可(非推奨)

port 7716
proto udp
dev tun
ca /usr/share/easy-rsa/pki/ca.crt
cert /usr/share/easy-rsa/pki/issued/vpn.example.com.crt
key /usr/share/easy-rsa/pki/private/vpn.example.com.key
dh /usr/share/easy-rsa/pki/dh.pem
server 172.16.1.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.11"
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
tls-auth server/ta.key 0

IPフォワードを有効にして、異なるネットワーク(NIC)間でパケットが転送されるように設定変更する。

# sed -i "s/#net.ipv4.ip_forward/net.ipv4.ip_forward/g" /etc/sysctl.conf
# sysctl -p

iptablesでIPマスカレードを有効に設定する。

# apt install iptables-persistent
# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o [デバイス] -j MASQUERADE
# netfilter-persistent save

サービスを有効化して起動する。

# systemctl enable --now openvpn@server

クライアント証明書の発行

クライアントに配る*.ovpnを作成するのが面倒なのでスクリプトを作成した。地味にハマったポイントはTLS-Authの「key-direction 1」サーバーの設定が0なら1にする必要がある。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa
sample_config_location=/usr/share/doc/openvpn/examples/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "作成するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
echo "クライアント接続設定ファイル「$id.ovpn」を作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa build-client-full $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にしてスクリプトを実行すれば対話型でクライアント用の*.ovpnを作成できる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x build-client-ovpn.sh
# ./build-client-ovpn.sh

クライアント証明書の更新

更新が可能になる期間を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_RENEW=365

これも面倒なので更新用のスクリプトを作成した。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa
sample_config_location=/usr/share/doc/openvpn/examples/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "更新するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
if [ ! -f "$easyrsa_location/pki/issued/$fullname.crt" ]; then
    echo "既存の証明書が見つかりませんでした。"
    exit 1
fi
echo "クライアント接続設定ファイル「$id.ovpn」を再作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa renew $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にすれば対話型で更新ができる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x renew-client-ovpn.sh
# ./renew-client-ovpn.sh

AlmaLinux9でのOpenVPNサーバーの設定

前提条件

※tun(ルーティング)方式で設定する
※自宅用なのでセキュリティリスク(CAの秘密鍵へのアクセス)を承知した上でOpenVPNサーバーとCAを同じマシンにインストールする

・ AlmaLinux: 9.1
・ openvpn: 2.5.8-1
・ easy-rsa: 3.0.8-3
・ openssl: 3.0.1-43

サーバー設定手順

openvpnとeasy-rsaをインストールする。

# dnf install epel-release
# dnf install openvpn easy-rsa

ルート証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CA_EXPIRE=7300

公開鍵基盤(PKI)を初期化して認証局(CA)を設置する。CA作成時に秘密鍵のパスフレーズを聞いてくる。このパスフレーズは新しい証明書発行時に必要になる。
※このときのopensslにはバグがあり2度パスフレーズを聞かれるが最初のは無視される

# cd /usr/share/easy-rsa/3.0.8/
# ./easyrsa init-pki
# ./easyrsa build-ca

認証局(CA)が発行する証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_EXPIRE=3650

VPNサーバー用の証明書を作成する。
※パスフレーズは不要なのでnopassを指定

# ./easyrsa build-server-full vpn.example.com nopass

Diffie-Hellmanパラメーターファイルを作成する。

# ./easyrsa gen-dh

TLS-AuthのHMACに使用する共通鍵を作成する。

# openvpn --genkey secret /etc/openvpn/server/ta.key

OpenVPNサーバーの設定ファイルをサンプルからコピーする。

# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

設定ファイルを下記のように変更する。
※重要そうな箇所のみ記載
※serverにはクライアントに割り当てられるipアドレスを定義
※push(route)にはクライアントにアクセスを許可するサーバーのプライベートネットワークを指定
※push(redirect-gateway)でクライアントのIPトラフィックがVPNを通過するよう設定
※push(dhcp-option DNS)でクライアントが使用するDNSサーバーを指定
※client-to-clientでクライアント同士の通信を許可
※duplicate-cnで同じ証明書を使用した複数のクライアント接続を許可(非推奨)

port 7716
proto udp
dev tun
ca /usr/share/easy-rsa/3.0.8/pki/ca.crt
cert /usr/share/easy-rsa/3.0.8/pki/issued/vpn.example.com.crt
key /usr/share/easy-rsa/3.0.8/pki/private/vpn.example.com.key
dh /usr/share/easy-rsa/3.0.8/pki/dh.pem
server 172.16.1.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.11"
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
tls-auth ta.key 0

IPフォワードを有効にして、異なるネットワーク(NIC)間でパケットが転送されるように設定変更する。

# echo -e "\n# Controls IP packet forwarding\nnet.ipv4.ip_forward = 1" >>/etc/sysctl.conf
# sysctl -p

ファイアウォールに使用するポートを例外登録し、IPマスカレードも有効に設定する。

# firewall-cmd --permanent --add-port=7716/udp
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --reload

SELinuxのポリシー変更を行うためのユーティリティをインストールする。

# dnf install policycoreutils-python-utils

SELinuxがopenvpnに通信許可するポートを追加する。
※-lオプションで確認したタイプ名はopenvpn_port_t

# semanage port -t openvpn_port_t -a -p udp 7716

サービスを有効化して起動する。

# systemctl enable --now openvpn-server@server

クライアント証明書の発行

クライアントに配る*.ovpnを作成するのが面倒なのでスクリプトを作成した。地味にハマったポイントはTLS-Authの「key-direction 1」サーバーの設定が0なら1にする必要がある。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "作成するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
echo "クライアント接続設定ファイル「$id.ovpn」を作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa build-client-full $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にしてスクリプトを実行すれば対話型でクライアント用の*.ovpnを作成できる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x build-client-ovpn.sh
# ./build-client-ovpn.sh

クライアント証明書の更新

更新が可能になる期間を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_RENEW=365

これも面倒なので更新用のスクリプトを作成した。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "更新するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
if [ ! -f "$easyrsa_location/pki/issued/$fullname.crt" ]; then
    echo "既存の証明書が見つかりませんでした。"
    exit 1
fi
echo "クライアント接続設定ファイル「$id.ovpn」を再作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa renew $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にすれば対話型で更新ができる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x renew-client-ovpn.sh
# ./renew-client-ovpn.sh

Windows11のPowerShellスクリプトでVPNサーバーに接続する

・VPNサーバーに接続できるよう事前に設定
・接続名は「会社」とする

下記のように設定ファイルを編集して確認を表示せずに接続するよう変更。

…
PreviewUserPw=0
…

PowerShellスクリプトを適当な名前で作成する。

$connectionName = "会社"
$result = ipconfig | Select-String $connectionName
if ($result -like "*" + $connectionName + "*") {
    echo "ok"
} else {
    rasphone -d $connectionName
}

下記のような感じで実行する。

powershell -ExecutionPolicy RemoteSigned -File connect-vpn.ps1

ffmpegの基本的な使い方

動画をリサイズする。

$ ffmpeg -i source.mp4 -vf scale=1280:-1 destination.mp4

開始位置と秒数を指定して動画をトリミングする。

$ ffmpeg -i source.mp4 -ss 0:10 -t 30 destination.mp4

開始位置と終了位置を指定して動画をトリミングする。

$ ffmpeg -i source.mp4 -ss 0:10 -to 0:40 destination.mp4

元ファイルのコーデックを使用して動画を連結する。

$ echo -e "file 'source1.mp4'\nfile 'source2.mp4'\n" >ffmpeg_files.txt
$ ffmpeg -f concat -i ffmpeg_files.txt -c copy destination.mp4
$ rm ffmpeg_files.txt

フレームレートを指定して動画をgifに変換する。

$ ffmpeg -i source.mp4 -r 20 destination.gif

Windows11のブルースクリーンの原因を追求する

Windwos11がシャットダウンの最後に必ずブルースクリーンを表示するようになってしまい、その原因を突き止めることが目的。ブルースクリーンが表示する内容は下記のみで全く切り分けられない。

問題が発生したため、PC を再起動する必要があります。
自動的に再起動します。

この問題と可能な解決方法の詳細については、https://www.windows.com/stopcodeを参照してください。

サポート担当者に連絡する場合は、この情報を伝えてください:
停止コード: WDF_VIOLATION

MicrosoftのWEBサイトから「Windows SDK」のインストーラーをダウンロード、「Debugging Tools for Windows」のみを選択してインストールする。

WinDbgを起動して「File」→「Symbol File Path…」でシンボルパスを設定しておくと情報が多く手に入るかもしれないということで、とりあえず下記を設定しておく。
srv*C:\Users\user\symbols*https://msdl.microsoft.com/download/symbols

引き続きWinDbgで「File」→「Open Crash Dump…」でブルースクリーン発生時に保存されたMEMORY.DMPを開くと「esif_lf.sys」が原因と分かったので「Intel Dynamic Platform Thermal Framework」のドライバーを更新して不具合を解消した。

Microsoft (R) Windows Debugger Version 10.0.22621.755 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:\Users\user\Desktop\MEMORY.DMP]
Kernel Bitmap Dump File: Kernel address space is available, User address space may not be available.

Dump completed successfully, progress percentage: 100

WARNING: Whitespace at end of path element
Error: Empty Path.
WARNING: Whitespace at end of path element
Symbol search path is: SRV*C:\Users\user\symbols*https://msdl.microsoft.com/download/symbols

Executable search path is: 
WARNING: Whitespace at end of path element
Windows 10 Kernel Version 22000 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS Personal
Edition build lab: 22000.1.amd64fre.co_release.210604-1628
Machine Name:
Kernel base = 0xfffff801`7de00000 PsLoadedModuleList = 0xfffff801`7ea29980
Debug session time: Fri Jan 20 12:14:18.541 2023 (UTC + 9:00)
System Uptime: 0 days 0:03:49.661
Loading Kernel Symbols
...............................................................
................................................................
..............................................................
Loading User Symbols

Loading unloaded module list
...................
For analysis of this file, run !analyze -v
1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

WDF_VIOLATION (10d)
The Kernel-Mode Driver Framework was notified that Windows detected an error
in a framework-based driver. In general, the dump file will yield additional
information about the driver that caused this BugCheck.
Arguments:
Arg1: 000000000000000d, A power IRP was received for the device but the IRP was not
	requested by the device (the power policy owner). Possibly there
	are multiple power policy owners. Only one driver in the stack can
	be the power policy owner. A KMDF driver can change power policy
	ownership by calling the DDI WdfDeviceInitSetPowerPolicyOwnership.
Arg2: ffffe5838a695bd0, Device object pointer.
Arg3: ffffe5838d1ec010, Power IRP.
Arg4: ffffe58389f64db0, Reserved.

Debugging Details:
------------------

Unable to load image \SystemRoot\System32\drivers\esif_lf.sys, Win32 error 0n2

KEY_VALUES_STRING: 1

    Key  : Analysis.CPU.mSec
    Value: 4327

    Key  : Analysis.DebugAnalysisManager
    Value: Create

    Key  : Analysis.Elapsed.mSec
    Value: 13842

    Key  : Analysis.Init.CPU.mSec
    Value: 2030

    Key  : Analysis.Init.Elapsed.mSec
    Value: 26253

    Key  : Analysis.Memory.CommitPeak.Mb
    Value: 104

    Key  : WER.OS.Branch
    Value: co_release

    Key  : WER.OS.Timestamp
    Value: 2021-06-04T16:28:00Z

    Key  : WER.OS.Version
    Value: 10.0.22000.1


FILE_IN_CAB:  MEMORY.DMP

DUMP_FILE_ATTRIBUTES: 0x1000

BUGCHECK_CODE:  10d

BUGCHECK_P1: d

BUGCHECK_P2: ffffe5838a695bd0

BUGCHECK_P3: ffffe5838d1ec010

BUGCHECK_P4: ffffe58389f64db0

DEVICE_OBJECT: ffffe5838a695bd0

IRP_ADDRESS: ffffe5838d1ec010

DRIVER_OBJECT: ffffe5838a9c4e30

IMAGE_NAME:  esif_lf.sys

MODULE_NAME: esif_lf

FAULTING_MODULE: fffff801967e0000 esif_lf

BLACKBOXBSD: 1 (!blackboxbsd)


BLACKBOXNTFS: 1 (!blackboxntfs)


BLACKBOXPNP: 1 (!blackboxpnp)


BLACKBOXWINLOGON: 1

PROCESS_NAME:  System

STACK_TEXT:  
fffff58e`a9d79568 fffff801`7fe8c6bc     : 00000000`0000010d 00000000`0000000d ffffe583`8a695bd0 ffffe583`8d1ec010 : nt!KeBugCheckEx
fffff58e`a9d79570 fffff801`7fe5b534     : ffffe583`8a8dd770 fffff58e`a9d79690 00000000`00000000 fffff58e`a9d796a0 : Wdf01000!FxVerifierBugCheckWorker+0x24 [minkernel\wdf\framework\shared\object\fxverifierbugcheck.cpp @ 68] 
fffff58e`a9d795b0 fffff801`7fe2c655     : ffffe583`8a8dd770 fffff58e`a9d79678 00000000`00000004 00000000`00000000 : Wdf01000!FxPkgFdo::DispatchDeviceSetPower+0x2ed68 [minkernel\wdf\framework\shared\irphandlers\pnp\fdopower.cpp @ 324] 
fffff58e`a9d79600 fffff801`7fe2b459     : ffffe583`8a8dd770 00000000`00000000 ffffe583`00000000 00000000`00000202 : Wdf01000!FxPkgFdo::_DispatchSetPower+0x25 [minkernel\wdf\framework\shared\irphandlers\pnp\fdopower.cpp @ 120] 
fffff58e`a9d79630 fffff801`7fe23d83     : ffffe583`8d1ec010 ffffe583`8d1ec010 ffffe583`8ccf4aa0 fffff58e`a9d79730 : Wdf01000!FxPkgPnp::Dispatch+0xd9 [minkernel\wdf\framework\shared\irphandlers\pnp\fxpkgpnp.cpp @ 771] 
fffff58e`a9d796a0 fffff801`7e1a29a7     : 00000000`00000100 00000000`00000000 00000000`00000000 00000000`00000000 : Wdf01000!FxDevice::DispatchWithLock+0x153 [minkernel\wdf\framework\shared\core\fxdevice.cpp @ 1447] 
fffff58e`a9d79710 fffff801`7e042a7d     : 00000000`80000000 00000000`00000000 00000000`00000100 fffff801`a45a9e1b : nt!IopPoHandleIrp+0x3b
fffff58e`a9d79740 fffff801`7e1a5e69     : 00000000`00000001 fffff58e`a9d79801 fffff801`78f9a101 00000000`00000000 : nt!IofCallDriver+0x6d
fffff58e`a9d79780 fffff801`a45a9db8     : ffffe583`8cd0a316 00000000`00000000 ffffe583`8ccf4aa0 00000000`00000000 : nt!IoCallDriver+0x9
fffff58e`a9d797b0 fffff801`a45b2288     : ffffe583`8cd0a330 00000000`0000000e 00000000`00000000 00000000`00000000 : WUDFRd!RdPnpTracker::RdPnpForwardToLowerDevice+0x80 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 2050] 
fffff58e`a9d79800 fffff801`a45b2123     : ffffffff`ffffffff 00000000`00000000 ffffe583`89410040 00000000`00000000 : WUDFRd!RdPnpTracker::RdPnpProcessor+0x318 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 1199] 
fffff58e`a9d798b0 fffff801`a45b1f51     : ffffe583`87fb3d40 00000000`00000000 00000000`00000000 00000000`00000100 : WUDFRd!RdPnpTracker::RdPnpProcessor+0x1b3 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 1131] 
fffff58e`a9d79960 fffff801`7e0afe6b     : 00000000`891ac3d0 ffffe583`87fb3d40 ffffe583`89110300 fffff801`7eb33680 : WUDFRd!RdPnpTracker::RdPnpCallbackAtPassiveInSystemProcess+0x11 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 2167] 
fffff58e`a9d79990 fffff801`7e08fb3f     : ffffe583`872bfaa0 ffffe583`89410040 ffffe583`87fb3d40 884e158d`00000000 : nt!IopProcessWorkItem+0xfb
fffff58e`a9d79a00 fffff801`7e154295     : ffffe583`89410040 ffff8c00`954f5000 ffffe583`89410040 0043806f`bd9bbfff : nt!ExpWorkerThread+0x14f
fffff58e`a9d79bf0 fffff801`7e220e34     : ffff8c00`954e6180 ffffe583`89410040 fffff801`7e154240 f39ee8cb`8bd08b20 : nt!PspSystemThreadStartup+0x55
fffff58e`a9d79c40 00000000`00000000     : fffff58e`a9d7a000 fffff58e`a9d74000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x34


STACK_COMMAND:  .cxr; .ecxr ; kb

FAILURE_BUCKET_ID:  0x10D_d_IMAGE_esif_lf.sys

OS_VERSION:  10.0.22000.1

BUILDLAB_STR:  co_release

OSPLATFORM_TYPE:  x64

OSNAME:  Windows 10

FAILURE_ID_HASH:  {ceef9bfa-ef59-e1ba-c2b4-cd009412ae92}

Followup:     MachineOwner
---------

Ubuntuを使ってWindows11のHDD(500GB)からSSD(256GB)のクローンを作成する

500GBのHDDから256GBのSSDに換装するのが目的。

BitLockerが有効な場合な無効化する
HDD全体のイメージバックアップを取る
HDDの使用領域を250GB程度に収める

gpartedをインストールして起動し、必要なパーティションの終了セクタが500,000,000(256GB÷512)程度以下なるように調整して、それ以降のセクタを削除する。

# apt install gparted

事前にlsblkなどでデバイスパスを把握し、ddコマンドでコピーする。
※countの値は256GB÷1024k

# dd if=/dev/[コピー元] of=/dev/[コピー先] bs=1024k count=256k status=progress

コピーが終了したらgdiskでパーティションテーブルを修正する。

# gdisk /dev/[コピー先]
GPT fdisk (gdisk) version 1.0.8

Warning! Disk size is smaller than the main header indicates! Loading
secondary header from the last sector of the disk! You should use 'v' to
verify disk integrity, and perhaps options on the experts' menu to repair
the disk.
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: ERROR
Main partition table: OK
Backup partition table: ERROR

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: damaged

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************

Command (? for help): x

Expert command (? for help): v

Caution: The CRC for the backup partition table is invalid. This table may
be corrupt. This program will automatically create a new backup partition
table when you save your partitions.

Problem: The secondary header's self-pointer indicates that it doesn't reside
at the end of the disk. If you've added a disk to a RAID array, use the 'e'
option on the experts' menu to adjust the secondary header's and partition
table's locations.

Problem: Disk is too small to hold all the data!
(Disk size is 488397168 sectors, needs to be 1953525168 sectors.)
The 'e' option on the experts' menu may fix this problem.

Problem: GPT claims the disk is larger than it is! (Claimed last usable
sector is 1953525134, but backup header is at
1953525167 and disk size is 488397168 sectors.
The 'e' option on the experts' menu will probably fix this problem

Partition(s) in the protective MBR are too big for the disk! Creating a
fresh protective or hybrid MBR is recommended.

Identified 5 problems!

Expert command (? for help): e
Relocating backup data structures to the end of the disk

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/[コピー先].
The operation has completed successfully.

Windowsのパーティションが見えるようになったら、最後にgpartedで右端に余っている空き領域を利用できるよう設定する。

Windows11のbatファイルで物理メモリ容量を取得する

@echo off
setlocal enabledelayedexpansion
    set memoryinfo=
    for /f "usebackq tokens=*" %%i in (`wmic computersystem get TotalPhysicalMemory`) do (
        set memoryinfo=!memoryinfo!^%%i
    )
    set memory=
    for %%p in (%memoryinfo%) do (
        set test=number%%p
        set test=!test:0=!
        set test=!test:1=!
        set test=!test:2=!
        set test=!test:3=!
        set test=!test:4=!
        set test=!test:5=!
        set test=!test:6=!
        set test=!test:7=!
        set test=!test:8=!
        set test=!test:9=!
        if "!test!" == "number" (
            set memory=%%p
        )
    )
    set memory=%memory:~0,-3%
    echo %memory%KB
    set /a memory=%memory%/1000
    echo %memory%MB
    set /a memory=%memory%/1000
    echo %memory%GB
endlocal
pause

Ubuntu22.04のgrubでfsckのメッセージだけが表示される問題

plymouthが開始される前に数秒だけ「/dev/nvme0n1p2: clean, 219170/31227904 files, 4614538/124895488 blocks」というメッセージが表示される。ディスクチェックが正常に終了したというfsckからのメッセージらしいけど、格好悪いので非表示にしたい。

Ubuntu 22.04.1

下記の内容でファイルを作成する。

FRAMEBUFFER=y

下記のコマンドを実行する。

# update-initramfs -u