Ubuntu 20 に Docker をインストールする

既に作成済みの Ubuntu 20 (ESXi 6.7u1 VM) を docker ホストとして,Docker 公式ページの手順に従ってインストールしていく

Ubuntu VM 確認

$ uname -a
Linux vm-ubuntu20-01 5.4.0-125-generic #141-Ubuntu SMP Wed Aug 10 13:42:03 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

既存パッケージの更新

$ sudo apt-get update
$ sudo apt-get upgrade

必要なパッケージの追加

$ sudo apt-get install ca-certificates curl gnupg lsb-release

Docker の公式 GPG キーを追加

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Docker リポジトリ情報の追加

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

リポジトリから Docker インストール

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

インストール確認

$ sudo docker run hello-world

正常にインストールされたように見える.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:62af9efd515a25f84961b70f973a798d2eca956b1b2b026d0a4a63a3b0b6a3f2
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

自動起動の確認

$ systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-09-17 08:21:07 UTC; 45min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 953 (dockerd)
      Tasks: 9
     Memory: 95.4M
     CGroup: /system.slice/docker.service
             mq953 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
$ systemctl status containerd
● containerd.service - containerd container runtime
     Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-09-17 08:21:05 UTC; 52min ago
       Docs: https://containerd.io
    Process: 836 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 875 (containerd)
      Tasks: 8
     Memory: 77.5M
     CGroup: /system.slice/containerd.service
             mq875 /usr/bin/containerd

USB3.0カードをパススルーして ESXi ゲストからマウス・キーボード・スピーカーを使えるようにする

USB 3.0 カードの増設

前回 ESXi 環境で遊びたい - IT難しい に記載の通り,ゲスト VMGPU をパススルーしてモニタ出力させたはいいものの,マウスやキーボードが接続できないため操作ができていなかった.そこで PCIe USB3.0 カードを増設してパススルーさせることで、USB マウスやキーボードを使えるようにしようという試み.

機器選定

(失敗) OWL-PCEXU3E4LS

オウルテックの USB3.0x4 増設ポート OWL-PCEU3E4LS をまずは購入.

オウルテック USB3.0増設ボード 外部USB3.0×4ポート増設 PCI Express インターフェースボード ロープロファイルブラケット付き OWL-PCEXU3E4LS

取り付けてパススルー設定してゲスト Windows からマウスやキーボードを使用してみたが,

  • 縦方向に並んだポート形状が PCIe スロットと干渉してしまい,USBケーブルを差し込めない (無理やり差し込むしかない)
    ⇒ Low Profile 対応のためと思われる.
  • マウス操作が不安定
    ⇒ 時々カーソルが止まる.しばらく後に思い出したかのように動き出し,また止まる.
  • ESXi 自体がハングアップする場合がある

という事象に見舞われたため,諦めて取り外した.

(成功) USB3.0RA-P4-PCIE

続いて 玄人志向の USB3.0x4 インターフェースカード USB3.0RA-P4-PCIE を購入.  

玄人志向 USB3.0RA-P4-PCIE [玄人志向インターフェースカード USB3.0 TypeA 外部4ポート]

取り付けてパススルー設定してゲスト Windows からマウスやキーボードを使用してみたところ,問題なく運用できている.この記事もそのマウスとキーボードで書いている.一安心.これで VM Windows をメイン使いできる.

取付と設定

USB3.0RA-P4-PCIE は外部電源を必要とする仕様だが,G5 5000 は SATA 電源ケーブルが3本しかなく,内2本は別の SSD 接続で既に使用済み.残る1本もこれから増設する SSD のために確保しておきたい.

どうしようか考えた結果,分岐用のアダプタを使うことにした.

ESXi ホストの shutdown

いつもは Web コンソールから落としていたが,CLI から行ってみたいと思い立った.TeraTermSSH 接続する.Use keyboard-interactive to log in を選択してパスワード認証.

下記コマンドにて メンテナンスモード移行 → シャットダウンを実施.

esxcli system maintenanceMode set --enable=true
esxcli system shutdown poweroff --reason=maintenance

USB 3.0 カード取付

PCI スロットに取り付ける.SATA 電源を2分岐ケーブルで分岐させたうちの片方を接続.

もう片方には 4pin → SATA 変換ケーブルを差しておく.また別の機会に SSD を接続したい.

ESXi 上でパススルー設定

ESXi を再度立ち上げ,USB 3.0 カードが認識されていることを確認. Renesas Technology Corp. uPD720201 USB 3.0 Host Controller.という名前で認識されていた.

toggle passthrough でパススルーを有効にしてから再起動.

メンテナンスモードを出る.

esxcli system maintenanceMode set --enable=false

VM Windows にデバイス追加

Win10 VM 設定から PCIバイスを追加.1~4 が RTX 2070 SUPER,5 はオンボード NIC,6 が USB 3.0 カード.

