【ZORIN OS(Ubuntu)】aptの自動実行の設定

Debian系には自動でapt upgrade(パッケージ更新)を実行してくれる「unattended-upgrades」があるため、それの設定方法のメモ。
なんと自分でcrontabでスケジュールを作る必要がないのである。
Debian系なので当然Ubuntuがベースのものもすべて使えます。今回はZorinOS 17.3。

1./etc/apt/apt.conf.d配下の確認

unattended-upgradesはデフォルトで入っているため、/etc/apt/apt.conf.d配下に以下のファイルがあるかを念の為確認。

/etc/apt/apt.conf.d/10periodic
/etc/apt/apt.conf.d/20auto-upgrades
/etc/apt/apt.conf.d/50unattended-upgrades

デフォルトで入っているどころか、OS入れた時点から実は自動で動作もしているらしい。
以下、20auto-upgradesのファイルを見てみると・・・

$ cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Unattended-Upgrade "1";
となっており、Unattended-Upgradeが有効になっていることを示しています。
※正確に言うと、「1」は毎日動くことを示すらしい?

2.自動アップデートの有効化

バックアップを取りつつ、標準パッケージの自動アップデートを有効します。

$ sudo cp -a /etc/apt/apt.conf.d/50unattended-upgrades /etc/apt/apt.conf.d/50unattended-upgrades.bak

$ sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
// "${distro_id}:${distro_codename}-updates";

コメントアウトを削除
"${distro_id}:${distro_codename}-updates";

3.実行時間の変更

特に変更する必要はないですが、変更するのであれば、以下のファイルを変更します。

$ sudo vi /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=60m
Persistent=true

[Install]
WantedBy=timers.target


$ sudo vi /lib/systemd/system/apt-daily.timer

[Unit]
Description=Daily apt download activities