PCI device 1  <class> VGA compatible controller - 0000:01:00.0
PCI device 2  <class> Audio device - 0000:01:00.1
PCI device 3  <class> USB controller - 0000:01:00.2
PCI device 4  <class> Serial bus controller - 0000:01:00.3
PCI device 5  <class> Ethernet controller - 0000:03:00.0
PCI device 6  <class> uPD720201 USB 3.0 Host Controller - 0000:04:00.0

この状態で起動させたところ,USB 接続マウスやキーボードも使えるようになった.

懸念点

この uPD720201 と全く同一モデルではないものの,前バージョン?の uPD720200 では何かと不具合が見られる様子.

「Windows10 USB3.0拡張ボードでハマる。。。」みーくん5963のブログ | みなさんお元気ですかぁ~ - みんカラ

マウスやキーボードは取り急ぎ問題ないものの,外付け HDD や USB メモリとのデータ転送時は少し注意しておくべきかもしれない.

バイスパススルー状況

USB 3.0 カード追加でデバイスパススルー状況は以下のようになった.

Address Description Passthrough メモ
0000:01:00.3 nVidia Corporation Serial bus controller Active VMGPU
0000:01:00.2 nVidia Corporation USB controller Active VMGPU
0000:01:00.1 nVidia Corporation Audio device Active VMGPU
0000:01:00.0 nVidia Corporation VGA compatible controller Active VMGPU
0000:03:00.0 Realtek Semiconductor Co., Ltd. Ethernet controller Active VM 用 LANポート
0000:04:00.0 Renesas Technology Corp. uPD720201 USB 3.0 Host Controller Active VM 用 USB ポート
0000:05:00.1 Intel Corporation 82575EB Gigabit Network Connection Disabled ※未使用
0000:05:00.0 Intel Corporation 82575EB Gigabit Network Connection Disabled ESXi 管理アクセス用

USB サウンドカードの追加

ESXi 環境で遊びたい - IT難しい にて音声出力ができないと書いたが,スピーカ付きのモニタと HDMI 接続すればモニタから鳴らせることに気づいた.ただこれだと音楽を流しつつモニタを切る,といった運用ができないので,サウンドカードも別途 USB 接続することにした.

Amazon | Bengoo サウンドカード 外付け USB オーディオ 変換アダプタ 3.5mm ミニ ジャック ヘッドホン・マイク端子

手持ちのマイクやスピーカーを接続して問題なく使えることを確認した.

RDP 接続先 PC で DVD が書き込めなかった話

事象

モニタを接続していない PC の DVD ドライブで DVD-R に書き込みを行いたい.RDP で対象 PC に接続して書き込みを始めようとすると A disc burner wasn’t found, Make sure that a burner is installed properly と出て書き込みを開始できない.

対応

RDP 経由ではなく,モニタとキーボードをつなげて直接操作したところ普通に書き込めた.

結論

RDP 接続先 PC で DVD を焼こうとしない方がよい.

共有フォルダ上の git リポジトリを操作しようとしたらエラーになった話

概要

  • git (version 2.37.2.windows.2) を使っていてエラーが出た
  • リポジトリフォルダの所有ユーザと git コマンドの実行ユーザが異なるとエラーが出る
  • version 2.35.2 からセキュリティ上の仕様変更があった
  • リスク考慮の上 git config --global --add safe.directory * で無効にできる

事象

  • NAS として使用している Windows 共有フォルダがある (\\NAS\share とする)
  • Windows PC (PC1 とする) をユーザ mainuser01 で使っている
  • PC1 から \\NAS\share にユーザ nasuser1 でアクセスしている

この状況で PC1 を操作して \\NAS\share 上に git リポジトリを作り,git コマンドを発行したり等すると以下のようなエラーが出る

warning: '//NAS/share/repository' is owned by:
        'S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx'
but the current user is:
        'S-1-5-21-yyyyyyyyyy-yyyyyyyyyy-yyyyyyyyy-yyyy'
fatal: detected dubious ownership in repository at '//NAS/share/repository'
To add an exception for this directory, call:

        git config --global --add safe.directory '%(prefix)///NAS/share/repository'
  • dubious: 怪しい,不審な

原因

こちらの記事を読んだところ

git利用者が使うディレクトリに .gitフォルダを作りconfigファイルを配置されると、そのconfigファイルの内容によって 最終的に任意のコマンドが自動実行されてしまうおそれがあると。

少しだけ具体的にいえば、複数の人が使うファイルストレージで 悪意を持った誰かがよろしくないファイルを配置すると、それを読み込んだPCが操作できてしまうということね

といった脆弱性が見つかったことで

gitの実装としては 「そのユーザーが所有しているディレクトリ」だけを 「信頼できるリポジトリの場所」 としたようだ。

ただその副作用として、所有していない・書き込み権限があるだけのフォルダ、たとえばNAS/クラウドストレージなどの共有フォルダを git 2.35.2からは 使えないようにしたというわけね。

という仕様に改修されたと.

リポジトリを一人一人がローカルにクローンして操作する分には何も問題ないということね.

対応

共有フォルダ上のリポジトリは自分しか使わないので,記事の通りに git config --global --add safe.directory * にて対応.