[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target

apt-daily-upgrade.timerはapt upgradeを18時に実行
apt-daily.timerはapt updateを6時と18時に実行
となる。

4.systemdで再起動

設定を反映させるため、systemdで再起動します。

$ sudo systemctl restart apt-daily.timer
$ sudo systemctl status apt-daily-upgrade.timer

【ハンターカブ】タイヤ交換のやり方【CT125】

1.はじめに

全然ITと関係ないけど、ここが一番都合がいいのでここで書いておく。
とりあえず未来の自分へ。これを読め。

2.フロントタイヤの外し方

2-1.ブレーキキャリパーを外す

バイクはセンタースタンドで立てる。もしくはジャッキを使う。
ボルトは12mm。外した後のキャリパーは適当にぶら下げてても問題なし

2-2.タイヤの空気を抜く

ムシ回しであらかじめ空気を抜く。アクスルシャフトを外してからでもいい。チューブを再利用する場合はムシはなくさないように注意。

2-3.アクスルシャフトを外す

アクスルシャフトは正面から見て左(ボルトの頭)が14mm、右(ナット)が19mm。基本的にはナット側を回して外す。この際、左側は空回りするので自力か他の方法で固定が必要。
アクスルシャフトを抜くときはタイヤが落ちるので、あらかじめタイヤを足の甲とかで抑えながら慎重に抜く。シャフトは手で抜ければいいが、難しい場合はゴムハンマーで右側からコンコン叩く。タイヤが外れた際に軸についているカラーも落ちる可能性あり。なくさないように注意。

3.タイヤ交換

なんかいい感じのYoutubeの解説動画を見よ。
軽点(タイヤについてる黄色い丸マーク)とバルブ穴は合わせよ。バルブ穴からチューブバルブは通しづらいが、まっすくになるようにし、ずれないように固定ナットを仮止めしておくべし。
 
ブレーキディスクは下にして作業はしない。歪みの原因になるため。
 
タイヤを外すときは、タイヤのビードをいい感じにひっかけてやるべし。この時、シリコンスプレーとかけておくとスムーズにいく。なくてもまぁ行ける。
チューブを新しくする場合は適当でも問題なし。再利用する場合は破らないように注意してやるべし。
タイヤをつけるときは、ホイールのフチを浅くひっかけるようにし、チューブを巻き込まないように慎重、かつ大胆にやるべし。
 
ビードワックスはとにかく大量に付けろ。ビードが入ったところは順次ふき取っておいた方がいい。付いたままだとビートが外れやすくなるため。
タイヤがホイールに入ったら、チューブが挟まってないかをギュッと握ったりしながら回しつつ全体的に確認すること。

4.フロントタイヤの取り付け

4-1.フロントフェンダーの固定ボルトを緩める

タイヤを取り付けるときには、あらかじめフロントフェンダーの内側にあるボルトを、左右どちらかを緩めておく(多分右のほうがやりやすい)。径は10mm。これをやっておかないとタイヤを取り付ける際に、軸に付けたカラーが落ちまくる。

4-1.アクスルシャフトを入れる

足の甲でタイヤを持ち上げて軸を合わせつつ、左からシャフトをいれていく。ゴムハンマーは軸があってるけどうまく進まない場合に使う。強く叩きすぎない。
シャフトが貫通したら、手回しでナットを締めていく。
ある程度締めたら、トルクレンチで59Nで締める。この際、左側のボルトは外すときと同様、固定が必要(そうしないと空回りする)。

4-2.ブレーキキャリパーを取り付ける。

キャリパーがブレーキディスクを挟むようになっていることを確認しつつ付ける。ブレーキキャリパーはトルクレンチで30Nで締める。

4-3.フロントフェンダーの固定ボルトを締める

忘れないように実施。締め具合は適当でOK。

4-4.フロントタイヤの回転を確認

手回しでフロントタイヤに問題がないか確認。前ブレーキも握ってタイヤが止まるかを確認。

4-5.空気を入れる

175kpaで空気を入れる。

5.リアタイヤの外し方

フロントタイヤと同様のやり方でアクスルシャフトを外す。径はフロントと同様、後ろから見て左が14mm、右が19mm。
ナットを緩める時には下方向に力を入れることになる。
なので、重心がバイクの後ろ側になり、バイクのバランスが崩れる可能性がある。
あらかじめフロント側に重さにある何かを付けておくこと。

ナットが緩んだら、プレート、ワッシャー、ナットを一時保管しておく。
アクスルシャフトは左から抜くのはおそらく困難なので、シャフトより径の小さいいい感じの棒を用意し、それを使って右側から押し出すようにゴムハンマーでシャフトを叩き、少しづつ抜いていく。
まずアジャスターエンド↓を外す。この時点でゴムハンマーでたたくのは一時ストップし、アジャスターエンドを保管。円の外側に凸が2つ付いている方が外側なのでつけるときに誤らないようにする。

 
リアキャリパーは固定されているわけではない。リアキャリパーがシャフトから解放されたら、いったんゴムハンマー叩きを止め、タイヤを外す際に邪魔にならないようになんかいい感じにしておく。
ここまでくると叩かなくてもアクスルシャフトは抜けるはず。タイヤが一気に落ちないように足の甲で固定しつつゆっくり下すようにする。
左側についているアジャスターエンド、プレート、ワッシャーも一時保管しておく(右側のと混ざらないようにする)。
チェーンはタイヤを前に出せばたるむので、丁寧にリアスプロケットから外す。何か床に敷いて一旦ダラっとさせてOK。
タイヤは空気を抜いてから、斜めにしたりとかすれば案外外れる。が、可能であればセンタースタンドの高さをかさましできるようにしておくとより良い。

6.タイヤ交換

ブレーキディスクは下にして作業はしない。リアスプロケットは何やら外れるらしいが、自作パレットがあるので外さなくても作業できるはず。なのでそのままでOK。
後はいい感じにタイヤ交換する。

7.リアタイヤをつける

作業は真後ろからやること。
リアキャリパーについて、ディスクに接触する部分(シュー)はあらかじめ広げておく。手でも何となく広がる。
チェーンはダラっとさせていたが、タイヤを入れる前にあらかじめスイングアームにひっかけておくと付けやすくなる。
 
リアタイヤにもカラーはあるため、ちゃんとついているかは確認し、タイヤを入れる。この際リアキャリパーの位置には注意。キャリパーにブレーキディスクが挟まっていることを確認。
チェーンはタイヤが軸より前にあった方が入れやすい。スプロケットのギアと噛みあったら、タイヤの位置を後ろにずらす。
 
外したのとは逆の順序でアクスルシャフトを入れていく。シャフトにあらかじめワッシャー→プレートの順でつけておいてからホイールの軸に入れていく。プレートの前後は特に決まってない模様。
左側のアジャスターエンドをつけて、それを通すことを忘れずに(一敗)。アジャスターエンドは円の外側に凸が2つ付いている方が外側。
左側のアジャスターエンドを貫通したら、ホイールとの軸を合わせ、貫通させる。
 
途中まで通した後、ほぼ必ずキャリパーを通すところで止まるため、うまく微調整して(右側から見てキャリパーの軸とシャフトの位置を調整して)、ゴムハンマーでシャフトを軽く叩けば通るはず。
 
キャリパーまでシャフトが通った時点でいったん止め、アジャスターエンドをシャフトが通るよう調整し、貫通させる。アジャスターエンドは円の外側に凸が2つ付いている方が外側。貫通したらプレート→ワッシャー→ナットの順で付けていき、ナットを締める。
 
ナットはフロントと同様、トルクレンチで59Nで締める。フロントと同様にシャフトは空回りするため、左側は固定してナットを締める。

7-1.リアタイヤの回転を確認

手回しでリアタイヤの回転に問題がないか確認。後ろブレーキを踏んでタイヤが止まるかを確認。

7-2.空気を入れる

225kpaで空気を入れる。

【ZORIN OS(Ubuntu)】【KVM/QEMU】SambaによるゲストOS(Windows11)とのファイル連携

1.はじめに

QEMUVMのカスタマイズ画面からファイル連携の設定をしようとしましたが、わけがわからないので、ホストOSとして動いているZORIN OS(17.3)にSambaを入れてファイル共有を可能にし、ゲストOSのWIndow11のほうは「ネットワークの場所を追加する」でファイルアクセスするようにします。

2.ホストOS(ZORIN OS)の設定

2−1.共有フォルダの指定

適当にフォルダを作り、右クリックから「ローカルネットワーク共有」を押下

「このフォルダーを共有する」にチェックを入れ、共有名を適当に入れます。
ただしこの共有名は後ほどWindowsの設定の方でも使います。 
「このフォルダー内での」ファイルの作成・削除を他のユーザに許可する」もチェックを入れておきます。

これで[共有を変更]を押しますが、Sambaが入っていなければインストールを促されるため、そのまま出てきたウィンドウに従ってインストールをします。

'net usershare' がエラー 255 を返しました: net usershare add: cannot share path /mnt/1.8TB as we are restricted to only sharing directories we own.
Ask the administrator to add the line "usershare owner only = false"
to the [global] section of the smb.conf to allow this.

というメッセージが出た場合は、/etc/samba/smb.confの記載を変更。

$ sudo vi smb.conf
[global]
usershare owner only = false

2−2.Samba用ユーザの作成

以下のコマンドで作成

$ sudo pdbedit -a ''hogehoge''
new password:
retype new password:

3.ゲストOS(Windows11)の設定

エクスプローラ画面で右クリックをし、「ネットワークの場所を追加する」を押下。

接続先を設定します。
設定内容は
\\[ZORIN OSのデバイス名]\[2-1項の共有ファイル設定をした際の共有名]
です。
バイス名は、ZORIN OSのスタートメニューの設定から飛んで表示できます。

私の場合はマザボの型番。

具体的にはこうなります。

\\X870-Steel-Legend-WiFi\qemu_data

 
Sambaと通信できれば次に進みます。
名前を好きに決められますが、一応ホストOS側の共有名と一緒にします。

 
作成が完了したら、エクスプローラに表示されます。

 
「ネットワークドライブの割り当て」でも同じような感じで設定すれば接続できます。そちらのほうが空き容量が見えるし、ドライブとして振る舞うのでアプリケーションとも連携しやすいため、ネットワークドライブ化したほうが扱いやすいかも

4.Samba経由のファイル通信の速度向上

ファイル転送してみたら35MB/sぐらいしか出ておらず、流石に遅すぎるので、海外兄貴たちのやりとりの内容を基にSambaの設定を変更しました。

■参考:https://www.reddit.com/r/OpenMediaVault/comments/11gwi1g/significant_samba_speedperformance_improvement_by/?tl=ja

$ sudo vi /etc/samba/smb.conf
[global]の直下に以下を設定。
socket options = TCP_NODELAY IPTOS_THROUGHPUT SO_RCVBUF=131072 SO_SNDBUF=131072
acl allow execute always = true
acl map full control = yes
deadtime = 60
getwd cache = true
min receivefile size = 16384
strict sync = no
sync always = no
use sendfile = true

$ sudo systemctl status smbd.service

で、Sambaを再起動すれば適用されるだろう、と思ったらそうでもありませんでした。
なので、PCごと再起動を実施。

これで転送速度が300MB/s〜450MB/sに跳ね上がりました。すごい。

【Windows10】ディスク形式をMBRからGPTへの変換

1.はじめに

engetu21.hatenablog.com

吸い出したWindows10のイメージを新PCの仮想環境(UEFI)で実行したら起動しませんでした。
どうやらディスクの形式がMBRだとうまくboot loaderで読み込めないようで、GPT形式へ予め変更しておかないと行けなかった模様。。
 
というわけで変更処理を行います。

2.まずはディスク形式の確認

MBR形式かGPT形式かを確認。
どうやら、DISKPARTというのを使うらしいです。一応、エクスプローラの管理画面からディスクごとのプロパティで見れたりもします。
検索フィールドでDISKPARTを入力し、管理者モードで立ち上げます。

DISKPART> list disk

ディスク 状態 サイズ 空き ダイナ GPT
### ミック
------------ ------------- ------- ------- --- ---
ディスク 0 オンライン 465 GB 1024 KB
ディスク 1 オンライン 232 GB 0 B *
ディスク 2 オンライン 232 GB 1024 KB

Cドライブが入っている「ディスク2」にアスタリスクがない = GPT形式ではないことがわかりました。


msinfo32(システム情報)で情報確認をします。
こちらはディスクというより、マザボBIOSモードで動いているかUEFIモードで動いているかの確認?だとは思いますが、GPT形式にした後にマザボUEFIモードになってないとOSが起動しないため、BIOSモードになっている場合はマザボの設定を変える必要があります。


レガシーになっているので、BIOSモードですね。



コマンドプロンプトを管理者モードで新たに立ち上げて、対象ディスクがMBR2GPTを実行できるか確認します。

>mbr2gpt /validate /disk:2 /allowFullOS
MBR2GPT: Attempting to validate disk 2
MBR2GPT: Retrieving layout of disk
MBR2GPT: Validating layout, disk sector size is: 512 bytes
MBR2GPT: Validation completed successfully

Validation completed successfully
が出ていればOK。

3.mbr2gptによるコンバートの実行

コマンドを叩いていざ変換!

>mbr2gpt /convert /disk:2 /allowFullOS

MBR2GPT will now attempt to convert disk 2.
If conversion is successful the disk can only be booted in GPT mode.
These changes cannot be undone!

MBR2GPT: Attempting to convert disk 2
MBR2GPT: Retrieving layout of disk
MBR2GPT: Validating layout, disk sector size is: 512 bytes
MBR2GPT: Trying to shrink the OS partition
MBR2GPT: Creating the EFI system partition
MBR2GPT: Installing the new boot files
MBR2GPT: Performing the layout conversion
MBR2GPT: Migrating default boot entry
MBR2GPT: Adding recovery boot entry
MBR2GPT: Fixing drive letter mapping
MBR2GPT: Conversion completed successfully
Call WinReReapir to repair WinRE
MBR2GPT: Failed to update ReAgent.xml, please try to manually disable and enable WinRE.
MBR2GPT: Before the new system can boot properly you need to switch the firmware to boot to UEFI mode!

無事成功したみたいです。
最後に書いてあるとおり、ファームウェアUEFIモードにしてね!ということらしいので、Windows再起動後にマザボで設定変更が必要です。

4.変更の確認

再度、DISKPARTでGPT形式化を確認します。

DISKPART> list disk

ディスク 状態 サイズ 空き ダイナ GPT
### ミック
------------ ------------- ------- ------- --- ---
ディスク 0 オンライン 465 GB 1024 KB
ディスク 1 オンライン 232 GB 0 B *
ディスク 2 オンライン 232 GB 0 B *

ディスク2にアスタリスクが付きました。
 

5.マザーボードの設定変更

msinfo32(システム情報)での確認はOS再起動をした後になります。
が、再起動時に一度マザーボードの設定を変更する必要があります。
マザーボードの種類によりますが、
①セキュアブートがON(有効)になっている。
CMSがOFF(無効)になっている。
の状態になっている必要があります。
①、②が同時にON(有効)だった場合、Windowsは起動しませんでした。
これは結構有名らしく、どちらか一方がOFFでないとWindowsが不安定になるとかなんとか。実際起動しないのでその通りなのでしょう。

設定方法はマザーボードによって異なるので、頑張って項目を探し出しましょう。
 
設定が問題なければWIndows10が立ち上がるはずです。
再起動後のmsinfo32(システム情報)は以下の通り。
ちゃんとUEFIモードになってますね。

 
この状態のCドライブをイメージファイル化しますが、それは以下のページで記載しているので割愛します。
engetu21.hatenablog.com

【Ubuntu(ZORIN OS)】【QEMU/KVM】KVMによる仮想化WindowsへのGPUパススルー設定(+Win11化)@2025

1.はじめに

engetu21.hatenablog.com

過去仮想化を実施しましたが、新しいPCでやってみたいと思います。

環境はこれ。

・CPU:Ryzen 7 9700X (8C/16T、3.8GHz、TDP 65W、AM5、Radeon Graphics) BOX W/O cooler
マザボASRock X870 Steel Legend WiFi
・メモリ:DDR5-6000 64G(CP2K32G60C40U5W)
・グラボ:GV-N5070WF3OC-12GD(GIGABYTE NVIDIA Geforce RTX5070)
・M.2:Acer Predator Gen5 M.2 SSD 2TB GM9 NVMe2.0 2280 PCIe Gen5×
・電源:MSI MAG A850 GL PCIE5 WHITE 80PLUS GOLD
・ケース:NZXT H6 Flow White
・CPUクーラー:ALSEYE CPUクーラーM90
・ホストOS:ZORIN OS 17.3(Ubuntu)

今回はクリーンインストールではなく、動いているPC(旧PC)のWindows10を吸い出して、それを仮想環境(以下VM)で動くようにします。
 

2.旧PCのCドライブのイメージ吸い出し

普通のPCはCドライブにOSを入れていると思いますが、このCドライブをまるごとイメージ化します。
旧PCはイメージの吸い出しで使うのは、LinuxのLive版をインストールしたUSBメモリ
Linuxディストリビューションはどれでもいいですが、今回はZORIN OSにしました。

Live版ZORIN OSを起動し、

左下のボタンから[端末]を選択。

各ディスクの確認をします。

$ sudo fdisk -l
(略)
ディスク /dev/sdc: 232.89 GiB, 250059350016 バイト, 488397168 セクタ
Disk model: CT250MX500SSD1
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 0524FBBE-95C3-11F0-BCBB-B827EBCF3D67
(略)

Windowsが入っているドライブはMicrosoftとか名前が入っていたり、パーティションが別れているのでわかりやすく、私の環境では/dev/sdcが該当することがわかります。

あとはこれをddコマンドでイメージにするだけ。ファイルの吐き出し先は外付けUSB接続の3TBドライブとします。
接続した3TBは/media/zorin配下にマウントされているため、そちらをddコマンドのoutputに指定。
読み書きの速度はオプションで指定しないと激遅になるため、適当に10MBとします。

$ sudo dd if=/dev/sdc of=/media/zorin/3TB/win10.dd bs=10M

書き出しが完了したらLive版ZORIN OSはシャットダウンでOK。
※ちなみに6項で触れますが、この作業はもう一回やりました。

3.新PCへのZORIN OSのインストール

2項で使ったLive版ZORIN OSを使ってインストールをします。
USBメモリを指して起動、デスクトップにあるインストールボタンを押すだけであとは適当に次へを押せば完了するため、省略。
 

4.仮想環境の構築

7年ぐらい前はIntelでしたが、今回はRyzenなので、やり方が少し異なります。

4−1.IOMMUの有効化

IOMMUの適用についての確認をします。
ただこのコマンドはIntelでやった場合のみで、AMDでは表示が変わらないらしいです。
https://www.reddit.com/r/Proxmox/comments/13v04hx/trying_to_get_iommu_to_work/?tl=ja

$ sudo dmesg | grep -e DMAR -e IOMMU
[ 1.442903] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[ 1.486483] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).

GRUBカーネルコマンドラインパラメータを変更します。

$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt video=efifb:off"

今回はRyzen(AMD)なので、「amd_iommu=on」を入れます。
また、こちらのサイトを参考すると、「iommu=pt」「video=efifb:off」が推奨になっていたため、今回は入れます。
qiita.com

ここで再起動。

IOMMUの適用についての確認します。

$ sudo dmesg | grep -e DMAR -e IOMMU
[ 1.447134] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[ 1.470482] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).

噂通り変わらない。。とりあえず、OS上はIOMMUは有効になったという前提で先に進めます。
ちなみに、今回使っているASRock X870 Steel Legend WiFiAMD-Vの有効/無効項目はなく、どうやら最近のAMD向けマザボはデフォルトで有効になっているらしいので、UEFIを弄る必要はないとのこと。
そのため、この状態で土台となるマザボとOSの仮想環境設定は一旦完了しました。
 

4−2.GPUパススルーのための情報収集

前回と同様、グラボのデバイス情報を取得します。

$cd ~/
$ vi aaa

#!/bin/bash
shopt -s nullglob
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done;

$ sudo chmod 755 aaa
$ ./aaa

(略)
IOMMU Group 13 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2f04] (rev a1)
IOMMU Group 13 01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:2f80](rev a1)
(略)