おまけ

これ AD 環境とかだとどうなるんだろね.

2022-09-07 C# でフルパス判定

System.IO.Path.IsPathRooted()

すぐに触れる C# 環境が無いので .NET Framework 4.8 の Win10 PowerShell でテスト.\ から始まる文字列が True 判定されてしまう….

PS> [System.IO.Path]::IsPathRooted("path-string")
False
PS> [System.IO.Path]::IsPathRooted("\path-string")
True
PS> [System.IO.Path]::IsPathRooted(".\path-string")
False
PS> [System.IO.Path]::IsPathRooted("..\path-string")
False
PS> [System.IO.Path]::IsPathRooted("C:\path-string")
True
PS> [System.IO.Path]::IsPathRooted("\\path-string")
True

System.IO.Path.IsPathFullyQualified()

.NET 5 から使える.こちらだと \ から始まる文字列は False 判定になる.

ToDO

  • C# でコード例

2022-08-24 読書メモ

ウィンドウを作る

http://wisdom.sakura.ne.jp/system/winapi/win32/win7.html

  • ウィンドウの生成はウィンドウクラスの登録ウィンドウの生成の二つの作業に分かれる
  • CreateWindow() 関数は HWND 型 - ウィンドウハンドルを返却する
  • ウィンドウハンドルはウィンドウオブジェクトへの参照
  • Windows の全てのウィンドウにはハンドルが存在する
  • CreateWindow() 関数の第一引数 LPCTSTR lpClassName にはウィンドウクラス名を指定する
  • ウィンドウクラスは既定で用意されたものの他自身で定義することもできる
  • CreateWindow() 関数の第二引数 LPCTSTR lpWindowName にはウィンドウ名を指定する
  • CreateWindow() 関数の第三引数 DWORD dwStyle にはウィンドウのスタイルを指定する

TCHARとかLPCTSTR、LPTSTRって何???(UsefullCode.net)

https://www.usefullcode.net/2006/11/tcharlpctstrlptstr.html

  • TCHAR は以前の復習.UNICODE ビルドの有無に応じて WCHAR / char のいずれかになる

マルチバイト文字(多バイト文字 / MBCS)とは - 意味をわかりやすく - IT用語辞典 e-Words

https://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97.html

  • マルチバイト文字: 文字コードや文字セットのうち、一文字を2バイト以上のデータ量で表すもの
  • この定義だと ASCII はマルチバイト文字に含まれない?

マルチバイト文字 | Programming Place Plus C言語編 第46章

https://programming-place.net/ppp/contents/c/046.html

  • マルチバイト文字: Shift-JIS や UTF8 等で表された、1文字を表現するためのデータ領域が一定でない文字
  • ASCII 領域文字なら1バイトで済むが,漢字やひらがなは2バイト以上を要する
  • char 型を使って表現する文字はマルチバイト文字.具体的にどんな文字を表すかは処理系定義
  • 上記はエンコード・デコードの仕様によるということ,と解釈しておく
#include <stdio.h>
#include <string.h>

int main(void)
{
    const char str[] = "日本語を使うテスト";
    printf( "%zu\n", strlen(str) );
}

// 18
  • 上記例では日本語文字列リテラルShift-JIS で表現されている様子だが,コンパイラはどうやってエンコードを決めるのだろうか
  • strlen 関数はバイト数を返却する
  • C11 (C言語の規格.C99 の後継) の文字列リテラルには u8 プレフィクスを付加することで UTF-8 を使うことを指示できる
#include <stdio.h>
#include <string.h>

int main(void)
{
    const char str[] = u8"日本語を使うテスト";
    printf( "%zu\n", strlen(str) );
}

// 27

printf() > size_t型の書式指定子 > %zu - Qiita

https://qiita.com/7of9/items/ca5ebf9b7861acbcf656

  • %zuzsize_t 型に対応する長さ修飾子.C99 で導入

C strlen() - C Standard Library

https://www.programiz.com/c-programming/library-function/string.h/strlen

  • strlen() 関数の戻り値は size_t 型 (unsigned integer)
  • strlen() は <string.h> に定義されている

Unicode 対応 - Windows API 入門

http://kaitei.net/winapi/unicode/

  • char 型 で漢字等のマルチバイト文字を表現するには複数文字分の領域が必要となる
  • wchar_t 型ならマルチバイト文字を1字分の領域で表現できる
  • char 型は標準規格で8ビットと決まっている
  • wchar_t 型は処理系によって16ビットもしくは32ビット
  • Windows ではワイド文字

ワイド文字(C言語) - 超初心者向けプログラミング入門

https://programming.pc-note.net/c/widecharacter.html

  • マルチバイト文字は文字種によって必要なバイト数が異なることが煩雑になる原因
  • ならばそれを固定すれば楽になるのでは? => ワイド文字 の導入
  • ワイド文字は wchar_t 型で扱う
  • <wchar.t> または <stdlib.h> をインクルードすることで使用できる