赤字の部分が後の工程で絡んでくるのでメモっておきます。
 

4−2−1.vfio-pciの設定はしなくていい?

前回はホストOSでグラボを認識できないよう、あれやこれや↓をしました。
https://engetu21.hatenablog.com/entry/2018/04/03/003642#%EF%BC%91%EF%BC%91vfio-pci%E3%81%AE%E4%BD%BF%E7%94%A8


が、4-1項にてGRUBカーネルコマンドラインパラメータでiommu=ptの指定をしており、これはホストOS(今回はZORIN OS)がグラボを使わないようにする設定だそうなので、以前やっていた「vfio-pciの使用」を設定する必要がなくなるようです。

実施、コマンドでグラボがNVIDIAのドライバを使っていないか(vfio-pciを使うようにしているか)の確認してみるとこんな感じ。

$ lspci -nnk -d 10de:2f04
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2f04] (rev a1)
Subsystem: Gigabyte Technology Co., Ltd Device [1458:417e]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
$ lspci -nnk -d 10de:2f80
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:2f80] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:0000]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel

 
素晴らしい。
 

4−3.virt-managerlibvirtQEMUなどなどのインストール

前回はlibvirtの最新パッケージの更新として

ppa:jacob/virtualisation

を追加で設定していましたが、現在は配信停止されているようなので、素直にaptでインストールします。

$ sudo apt install -y libvirt-daemon-system ovmf libvirt-clients bridge-utils virt-manager qemu-kvm qemu-utils qemu-efi

多分上記のもので大丈夫だと思いますが、ダメだったら「libvirt-bin」「libvirt-dev」「libvirt0」辺りも入れてください。

libvirtの有効化を確認をします。

$ sudo systemctl is-active libvirtd
active

OKですね。
 
QEMUの仮想化が問題ないか確認します。

$ virt-host-validate
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : WARN (Enable 'devices' in kernel Kconfig file or mount/enable cgroup controller in your system)
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : PASS
QEMU: Checking if IOMMU is enabled by kernel : PASS
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)

(略)

LXC: Checking for cgroup 'devices' controller support : FAIL (Enable 'devices' in kernel Kconfig file or mount/enable cgroup controller in your system)
LXC: Checking for cgroup 'freezer' controller support : FAIL (Enable 'freezer' in kernel Kconfig file or mount/enable cgroup controller in your system)

何やらWARNとFAILが…


higmasan.com
unix.stackexchange.com
このあたりサイトを見ると、どうやら
intel_iommu=on
systemd.unified_cgroup_hierarchy=0
カーネルコマンドラインパラメータに記載し、
grub2-mkconfig
を使って設定を変更すればいいといったことが書かれている。
 
しかし、私が使っているのはAMDのCPUであり、intel iommu=onを書く必要はまずない。
そしてZORIN OSにはgrub2-mkconfigのコマンドはない(grub-mkconfigはある。多分ベースになっているUbuntuも同様?)

discussion.fedoraproject.org
↑の記載を読むと、どうもOSがcgroup2を使っているならfreezeを使う必要はないとのことが書かれている(必要なのはcgroup1とのこと)

gihyo.jp
cgroupはプロセスをグループ化して制限をかけられる技術…とのことだけど、いまいち不明。

cgroupのv1とv2を調べる方法は以下のサイトを参考とし、少なくともZorin OS17.3に関してはcgroup v2が動いている模様。
kazuhira-r.hatenablog.com

$ stat -fc %T /sys/fs/cgroup/
cgroup2fs

cgroup2fsなので、cgroup2みたいですね。
 
freezeはいらんと言っているページを翻訳すると、

同じエラーに遭遇し、冷凍庫を使用する必要性を調べた結果、cgroup2 を使用する場合には冷凍庫は必要ないことがわかりました。もし systemd.unified_cgroup_hierarchy=0 GRUB のコマンド ラインで追加されると、システムは非推奨の cgroups1 を使用することになります。

走ろうとした時に気づいた podman、そして私はcgroup1 を使用していることを助言する警告を得ました。行を削除すると、メッセージが消えました。

私の理解では、FAIL メッセージは次のとおりです virt-host-validate cgroup_freezer は無効にする必要があるため、cgroup2 を使用するシステムには関係ありません

これはWARNとFAILは無視していいのでは…?というのが今の所の結論。
実際のところこの後にQEMUでのVM起動とGPUパススルーは成功したので、(性能は劣化しているかもしれませんが)とりあえず無視します。

4−4.libvirtdとvirtlogdが動いているかsystemctlで確認

$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-09-16 16:43:22 JST; 9min ago

$ sudo systemctl status virtlogd
○ virtlogd.service - Virtual machine log manager
Loaded: loaded (/lib/systemd/system/virtlogd.service; indirect; vendor preset: enabled)
Active: inactive (dead)
TriggeredBy: ● virtlogd.socket
● virtlogd-admin.socket
Docs: man:virtlogd(8)
https://libvirt.org

libvirtdの方はすでに起動しており、自動で立ち上がるようになっていると思われるけど、念の為enableは実行しておきます。
virtlogdはinactive (dead)だったので、起動した上でenable実行。

$ sudo systemctl enable libvirtd
$ sudo systemctl enable virtlogd
$ sudo systemctl start virtlogd
$ sudo systemctl status virtlogd

● virtlogd.service - Virtual machine log manager
Loaded: loaded (/lib/systemd/system/virtlogd.service; indirect; vendor preset: enabled)
Active: active (running) since Sat 2025-09-20 00:15:21 JST; 4min 14s ago
TriggeredBy: ● virtlogd-admin.socket
● virtlogd.socket
Docs: man:virtlogd(8)
https://libvirt.org
Main PID: 4741 (virtlogd)
Tasks: 1 (limit: 74024)
Memory: 2.2M
CPU: 5ms
CGroup: /system.slice/virtlogd.service
└─4741 /usr/sbin/virtlogd

5.VMの構築とWindows10のイメージファイルの指定

4-3項のインストールが問題なければ、スタートメニューに「仮想マシンマネージャー」があるはずなので、そちらを起動。

仮想マシンを作ります。

モニタのボタンをクリック。
 

ddコマンドで抽出したイメージを使うので上から3番目を選択。
 

参照ボタンを押して、仮想イメージを指定。
下部のオペレーションシステムの選択は適当に「win」と入力し、出てきたwindows10を選択。


メモリは適当に32GB。
CPUは8としておきます。が、この設定はソケット数らしく、これはWin11へのアップグレードのため、後で変更します。
 

ここでは「インストールの前に設定をカスタマイズする」を必ずチェックします。
 
先程の「インストールの前に設定をカスタマイズする」をチェックしていると、カスタマイズ画面になります。

ここでいくつか設定変更します。
まず1つ目は概要シートのファームウェアを「UEFI」に変更。チップセットは「Q35」のままでOK。
この設定はこの時変更しないと、以降カスタマイズ画面から変更できないため注意(一応、後から対象のXMLファイルを書き換えればできますが、変更が面倒)。
ファームウェアは「UEFI」を選択しましたが、後ほどWindowsが立ち上がったときに確認した限りだと、セキュアブートに対応していたため、他の候補を選択する必要はなさそうです。




CPU数ページを変更。host-passthroughはそのまま。(これにしておくとVM上でもRyzen 7 9700Xとして認識される)
作成時にCPUを8としていましたが、それだとソケット数8個扱いでwin11の2コア以上の条件がクリアにならないようなので、ここはCPUトポロジーを手動設定し、2コア4スレッドに変更。

Windows11に必須のTPMも追加しておきます。カスタマイズ画面の左下の「ハードウェアを追加」を押下。TPMを選択し、

設定はそのままで完了。
 
グラフィックボードを認識させます。
カスタマイズ画面の左下の「ハードウェアを追加」を押下。PCIホストデバイスから、

0000:01:00:0 NVIDIA Corporation
0000:01:00:1 NVIDIA Corporation

をそれぞれ追加します。
これは4-2項で確認した、01:00.0と01:00.1が該当します。まぁ、NVIDIAと書いてあるし、他のNVIDIA製品を使ってない限りは、これしか出てきません。
 
一旦、この状態で左上の「インストールの開始」を実行!
 

おや・・・?Windowsが起動しない。。

6.仮想Windows10が起動しない件と解決策

色々試すと、ファームウェアで「BIOS」を選択するとWindows10起動し、「UEFI」を選択すると起動しませんでした。
これはファイル形式がrawでもqcow2でも同様。選択したUEFIがセキュアブートに対応してないから?と思いましたが、どうも根本的に何かが違うということでさらに調べたところ、どうやら吸い出した際のWindows10のディスクがMBR形式であり、それだとダメで、GPT形式になっている必要がある模様。
なので、吸い出し元の旧PCでMBR→GPTに変換します。
実施方法は別に書き起こしました。
engetu21.hatenablog.com



これをZORIN OSのLive版にてddコマンドで2項と同じようにrawファイルとして書き出し、新PCにファイルコピーします。
 
コピー後、rawファイルはQEMUのディスクイメージ(qcow2)に変換します。ファームウェアが「UEFI」でrawファイルのWIndowsが起動できるのかは謎ですが(試さなかった)、ディスク容量を拡張する必要があるので、このタイミングで変換します(拡張は形式変えなくてもいけるかも?とりあえず変換します)。
参考:
docs.openstack.org

rawファイル→qcow2ファイルへの変換コマンドは以下の通り。

$ qemu-img convert -f raw -O qcow2 win10-2.raw win10-2.qcow2

 
続けて、先程触れたとおり、変換して作った「win10-2.qcow2」ファイルの容量を拡張します。
吸い出したイメージファイルは、上限が吸い出し元の最大ディスク容量分しかない、かつすでに容量カツカツで使っていたため、windows11にアップグレードするために容量を増やしておく必要があります。
とりあえず200GB追加します。

$ sudo qemu-img resize win10-2.qcow2 +200G
Image resized.

 
VMは作り直すか、ディスク追加で先程作ったqcow2ファイルを指定して追加。

[SATAディスク2]が新たに追加されます。この際、元々あった[SATAディスク1]を右クリックから削除します。
すると[SATAディスク2]が[SATAディスク1]に変更されます。(つまりディスクの入れ替えができる)

この状態で再度VMを起動します。



無事起動!

システムの詳細情報を見てみると・・・

すでにグラボが認識されています。デバイスマネージャーを見ても同様。
 
以前はvendor id偽装(【Linux Mint】【QEMU/KVM】KVMによる仮想化Win10へのGPUパススルー設定 - 技術メモ)という面倒な作業を実施しており、というのもTeslaといったGPGPU専用グラボ以外はGPUパススルーができなかったからですが、どうやらAI生成やら諸々の流れでどうやらそういった制約は解除された模様(どこかのページでベータ版とかなんとか書いてあったような)。


7.仮想Windows上でのディスク容量拡張

qcow2イメージファイルに200GBを追加しましたが、Windows上でも拡張処理が必要なので、それをやります。

↓200GB分追加されている

 
ディスクの管理画面で操作してみましたが・・・おや、パーティションの拡張ができない。。
どうやらGPT形式に変更した際にパーティションの位置が変わった模様。
Cドライブ領域が一番右なら拡張できるはずですが、現状はそうではないためOSの機能ではできない模様。。
しょうがないので、ツールを使って対応します。
MiniTool Partition Wizard(https://www.partitionwizard.jp/)をインストールし、起動します。

Cドライブを選択肢、右クリックから[拡張]を押下。
 

ウィザードが出てくるので、空き領域全部を選択(バーを右にグイッとして)、[OK]を押下。
 

画面下のCドライブの領域が増えていること確認し、左下の[適用]を押下

問題なく完了すれば、領域が拡張されます。

8.仮想Windows10をWindows11へアップグレード

システム画面でWindows11へのアップグレードのメニューが出てくればいいんですが、出てこないのでアップグレードアプリから実行します。
キャプチャは忘れましたが、正常性診断のツールでWindows11へのアップグレード要件を満たしていることは確認済み。
 
一応、Windows10のイメージファイル(qcow2ファイル)はバックアップをとってから実行します。VMはこういうときに便利。

www.microsoft.com
から「Windows 11 インストール アシスタント」をダウンロードし、実行。

ひたすら待ちます。



無事、Windows11化完了です。

9.グラボ経由でのモニタ表示

一旦、WindowsVMをシャットダウンし、USBパススルーによる物理キーボードとマウスの接続、及び「ディスプレイSpice」と「ビデオQXL」を削除し、グラボでの画面描写に切り替えます。
これにより、グラボを経由したモニタ表示とホストOSから独立したキーボード/マウスによる操作ができるようになります。
 
無論、「ディスプレイSpice」と「ビデオQXL」を削除せず、ホストOS上で表示しながら操作も可能ですが、もしこのVM環境でゲームをやる場合、GPUを利用した描写ができないため、ゲームはろくに動かないと思われます。
ただ、生成AIを実行する場合に対してはそうではないと思われ、生成AIアプリがグラボを認識してくれれば、画面描写はVMの素の機能、生成AIアプリはグラボを利用と分けられるかもしれません(←やってみました。どうやらできる模様)。
VMを2つ設け、①ゲーム用、②それ以外と分け、お互い同一のWindows11のイメージディスクを指しつつも、必ず同時実行をしないようにしつつ(これは自分で気をつけるしかない)、ゲームしたいときはグラボから画像出力する①、それ以外は②、という風に運用するのも面白いかもしれません。

【Ubuntu20.04】ConoHaのVPSへのSSH接続メモ

どうもConoHaでのVPSSSHで接続する際に癖があるので、今後のためにメモをしておきます。

1.VPSの立ち上げ


Ubuntu信者なので、基本的に使うのはUbuntu関係のディストリビューションなわけですが、当然VPSUbuntu使います。(CentOSのゴタゴタを見ると、Redhat系をなおさら使う気になれない…)
なんの制約だったかは忘れましたが(プラン?)、Ubuntuは20.04でしか構築できないのでそれで行きます。
この際、SSHはConoHaのプラットフォームで作ったキーを利用します。ただ、作成したキーの秘密鍵はたった一回しかダウンロードをできないため、作成時にダウンロードをしていないとその時点で詰むので注意。
構築そのものは数分で完了。少なくとも一番安いプラン、しょぼいスペックのVPSに関しては。

2.セキュリティグループでのSSHのポート変更


セキュリティグループにて、SSH用(ポート変更版)を新たに作ります。
SSH用のグループは既存でありますが、22番をそのまま使うのはよろしくないため、これとは別に作ります。
というわけで、2254番を新たに作ります。接続元は特に特定しないため、「0.0.0.0/0」を指定。
 
なお、このセキュリティグループを適用していて起動済みのVPSがあった場合、ポート番号をまた変更しようとしても、記述内容が正しくても変更ができずにエラーとなるので注意が必要。
 

3.セキュリティグループをVPSに設定する。


VPSへの適用はVPSのポータル画面の一番下に項目があるため、そこでセッティングが可能。作成済みのセキュリティグループをプルダウンから選択するのみ。
 

4.VPS上のUbuntuにてファイアーウォールの設定変更とSSHサーバの設定変更

ここが引っかかった部分ですが、セキュリティグループの設定とは別にUbuntuでもポートの穴あけが必要になります。
これに関しては、一旦Webブラウザ上でコンソールを立ち上げ、そこからセッティングを変更する必要があります。


ufwコマンドで穴あけを行うだけでいいので、以下のコマンドを実行。

# ufw allow 2254

また、SSHサーバの設定も変更する必要があります。Portの設定値はコメントアウトされているため、これを解除した上で番号を変更します。

# cd /etc/ssh
# vi sshd_config

#Port 22

Port 2254

設定変更後、systemctlコマンドでSSHサーバをrestartするか、マシンのrebootを行います。

# systemctl restart sshd.service

 

5.クライアントからの接続

クライアントはTeratermとかでいいと思いますが、今弄っているのはZorinOS(Ubuntu22.04)なので、ターミナルからSSHコマンドでアクセスします。

ダウンロードしておいた秘密鍵を指定、IPアドレスとポートも指定してアクセスを実施。

$ sudo ssh -i key-2025-01-01-20-26.pem [email protected] -p 2254

アクセスできれば成功です。
よくわかりませんが、sudoコマンドを使用しないとパーミッションのエラーでアクセスできません。これは秘密鍵のアクセス権限を777に変更しても変わらなかったので、なんか他の要因があるのか…。まぁ何かとsudoを使って叩いているのでそんなに気にはなりませんが。

6.root以外でのSSH接続できるようユーザ追加と公開鍵のコピー

rootを使ってアクセスはセキュリティ的にかなりまずいので、別のユーザを作成し、それでログインします。
ユーザの追加は以下の通り。
engetu21.hatenablog.com

基本的にsudoグループに追加するまでは一緒。さらにSSH接続させるため、sshグループにも所属させます。

# gpasswd -a hogehoge ssh

rootの.sshディレクトリ配下にあるauthorized_keysを作成したユーザの.ssh配下にも配置します。(.sshディレクトリは作成する)
.sshディレクトリを作成する際に、rootユーザで作成するとグループと所有者がrootになってしまうため、変更を忘れずに。

# cd /home/hogehoge
# mkdir .ssh
# chgrp hogehoge .ssh
# chown hogehoge .ssh
# cd .ssh
# cp ~/.ssh/authorized_keys ./
# chgrp hogehoge authorized_keys
# chown hogehoge authorized_keys
# chmod 644 authorized_keys

ここまでやれば追加したユーザでSSHログインができるようになっているはずです。

$ sudo ssh -i key-2025-01-01-20-26.pem [email protected] -p 2254

 

7.rootログインとパスワード認証の抑止

ログインが成功したら、SSHサーバの設定ファイルを変更し、rootによるログインとパスワード認証によるログインを抑止します。

$ cd /etc/ssh
$ sudo vi sshd_config

PermitRootLogin yes

PermitRootLogin no

PasswordAuthentication yes

PasswordAuthentication no

設定変更後、SSHサーバを再起動します。

$ sudo systemctl restart sshd.service

SSHコマンドでrootを指定してログインできなければ成功です。

$ sudo ssh -i key-2025-01-01-20-26.pem [email protected] -p 2254
[email protected]: Permission denied (publickey).

【Ubuntu22.04】【Kivy】Python3でAndroidアプリケーション開発

2024の記事を全く書いてなかったので書きます。年内なのでまだセーフですね!(2024/12/31)

Androidアプリケーションの開発というと「Android SDK」「Android Studio」を使うのがド定番だと思うのですが、Pythonで作る方法もあるとのことなので、Kivyを入れて試してみます。

今使っているPCはZorin OSの16.3なので、実質Ubuntu22.04ということで、その扱いで書きます。
 

1.pipのインストール

用意したZorin OSはほぼ何も弄っていないので、pipのインストール。
なお、pythonはデフォルトで3.8.10が入っていました。

$ sudo apt install python3-pip

2.Kivyのインストール

KivyはPythonGUIライブラリらしい。PythonGUIアプリを使う際のものになるので、AndroidアプリをPythonで作りたいと言ってもこれを使わずとも別のやり方はあると思われる。が、簡単に調べるとだいたいKivyを使った紹介が多いので、前例に習って同じようにインストールしてみます。
pipでインストールすると、実際にはKivy以外にもいろいろインストールされるらしい。

$ pip3 install kivy
(略)
Downloading filetype-1.2.0-py2.py3-none-any.whl (19 kB)
Installing collected packages: pygments, Kivy-Garden, docutils, filetype, kivy

 

3.Buildozerのインストール

Android端末で実行するためのapkファイルを作成するビルドツール。
こいつでKivyで作ったアプリケーションをAndroid端末で実行できるようにします。

$ pip3 install buildozer
(略)
Successfully installed buildozer-1.5.0 distlib-0.3.9 filelock-3.16.1 platformdirs-4.3.6 sh-2.1.0 virtualenv-20.28.0

・関連ツールのインストール
buildozerだけでは動かないらしいので、関連ツールもインストール。PATHも通します。

$ sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev

$ pip3 install Cython==0.29.33 virtualenv

・PATHの追加

$ export PATH=$PATH:~/.local/bin/

5.プログラムの作成

ディレクトリを切ってプログラムを作ります。いつものHello Worldで。

~$ mkdir program
~$ cd program

~/program $ vi main.py
import kivy

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
    def build(self):
            return Label(text="Hello World!")

if __name__ == '__main__':
    MyApp().run()

6.ビルドの実行

プログラムを作成したらビルドを実行します。

・ビルドの実施

~/program$ buildozer init
File buildozer.spec created, ready to customize!

実行は即座に完了します。この時点で、buildozer.specというファイルが生成されています。

~/program$ ls
buildozer.spec main.py

specファイルは実行ファイルを作成する際に使われる設定ファイルのこと。
中身を見るといろいろ書かれていますが、どうやらアプリの名前やバージョンはこちらで記述した内容が反映されるようです。

~/program$ vi buildozer.spec
# (str) Title of your application
title = My Application

# (str) Package name
package.name = myapp

# (str) Package domain (needed for android/ios packaging)
package.domain = org.test

(略)

# (str) Application versioning (method 1)
version = 0.1

(略)

# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png
→アイコンのパス設定は最初はコメントアウトされている

 
・実行ファイルの作成

~/program$ buildozer -v android debug
→初回はいろいろなものをダウンロードしたりで20分〜30分ぐらいかかります。

# Android packaging done!
# APK myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk available in the bin directory

実行すると、binフォルダとその中でapkファイルが作成されます。

~/program$ cd bin
~/program/bin$ ls

myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk

7.apkファイルをAndroid端末へ転送

apkファイルの転送はFTPを使います。ただし、今回のやり方は同じローカルネットワークにいることが前提。
Android端末ではいつも「ファイルマネージャー+」を使っているため、こちらのFTPサーバ機能を起動。PCからFTPアプリを使ってapkファイルを転送。
インストールはファイルマネージャー+にてapkファイルをタップして実行します。

8.アプリの実行

インストールが完了するとホーム画面にアプリが現れるので実行。実行するとこんな感じ。

なお、KivyはAndroidアプリケーションを作るためだけのGUIライブラリではないため、以下のようにmain.pyを実行すれば普通にGUI画面がPC上でも動きます。つまりデバッグはPCでもできるし、完成したらスマホに転送する、というのができますね。

~/program$ python3 main.py