はるさめ氏の日常

主に弱電とマイコンを扱っています。たまにネットワークも

cargo-generate のインストールで躓いたのでメモ

普通であれば,コマンド一発で入るはずの cargo-generate ,なぜか素直にインストールできなかったので備忘録がてら

環境

使用 PC:Intel N100 搭載ノート PC
ホスト名:N100
ユーザ名:user
OS:Ubuntu Desktop 22.04.4 LTS Minimum Install

過去に行ったインストール手順はこちらの Issue 通りです

github.com

なにはともあれインストールしてみる

以下,実行コマンドと出力

user@N100:~$ cargo install cargo-generate
    Updating crates.io index
  Installing cargo-generate v0.19.0
    Updating crates.io index
   Compiling libc v0.2.153
   Compiling proc-macro2 v1.0.79
   Compiling unicode-ident v1.0.12
   Compiling thiserror v1.0.58
   Compiling autocfg v1.1.0
   Compiling serde v1.0.197
   Compiling memchr v2.7.1
   Compiling quote v1.0.35
   Compiling syn v2.0.53
   Compiling regex-syntax v0.8.2
   Compiling aho-corasick v1.1.2
   Compiling cfg-if v1.0.0
   Compiling jobserver v0.1.28
   Compiling cc v1.0.90
   Compiling pkg-config v0.3.30
   Compiling regex-automata v0.4.6
   Compiling bitflags v2.4.2
   Compiling once_cell v1.19.0
   Compiling vcpkg v0.2.15
   Compiling num-traits v0.2.18
   Compiling thiserror-impl v1.0.58
   Compiling serde_derive v1.0.197
   Compiling num-conv v0.1.0
   Compiling powerfmt v0.2.0
   Compiling time-core v0.1.2
   Compiling tinyvec_macros v0.1.1
   Compiling same-file v1.0.6
   Compiling bstr v1.9.1
   Compiling gix-trace v0.1.8
   Compiling walkdir v2.4.0
   Compiling tinyvec v1.6.0
   Compiling time-macros v0.2.17
   Compiling deranged v0.3.11
   Compiling num_threads v0.1.7
   Compiling itoa v1.0.10
   Compiling unicode-normalization v0.1.23
   Compiling time v0.3.34
   Compiling openssl-sys v0.9.101
   Compiling libz-sys v1.1.15
   Compiling prodash v26.2.2
   Compiling faster-hex v0.9.0
   Compiling gix-hash v0.13.3
   Compiling rustix v0.38.31
   Compiling sha1_smol v1.0.0
   Compiling smallvec v1.13.1
   Compiling gix-features v0.36.1
error: failed to run custom build command for `openssl-sys v0.9.101`

Caused by:
  process didn't exit successfully: `/tmp/cargo-installD247LF/release/build/openssl-sys-4ee3b2acf08778eb/build-script-main` (exit status: 101)
  --- stdout
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
  OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
  OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_DIR
  OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG
  cargo:rerun-if-env-changed=OPENSSL_STATIC
  cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  run pkg_config fail: 
  pkg-config exited with status code 1
  > PKG_CONFIG_PATH=/usr/lib/pkgconfig PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags openssl

  The system library `openssl` required by crate `openssl-sys` was not found.
  The file `openssl.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory.
  PKG_CONFIG_PATH contains the following:
      - /usr/lib/pkgconfig

  HINT: you may need to install a package such as openssl, openssl-dev or openssl-devel.


  --- stderr
  thread 'main' panicked at /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.101/build/find_normal.rs:190:5:


  Could not find directory of OpenSSL installation, and this `-sys` crate cannot
  proceed without this knowledge. If OpenSSL is installed and this crate had
  trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the
  compilation process.

  Make sure you also have the development packages of openssl installed.
  For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.

  If you're in a situation where you think the directory *should* be found
  automatically, please open a bug at https://github.com/sfackler/rust-openssl
  and include information about your system as well as this message.

  $HOST = x86_64-unknown-linux-gnu
  $TARGET = x86_64-unknown-linux-gnu
  openssl-sys = 0.9.101


  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: failed to compile `cargo-generate v0.19.0`, intermediate artifacts can be found at `/tmp/cargo-installD247LF`.
To reuse those artifacts with a future compilation, set the environment variable `CARGO_TARGET_DIR` to that path.

failed to run custom build command for openssl-sys v0.9.101

HINT: you may need to install a package such as openssl, openssl-dev or openssl-devel.

とのことなので,以下のコマンドを実行

user@N100:~$ sudo apt-get install libssl-dev

そして,cargo-generate をインストール

user@N100:~$ cargo install cargo-generate
    Updating crates.io index
  Installing cargo-generate v0.19.0
    Updating crates.io index
   Compiling libc v0.2.153
   Compiling proc-macro2 v1.0.79
〜〜中略〜〜
   Compiling sanitize-filename v0.5.0
   Compiling git2 v0.18.2
   Compiling auth-git2 v0.5.4
   Compiling cargo-generate v0.19.0
    Finished release [optimized] target(s) in 4m 10s
  Installing /home/user/.cargo/bin/cargo-generate
   Installed package `cargo-generate v0.19.0` (executable `cargo-generate`)

無事通った

参考

https://github.com/sfackler/rust-openssl#manual-configuration

以上のページを参考にした

Windows でマイクラ鯖を立てることの是非を書き連ねてみる

はじめに

あくまでも本稿は私はるさめの所見です。完全に私的な意見でありなにかしらの組織を代表するものではないことを予め明言しておきます また、Windows 10, 11 のことを単に Windows と称します。また、Linux 系の OS を代表して Ubuntu を取り上げます

書くに至った経緯

私はとあるマインクラフト系の Discord コミュニティでサーバの管理人(モデレータ)をしています。そのコミュニティには雑談チャンネルの他宣伝チャンネルや質問チャンネルなどがあるのですが、そこの質問チャンネルでよくマイクラ鯖を建てたい人の質問が出てきます。それは一向にかまわないのですが、そこでログを見せてもらう時によく目にするのが cmd.exeスクリーンショットコードブロックにコピペまたはテキストファイルにして送信しろという指摘はさておきここで毎度 WindowsEULA の話になります。毎回同じ話をするのも面倒ですし、既にし尽くされた議論を蒸し返すのも嫌なので、ここで記事という形で自分の意見をまとめておこうと思います。何かあれば都度追記していくつもりです

ちなみに結論は「Windows でマイクラサーバを建てるのは控えるべき」です

余談ですが、これに関するやり取りをしていた際、少々喧嘩腰で来られたのでイラッとしました。誰かと議論する際は対等な立場であることを意識しましょう。その方が平和に進みます

私の意見

さて本題です。いくつかあるので章に分けて書いていきますね

理由その 1

「サポートの人の判断 ≠ Microsoft の判断」

zenn.dev

よく「Windows でも 20 までならセーフ」という文脈とともに上記の記事を持ち出す人がいます。この記事ではまず Twitter のサポートに、次に Microsoft の問い合わせチャットに聞いています。そこでは「規約違反にはならない」とのことですが、私はこれに対し懐疑的な印象を持っています
というのも、サポートセンタの担当の人の発言・判断が、そのまま Microsoft の判断だとするのは誤りだと思っているからです。公式サイトにこの話題に言及した記述がある訳でもなく、FAQ に掲載されている訳でもないためです。公式のページに書いてあることであれば公開前に社内で十分協議され、問題ないとしたうえで公開されたものと考えていいですが、サポートセンタの人の場合あくまでもタイマンでのやり取りにしかみえず、裏でなにかしらの共通認識があるとも判断できません。少なくとも私はそう思うため、「Windows でマイクラサーバをホストしてもいい」という意見を補強するものにはならないと見ています。よくある質問・議題でしょうし、個人的には FAQ に乗せてくれてもいいんじゃないかとは思うんですが、一大プラットフォームとはいえ、わざわざ時間を割くほどのものでもないのでしょうか

また、「20 人まで」なら良いという文脈でよく引用されるのがこちら

Windows 10 の利用規約(下記リンク先)より、2.d.iii を引用します

https://www.microsoft.com/en-us/Useterms/Retail/Windows/10/Useterms_Retail_Windows_10_Japanese.htm#:~:text=(iii)-,%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%80%82,-%E3%81%8A%E5%AE%A2%E6%A7%98%E3%81%AF%E3%80%81%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9

(iii) バイスの接続。お客様は、ライセンスを取得したデバイスでファイルサービス、印刷サービス、インターネットインフォメーションサービス、インターネット接続の共有およびテレフォニーサービスを利用することを目的として、ライセンスを取得したデバイスにインストールされた本ソフトウェアに対し、最大 20 台の他のデバイスからの接続を許可することができます。お客様は、任意の数のデバイスに、デバイス間でデータを同期するために、ライセンスを取得したデバイス上の本ソフトウェアにアクセスすることを許可することができます。ただし、本項は、お客様がこれらの他のデバイスに本ソフトウェアをインストールしたり、本ソフトウェアの主要な機能 (本項に記載する機能を除きます) を当該デバイス上で使用したりする権利を有することを意味するものではありません。

この条文を読むと、「ファイルサービス、印刷サービス、インターネットインフォメーションサービス、インターネット接続の共有およびテレフォニーサービス」であれば最大 20 台の他のデバイスを接続できることがわかります

ここで気になるのは「インターネットインフォメーションサービス」でしょう。この文だけ見るとなんとも言えませんが、前後にファイルサービスやインターネット接続云々とある点から、「80/TCP や 443/TCP でやり取りされるサービス」をまとめて称したものと考えることができます

では、マイクラサーバはこれらに当てはまるでしょうか

マインクラフトで用いられている通信は TCP ベースのカスタムプロトコルであり、デフォルトで 25565 番ポートを使用するので、インターネットインフォメーションサービスにはあてはまらないと考えることができます。そもそもインフォメーションじゃないですしね

よってこの条文にも当てはまらないと判断できるため、人数に関係なくライセンス違反でないとは判断できません

理由その 2

「ライセンス条項の文面をそのまま読んだらどう考えてもアウト」

上記規約より 2.c.v を部分的に引用します

c.制限。(前略)このライセンスは、次の行為に関してお客様にいかなる権利も与えるものではなく、お客様は次の行為を行うことはできません。 (中略) (v) 本ソフトウェアをサーバーソフトウェアとして使用することもしくは商業的ホスティング用に使用すること、本ソフトウェアをネットワークを介して複数のユーザーが同時に使用できるようにすること(後略)

イクラサーバはこのうち「本ソフトウェアをネットワークを介して複数のユーザーが同時に使用できるようにすること」に該当し、この規約の制限を受けることは明白です
つまり、いつ「その使い方はアウトだね。だってこう書いてあるもんね」と言われてもおかしくないしその時何も言い返せません。言い返せるもんなら言い返してほしいですね。まあ言われる機会はまずないんですが

商用はダメだけど非商用ならいいと判断している人はこの条文の「本ソフトウェアをサーバーソフトウェアとして使用することもしくは商業的ホスティング用に使用すること」を読んでいるのでしょうが、読むべきはそこだけではありませんね

理由その 3

「規模が大きくなってきたら結局 Windows でホストできない」

仮に Windows を使えたとしても、サーバの規模が大きくなって 20 人を超えたら Windows でのホスティングで許容される人数制限としてよく言われている 20 人に引っかかってしまい、サーバを移行する必要が出てきます
その時の手間を考えると、最初から Linux 使う方が手間が圧倒的に少ない(server.properties を編集するだけで終わる)ので、わざわざ Windows にこだわる意味がないんですよね

規模が大きくなることはない場合には効きませんが、理由はまだいくつかありますのでめげずに頑張って読んでください

理由その 4

「OS が消費するリソースが大きい」

これはオマケ程度のものですが、Windows はアイドル時に消費するリソースが割と大きいと言えます
具体的な例としてメモリの消費を挙げてみましょう。十分量のメモリを搭載している場合、すべてのアプリケーションを閉じた状態でも Windows は 6 GB ほどメモリを消費します。対して Ubuntu の場合 300 MB を切ります。ただしこれはあくまでも我が家で飼っているマシンでの数値になります メモリ消費量が大きく、サーバの快適性にも直結するマイクラサーバをホストする上で、わざわざ OS のメモリ消費量が大きい Windows を採用するのは果たして賢明な判断だろうかと問われたら、皆さんはどう答えますか? 私は否です

理由その 5

Windows は複数人で同時に作業することに向いていない(というかできない)」

サーバを管理していると、時に複数人で同じホストにログインして作業したくなることがあります。例えば誰かがセーブデータのバックアップからロールバックしながら、別の人がプラグインの追加をするなどです。Ubuntu の場合は普通にそれぞれが SSHtelnet などでログインするだけですが、Windows ではそうは行きません。そもそも OS の構造が異なっていますからね。Linux は複数人で同一ホストにログインして使えるのに対し、Windows は一人のユーザが一つのホストを専有するといった具合です。複数のユーザを作れはしても、一度にログインできるのは一人だけです
これでは同一ホストで複数人で作業するということができません。そもそも Windows はゲーム用 OS でありサーバを建てるためのものではないので当然ですが

理由その 6

「十分使える代替手段が十二分に確立されている」

これはそもそもこんな議論をしなくて済むような手段なので本題からはやや逸れますが、一応書いておきます

わざわざ Windows を使わなくても、Ubuntu などのいわゆる Linux を使えばそもそもこんな話をしなくて済みますよね。ということです
CLI による操作に慣れていなくても、Ubuntu Desktop を使えば GUI 操作もできるため敷居は思っているより低いです
OS インストールの手間があるとの反論も考えられますが、そもそもマシンに OS をインストールできないレベルの人がサーバ運営をしようとするのが間違いでしょう。自分で選んだ OS をインストールできるようになってから出直してください。調べる力と取り組む力があれば余裕でできます

理由その 7

「ライセンスの無駄使いになりかねない」

忘れてはいけないことですが、Windows は有料の OS です。最近は格安のミニ PC にも Pro エディションが入っていることも多いのであまり意識しませんが、普通に買うと数万円する高級品です。そんな OS を個人でやるゲームサーバ用に使用するのって、どうなんですかね

ここまで 5k 文字近く一気に打ってるので頭が疲れてきた。次第に文が雑になってると思いますがご容赦を

それはさておき、本項が最後です

個人による趣味の活動であることが前提になっていると思いますが、そうなるとなるべく出費は減らしたいものです
仮にお金をためてマイクラサーバ専用マシンを用意したとしましょう。もちろん OS を入れないと行けない訳ですが、そこで何を選びますか?
ここまで真面目に読んできた真面目な方ならもう分かるでしょう。もちろん Ubuntu です。わざわざお金払って OS 買う必要もなく、情報量も多い。オマケに扱いも難しくない(慣れれば Windows より使いたくなる)。趣味で Linux を扱うと仕事でも使えるかもしれないので、わざわざ Windows固執することなく Linux にも手を伸ばしちゃいましょう。思っているほど難しくないです

あとがき

とまあ色々書いたわけですが、そもそも、なんのための Windows Server だよって話ですよね・・・

先に上げた通り Windows でマイクラサーバを建てるのは控えるべきという意見に変わりはありません。Microsoft の FAQ に「20 人までなら問題ない」と掲載されれば話は別ですが
ここまで長い間付き合っていただきありがとうございました。本稿は引用、リンク含め 5326 文字と無駄に大作に仕上がってしまいましたが、どこかで議論になったときに一意見として引用してくださるとありがたいです

iperf3 を使って LAN の速度を簡易的に計測する

表題の通り、iperf3 で LAN の速度を測ってみようと思い立ち、その手順と結果を残すべく書いた記事です

構成

現在のネットワークの概要です

この構成で行っているということが前提になります

下準備

メイン PC とサーバに iperf3 をインストールします

ダウンロードはこちらから https://iperf.fr/iperf-download.php#windows

ダウンロードした ZIP ファイルを解凍するだけです。今回はソフトウェア置き場にしている D ドライブに iperf-3.1.3-win64 というフォルダを作り、そこに展開しています

続いて、サーバの方にインストールします。こちらは Ubuntu Server 22.04.2 LTS が入っています

sudo apt install -y iperf3

これで完了

続いて、メイン機側の下準備をします

iperf3 を展開したフォルダに Run-iperf.bat を作成します。名前は任意ですが今回はこうしました

中身はコレだけ

D:\iperf-3.1.3-win64\iperf3.exe -s

たったこれだけですが、ダブルクリックで実行できるので楽です

メインマシンで iperf3 を起動

Windows マシンでサーバを実行するのは気が引けますが、クライアントの実行が面倒だったのでお許し

先程作ったバッチファイルを実行します。すると、こうなります

これで iperf サーバの実行が完了しました
ちなみに IP アドレスは 192.168.1.2 です

サーバマシンで iperf3 を起動

以下のコマンドを叩いて実行します

iperf3 -c 192.168.1.2

早速計測が始まります
結果はこちら

harusame@mc-1:~$ iperf3 -c 192.168.1.2
Connecting to host 192.168.1.2, port 5201
[  5] local 192.168.1.5 port 52618 connected to 192.168.1.2 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  32.9 MBytes   276 Mbits/sec   10    167 KBytes
[  5]   1.00-2.00   sec  29.4 MBytes   247 Mbits/sec    4    155 KBytes
[  5]   2.00-3.00   sec  24.9 MBytes   209 Mbits/sec    3    194 KBytes
[  5]   3.00-4.00   sec  26.6 MBytes   224 Mbits/sec    2    184 KBytes
[  5]   4.00-5.00   sec  28.0 MBytes   235 Mbits/sec    2    184 KBytes
[  5]   5.00-6.00   sec  25.5 MBytes   214 Mbits/sec    5    163 KBytes
[  5]   6.00-7.00   sec  26.6 MBytes   224 Mbits/sec    5    150 KBytes
[  5]   7.00-8.00   sec  25.9 MBytes   217 Mbits/sec    1    198 KBytes
[  5]   8.00-9.00   sec  26.6 MBytes   224 Mbits/sec    3    185 KBytes
[  5]   9.00-10.00  sec  31.1 MBytes   261 Mbits/sec    6    197 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   278 MBytes   233 Mbits/sec   41             sender
[  5]   0.00-10.00  sec   276 MBytes   231 Mbits/sec                  receiver

スマホからもやってみましょう
ここでは、HE.net Network Tools というアプリを使います

起動して、IP アドレスを入力します
その結果がこちら

有線は 230 Mbps くらい、無線は 150 Mbps くらい出るということが分かりました。せっかくなら速度向上を目指したくはありますがそれはまた今度

自作キーボード基板を作ったよ

早速ですが、こちらをご覧ください

この度、訳あって自作キーボード用のオリジナル基板を設計・製造しました
簡単な仕様は以下のとおりです

  • US 配列テンキーレス(87 キー)
  • USB Type-C インターフェース採用
  • CherryMX プロファイル
  • RP2040 搭載 Raspberry Pi Pico 互換仕様
  • ファームウェアレベルでカスタマイズ可能

大きな特徴は基板上にマイコンが実装されていることです。別途 Pro Micro 等を買う必要はありません
また、実装されているマイコンは USB デバイス機能に対応している RP2040(Raspberry Pi 財団製)です。これにより Pro Micro よりもファームウェアアップデートが簡単になります

ファームウェアはこちらで用意しますが、ご自身で作成することも可能です。Arduino IDE を使用して Arduino 言語で開発したり、Thonny 等を使用して MicroPython で開発したりできます
個人的には Python で組み込みプログラムを書くのはオススメしませんが、マイコンがまあまあ強いので多分普通に動くと思います

~~~

商品ページはこちら
HT-Keys-TKL|自作キーボード用基板 - HarusameTech 直販所 - BOOTH

関連リンク
https://www.harusame.tech/product/keyboard/HT-Keys/
https://github.com/Riku-mc/HT-Keys
https://github.com/Riku-mc/HT-Keys/releases

お気持ちでマイクラ鯖を立てる|Ubuntu Server 22.04.2 LTS

備忘録兼ねて。早速やっていきましょう

マシンのセットアップ

Windows (Server エディションを除く)で鯖ホストするのは EULA が~とかいう論争をそもそも生まないためにも元から Server 用の OS を使えばいいじゃんということで、Ubuntu Server を使用します。CLI アレルギーの方は Ubuntu Desktop もありますヨ
ただ、どちらにせよ CLI 操作の方が圧倒的に楽なので CLI アレルギーの方はそもそも鯖立てるのを諦めましょう

そんなことはさておき、OS インストールは画面の通り進めるだけなので省きます

SSH の下準備

SSH でアクセスできるようにします

sudo ufw default deny
sudo ufw allow 22/tcp

sudo apt install openssh-server 
sudo openssh-server enable

ちなみに、IP アドレスの固定はルータ側で行っているので、ここではいじりません

ここからは SSH 接続を使ってメイン PC から作業をします

タイムゾーンの設定

一応やっておきます

sudo timedatectl set-timezone Asia/Tokyo

screen のインストール

仮想コンソールとでもいいましょうか、これがないとめんどくさいので入れます

sudo apt install screen -y

screen でよく使う操作まとめ

個人的によく使う操作を纏めておきます

スクリーンを新規起動させる

screen -S [name]

スクリーン一覧を表示する

screnn -ls

スクリーンに入る

screen -r [name]

スクリーンを削除する①

screen kill [PID]

※ PID は screen -ls を実行した際にスクリーンの名前の前に付けられる数字で、以下の例の場合は 1149 となる

harusame@mc-1:~$ screen -ls
There is a screen on:
        1149.mc       (02/24/2023 02:47:21 PM)        (Detached)
1 Socket in /run/screen/S-harusame.

スクリーンを削除する②

exit をすることでスクリーンから抜けると同時にそのスクリーンを削除することもできる

harusame@mc-1:~$ screen -ls
There is a screen on:
        10454.mc        (02/26/2023 12:55:03 PM)        (Detached)
1 Socket in /run/screen/S-harusame.
harusame@mc-1:~$ screen -r mc

~~~

harusame@mc-1:~$ exit
exit

~~~

[screen is terminating]
harusame@mc-1:~$ screen -ls
No Sockets found in /run/screen/S-harusame.

スクリーンから抜ける

[ctrl] + [A] -> [D]

鯖の jar ファイルを置くディレクトリを掘る

今後複数起動させたいとなった時にも対応できるように、mc/main/ ディレクトリに配置することにします

mkdir mc/main/

Java 17 のダウンロード

Open JDK を使います

sudo apt install openjdk-17-jdk

イクラ鯖構築

ここからは screen を使用します。便利だからね

screen -S mc

これで mc というスクリーンを作り、mc に入ります

ディレクトリを移動

先程作ったディレクトリに移動します

cd mc/main/

ビルドツールをダウンロード

今回は SpigotMC を使用しますが、大人の事情で自前でビルドする必要があります。ただ、結構簡単にできるようにしてくれているので感謝

wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastStableBuild/artifact/target/BuildTools.jar

SpigotMC をビルド

先程ダウンロードしたビルドツールを実行します

一応ファイルが存在するかを確認

harusame@mc-1:~/mc/main$ ls
BuildTools.jar

~/mc/mainBuildTools.jar が配置されていることが確認できましたので、こいつを実行します
今回使用するバージョンは 1.19.2 とします

sudo java -jar BuildTools.jar --rev 1.19.2

マシンスペック等にもよりますが結構時間がかかるのでコーヒーでも飲んで待ちましょう

終わったらこんな表示が出ます

Success! Everything completed successfully. Copying final .jar files now.
Copying spigot-1.19.2-R0.1-SNAPSHOT-bootstrap.jar to /home/harusame/mc/main/./spigot-1.19.2.jar
  - Saved as ./spigot-1.19.2.jar
harusame@mc-1:~/mc/main$

これでビルドは完了

ファイアウォールを開ける

イクラ鯖は通常 25565/tcp で通信を行うので、ポート開放を行います

sudo ufw allow 25565/tcp
sudo ufw enable

ビルドしたやつの実行とその他

先程ビルドした Java ファイルを実行します

java -jar spigot-1.19.2.jar nogui

こんな表示が出て止まるはず。それで正常

[14:31:33] [ServerMain/INFO]: Building unoptimized datafixer
[14:31:35] [ServerMain/ERROR]: Failed to load properties from file: server.properties
[14:31:35] [ServerMain/WARN]: Failed to load eula.txt
[14:31:35] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
harusame@mc-1:~/mc/main$

止まると同時に eula.txt やその他色々が生成されます。これを編集し、EULA に同意することで実行ができます

sudo nano eula.txt

これで eula=true にして保存します

続いて、server.properties を編集します

sudo nano server.properties

これは任意ですが、今回は以下の項目を編集します

motd=HarusameTech Home Server
pvp=false
white-list=true

そして、実行します

java -jar spigot-1.19.2.jar nogui

ホワイトリストを有効にしたため、このままでは誰も入れません。なので、whiltelist add ${username} で登録しましょう

これでお気持ちマイクラ鯖の完成

実際に入るとこんな感じ

プラグインを追加

試しに、一括破壊プラグインの Timber を追加してみます
wget が使えればよかったのですが、見当たらなかったので下記リンクより一旦 PC にダウンロードします

https://www.spigotmc.org/resources/timber.28236/

「Downlowd Now」をクリックしてダウンロードします

TeraTerm のウィンドウに D&D し、ディレクトリを入力して転送します

ディレクトリを確認

harusame@mc-1:~/mc/main/plugins$ ls
PluginMetrics  Timber.jar

ちゃんと転送できました

余談ですが、このスクリプトはバージョン 1.7, 1.8, 1.9, 1.10, 1.11, 1.12 でしかテストされてないようですが、試した限り Spigot 1.19.2 でも動作しました

起動スクリプト作成

起動させる度にいちいち引数指定するのはめんどっちいので、シェルスクリプトを作ります

sudo nano start.sh
#!/bin/bash

echo "Starting SpigotMC..."

sudo java -Xms2G -Xmx2G -jar spigot-1.19.2.jar nogui

実行テスト

bash start.sh
harusame@mc-1:~/mc/main$ bash start.sh
Starting SpigotMC...
Unbundling libraries to /home/harusame/mc/main/bundler
Starting server
Loading libraries, please wait...

~~~

[11:41:49] [Server thread/INFO]: Time elapsed: 2517 ms
[11:41:49] [Server thread/INFO]: [Timber] Enabling Timber v1.1
[11:41:49] [Server thread/INFO]: Server permissions file permissions.yml is empty, ignoring it
[11:41:49] [Server thread/INFO]: Done (13.731s)! For help, type "help"

htop を見ると、ちゃんと渡した引数通り実行されていることが確認できました

TESLA K20X で Stable Diffusion を動かす試み

表題の通り、手持ちにあった TESLA を活用してみようと思い立ち、メモを兼ねてやってみようと思います

とりあえず動かすことを目標としています。この記事の通り進めてもおえかきができるようになることは保証されません

背景(独り言)

参加している某 Discord サーバで、Stable Diffusion を布教されたのでメインマシンでやってみたところ案外面白く、専用マシンが欲しくなってきました。ふとそこを見ると、使われてないマシンが一台(しかも GPU 対応! ←ここ超大事)と、漬物石と化した TESLA がこっちを見ていることに気が付いてしまいました。この TESLA は Kepler アーキテクチャであり、GeForce で言うところの GTX600 あたりと、かなり古いモデルです。なので、一筋縄ではいかないだろうという想定のもと、いろいろ調べながらやった軌跡をここに残します

下準備

当然ですが PC が必要になります。今回は、上記の通り余りものを使った GPU サーバを用意しました

構成

  • Xeon E3-1220 4C4T @ 3.10GHz
  • DDR3-ECC 10600 2GB x2
  • SATA SSD 256GB
  • TESLA K20X

この GPU は本来ラックサーバに積むもので、パッシブ冷却構造となっているため、ただ載せるだけではあっという間にオーバーヒートし最悪の場合故障してしまいます。そのため、即席で段ボール製エアダクトをこさえて強制的に風を送り冷却するようにしています

手順

実際に実行する手順です。環境差異があるところは適宜読み替えてください

尚、環境をセットアップするにあたり、同鯖メンバーの mkaraki 氏による Wiki ページを参考にしています。この場を借りてお礼申し上げます

リンクはこちら pcwakaran.github.io

Ubuntu のインストール

Ubuntu の公式サイトから Ubuntu 22.04.1 LTS の ISO イメージをダウンロードし、Rufus を使ってインストールメディアを作成します

jp.ubuntu.com rufus.ie

今回はあえて Server ではなく Desktop を使用しましたが、多分 Server でも良いと思います。やる気があったらやるかもしれません

この先はまあいつもの通り、普通にインストールをして起動させます
何も考えずにインストールしたため、ホストネームがやたら長くなっていますがお許しください

初期セットアップを済ませたら、SSH でアクセスできるようにします。めんどいのでここでは IP アドレスの固定は行いませんが、気が済まない人は固定しておきましょう

sudo apt update
sudo apt install openssh-server

sudo ufw allow 22
sudo ufw enable
sudo ufw reload

SSH が有効になっているか、sudo systemctl status ssh で確かめます

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-02-21 18:38:41 JST; 3min 52s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 3652 (sshd)
      Tasks: 1 (limit: 4605)
     Memory: 4.1M
        CPU: 101ms
     CGroup: /system.slice/ssh.service
             mq3652 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

 2月 21 18:38:41 stablediffusion-Express5800-GT110d-N8100-1850Y systemd[1]: Starting OpenBSD Secure Sh>
 2月 21 18:38:41 stablediffusion-Express5800-GT110d-N8100-1850Y sshd[3652]: Server listening on 0.0.0.>
 2月 21 18:38:41 stablediffusion-Express5800-GT110d-N8100-1850Y sshd[3652]: Server listening on :: por>
 2月 21 18:38:41 stablediffusion-Express5800-GT110d-N8100-1850Y systemd[1]: Started OpenBSD Secure She>
 2月 21 18:39:28 stablediffusion-Express5800-GT110d-N8100-1850Y sshd[3920]: Accepted password for stab>
 2月 21 18:39:28 stablediffusion-Express5800-GT110d-N8100-1850Y sshd[3920]: pam_unix(sshd:session): se>

IP アドレスを確認します。おなじみの ip a

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:2b:34:46:d0:c0 brd ff:ff:ff:ff:ff:ff
    altname enp4s0f0
    inet 192.168.1.9/24 brd 192.168.1.255 scope global dynamic noprefixroute eno1
       valid_lft 13653sec preferred_lft 13653sec
    inet6 fe80::ddc7:31dc:9a83:d8c3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 90:2b:34:46:d0:c1 brd ff:ff:ff:ff:ff:ff
    altname enp4s0f1

そして、TeraTerm 等を用いて SSH 接続します。これ以降の操作は基本的に SSH 経由で行います

今回、GPU を使用しているため、一応確認をしておきます
lspci だけでは長ったらしいので lspci | grep -i nvidia としましょう

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20Xm] (rev a1)

neofetch も見ておきましょう

sudo apt install -y neofetch
stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ neofetch
            .-/+oossssoo+/-.               stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y
        `:+ssssssssssssssssss+:`           --------------------------------------------------------------
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 22.04.1 LTS x86_64
    .ossssssssssssssssssdMMMNysssso.       Host: Express5800/GT110d [N8100-1850Y] FR1.2
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 5.19.0-32-generic
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 15 mins
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 1671 (dpkg), 9 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Resolution: 1280x1024
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: Intel Xeon E31220 (4) @ 3.400GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   GPU: NVIDIA Tesla K20Xm
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Memory: 795MiB / 3913MiB
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

GPU: NVIDIA Tesla K20Xm ちゃんと認識できていそうなのでヨシ

ドライバのインストール

TESLA のドライバをインストールします

まずは推奨ドライバを確認。ubuntu-drivers devices で確認ができます

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001021sv000010DEsd0000097Dbc03sc02i00
vendor   : NVIDIA Corporation
model    : GK110GL [Tesla K20Xm]
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-418-server - distro non-free
driver   : nvidia-driver-470 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

driver : nvidia-driver-470 - distro non-free recommended とありますので、これを使用します

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470

再起動し、nvidia-smi を実行します

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ nvidia-smi
Tue Feb 21 20:31:12 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.161.03   Driver Version: 470.161.03   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K20Xm         Off  | 00000000:01:00.0 Off |                  Off |
| N/A   23C    P0    54W / 235W |      0MiB /  6083MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

これで下準備は完了しました

Python のインストール

Stable Diffusion web ui のリポジトリを見ると Python 3.10.6 を指定していたので、これを使用します

sudo apt install python3-pip
pip install python --version 3.10.6

インストールが完了したら、コマンドプロンプトpython3 --version を実行します
以下のようになればおk

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ python3 --version
Python 3.10.6

PyTorch のインストール

TELSA K20X で実行するにあたり、CUDA の Compute Capability が 3.5 と低いため、ここで色々とこねくり回す必要があります

ここでは、CC 3.5 対応の PyTorch を GitHub - nelson-liu/pytorch-manylinux-binaries からインストールすることにします

https://github.com/nelson-liu/pytorch-manylinux-binaries/releases/tag/v1.13.1 より、対応 CUDA バージョンを確認します

インストールの際に PyTorch と CUDA のバージョンを指定する必要がありますが、ここではそれぞれ v1.12.0 と v11.6 を選びました

pip install torch==1.12.0+cu116 -f https://nelsonliu.me/files/pytorch/whl/torch_stable.html

Stable Diffusion のインストール

ようやく本題です。正直なところ既に疲れた

GitHub から引っ張ってくるので、一応 Git をインストールします

sudo apt install git

ここからは前述の Wiki と Stable Diffusion Web UI のリポジトリを見ながら進めていきます

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git stable-diffusion-webui --depth 1
git clone https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git stable-diffusion-webui/extensions/tag-autocomplete --depth 1
git clone https://github.com/toriato/stable-diffusion-webui-daam.git stable-diffusion-webui/extensions/daam --depth 1
sudo apt install wget git python3 python3-venv
pip install -U xformers

この時点で ls を実行すると、弊環境では以下のようになっていました

stablediffusion@stablediffusion-Express5800-GT110d-N8100-1850Y:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  snap  stable-diffusion-webui  Templates  Videos

stable-diffusion-webui に移動し、色々実行します

cd stable-diffusion-webui/
bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)
bash webui.sh

多分コケるので、以下を実行します

source ./venv/bin/activate
cd repositories
git clone https://github.com/facebookresearch/xformers.git
cd xformers
git submodule update --init --recursive
pip install -r requirements.txt
pip install -e .

お気持ちで再起動し、モデルと VAE のダウンロードを行います

cd stable-diffusion-webui/models/Stable-diffusion/
wget https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/BloodOrangeMix/BloodOrangeMix.safetensors

cd models/VAE/
wget https://huggingface.co/stabilityai/sd-vae-ft-ema-original/resolve/main/vae-ft-ema-560000-ema-pruned.safetensors

外部アクセスができるように webui.py を編集します

※ この手順を実行すると、別のマシンからもアクセスできるようになりますが同時に全世界からアクセスできてしまうので終わったらすぐに終了させましょう

sudo nano webui.py

[ctrl] + [/] ->demo.launch( で行を検索し、share=True, にします
[ctrl] + [X] で保存し、終了

再度実行します

bash webui.sh

結構待たされますが、気長に待ちます
うまくいかない場合は再起動してみましょう

Launching Web UI with arguments:
/home/stablediffusion/stable-diffusion-webui/venv/lib/python3.10/site-packages/torch/cuda/__init__.py:132: UserWarning:
    Found GPU0 Tesla K20Xm which is of cuda capability 3.5.
    PyTorch no longer supports this GPU because it is too old.
    The minimum cuda capability supported by this library is 3.7.

  warnings.warn(old_gpu_warn % (d, name, major, minor, min_arch // 10, min_arch % 10))
No module 'xformers'. Proceeding without it.
Loading weights [6ce0161689] from /home/stablediffusion/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors
Creating model from config: /home/stablediffusion/stable-diffusion-webui/configs/v1-inference.yaml
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
Applying cross attention optimization (Doggettx).
Textual inversion embeddings loaded(0):
Model loaded in 83.7s (load weights from disk: 0.5s, create model: 1.0s, apply weights to model: 38.5s, apply half(): 40.4s, load VAE: 2.0s, move model to device: 0.7s, hijack: 0.2s, load textual inversion embeddings: 0.4s).
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://***********.gradio.live

Running on public URL: https://***********.gradio.live の箇所は一応伏せていますが、実際はユニークなものと思しき文字列が並びます

このアドレスを Chrome 等にコピペしてアクセスします

とりあえず実行してみると、このようなエラーが出ました

100%|????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| 20/20 [00:42<00:00,  2.11s/it]
Error completing request?????????????????????????????????????????????????????????????????????????????????????????????????????| 20/20 [00:32<00:00,  1.71s/it]
Arguments: ('task(6x8x3owivwb1got)', '2girls, kiss', '', [], 20, 0, False, False, 1, 1, 7, -1.0, -1.0, 0, 0, 0, False, 512, 512, False, 0.7, 2, 'Latent', 0, 0, 0, [], 0, '', False, False, False, False, 'Auto', 0.5, 1, False, False, False, False, 'positive', 'comma', 0, False, False, '', 1, '', 0, '', 0, '', True, False, False, False, 0) {}
Traceback (most recent call last):
  File "/home/stablediffusion/stable-diffusion-webui/modules/call_queue.py", line 56, in f
    res = list(func(*args, **kwargs))
  File "/home/stablediffusion/stable-diffusion-webui/modules/call_queue.py", line 37, in f
    res = func(*args, **kwargs)
  File "/home/stablediffusion/stable-diffusion-webui/modules/txt2img.py", line 56, in txt2img
    processed = process_images(p)
  File "/home/stablediffusion/stable-diffusion-webui/modules/processing.py", line 486, in process_images
    res = process_images_inner(p)
  File "/home/stablediffusion/stable-diffusion-webui/modules/processing.py", line 636, in process_images_inner
    devices.test_for_nans(x, "vae")
  File "/home/stablediffusion/stable-diffusion-webui/modules/devices.py", line 152, in test_for_nans
    raise NansException(message)
modules.devices.NansException: A tensor with all NaNs was produced in VAE. This could be because there's not enough precision to represent the picture. Try adding --no-half-vae commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.
100%|????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| 20/20 [00:30<00:00,  1.54s/it]
Error completing request:49,  1.56s/it]
Arguments: ('task(lm6wunod163rbwu)', '2girls, kiss,', '', [], 20, 0, False, False, 1, 1, 7, -1.0, -1.0, 0, 0, 0, False, 512, 512, False, 0.7, 2, 'Latent', 0, 0, 0, [], 0, '', False, False, False, False, 'Auto', 0.5, 1, False, False, False, False, 'positive', 'comma', 0, False, False, '', 1, '', 0, '', 0, '', True, False, False, False, 0) {}
Traceback (most recent call last):
  File "/home/stablediffusion/stable-diffusion-webui/modules/call_queue.py", line 56, in f
    res = list(func(*args, **kwargs))
  File "/home/stablediffusion/stable-diffusion-webui/modules/call_queue.py", line 37, in f
    res = func(*args, **kwargs)
  File "/home/stablediffusion/stable-diffusion-webui/modules/txt2img.py", line 56, in txt2img
    processed = process_images(p)
  File "/home/stablediffusion/stable-diffusion-webui/modules/processing.py", line 486, in process_images
    res = process_images_inner(p)
  File "/home/stablediffusion/stable-diffusion-webui/modules/processing.py", line 636, in process_images_inner
    devices.test_for_nans(x, "vae")
  File "/home/stablediffusion/stable-diffusion-webui/modules/devices.py", line 152, in test_for_nans
    raise NansException(message)
modules.devices.NansException: A tensor with all NaNs was produced in VAE. This could be because there's not enough precision to represent the picture. Try adding --no-half-vae commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

--no-half-vae を引数にいれてね」とあるので、以下のコマンドを実行します。NaN チェックを飛ばしたいときは --disable-nan-check も追加してあげましょう

bash webui.sh --no-half-vae
bash webui.sh --no-half-vae --disable-nan-check

サイズは 256x256 くらいにしておきましょう

こうするとお絵かきができるようになりますが、試した限りでは真っ黒な画しか出ませんでした。流石に実運用に使うには古すぎますね

個人的には Maxwell / Pascal 以降でないと厳しいと思います。メイン機の GPU を買い替えたら今使ってる RTX2060 を GPU 鯖用にして遊ぼうかな

参考サイト

qiita.com

github.com

github.com

github.com

www.reddit.com

IX2215 を自宅で使用しながらひかり電話も使えるようにしたい記事

最近、自宅のインターネットで使用するルータを ONU 内蔵のものから IX2215 に変更しました。その状態でしばらく使っていたところ、契約しているひかり電話が使えないということに気付いたので、現在の状況の整理がてら、対処法を書き残しておこうと思います

問題が発生していた構成

以前、このような構成を組みました。IX2215(以後単に IX と表記)をメインルータとし、いわゆる UNI 出しと呼ばれる構成を取っています

尚、固定電話と接続している線はそのまま ONU 内蔵のひかり電話ルータに接続されたままです

実機の写真はこちら

ルータ

ONU の背面付近(白い線が UNI と GE0.1 を接続している線)

当然ながら、内蔵ルータ側のインジケータは PPP もひかり電話も消えたままです

このような状態で運用を始め数週間がたったある日、祖母にこう言われました
「あんた、家の電話がなんかおかしいらしいんやけど見てくれん?」

そう言われて初めて、ひかり電話が使えない状態になっていることに気づきました
(管理者としてはダメダメですが、そもそも使用頻度がものすごく低いことと、勉強を始めたばかりの学生でもあるということでお許しください)

今回は、思いついた解決策を 2 つ検証することができたので、それぞれについて書き残します

解決策①|UNI からの線を分岐させ、ひかり電話ルータも接続する

あまりものを使用することで、追加コストゼロで実現できました。変更後の配線は以下の通り(自室へ向かう線と Wi-Fi ルータへ向かう線は変更していないのと今回の話とは関係ないので省きました)

UNI と GE0.1 の間にその辺に転がってた Buffalo の 5 ポートのハブを挟んでいます
下の画像左側から順に UNI から出ている線(緑の頭の白い線)、元は中で繋がっていたひかり電話ルータへの線(水色の線)、IX の GE0.1 に向かう線(黒い頭の白い線) となっています

こういうやつですね

配線はやや無理矢理感はありますが、こうすることでひかり電話が復活しました
ちゃんとひかり電話のインジケータが光り、発着信も問題なく行なえています

本来 IX 側だけでいいはずの PPPoE の通信が内蔵ルータにも行ってしまっているため、PPP のインジケータも光っています
HGW とパソコンを直接つないで http://192.168.1.1/ へアクセスし、念のため IPv4IPv6 双方の通信を止めます

IPv6 の通信を止めた様子

PPP のインジケータが消えました

これにて、無事ひかり電話が復活し、IPv4, IPv6 双方の通信も問題なく行える状態にまで復帰させることができました

https://v6test.docomonet.jp/

※この方法で対応できるのは PPPoE 通信のみで、HGW では IPv6 IPoE の通信は切れないらしく、IPoE に関しては依然 DHCPv6-PD の取り合いとなりますが、後述の通り仮措置なのと、現状特段の影響は出てないので、まあ気休めということで

解決策②|NVR500 を導入する

解決策①は、実はこれをするまでの繋ぎとしての措置で、本命はこっちだったりします。そもそもひかり電話ルータ側に通信が行かないようにしてやることで、気にしなくてすむようになるという作戦です
そんなことはさておき、配線図は以下の通り。NVR500 (以後単に NVR と表記)にひかり電話関連の処理をさせています

本来であれば IX の GE1 に NVR を接続し、IX に GE1 へ向かう通信のうち IPv6 をブロックさせ、のこりはブリッジさせるつもりだったんですが、何故かうまく行かなかったので UNI から分岐させ、後述する設定項目を投入し使用することにしました

IX 側については何も変わっていないので割愛

今回訳あって NVR500 を提供いただけたので、上図の通り配線し、設定を投入します
実際の機器配置と配線はこちらをご覧ください

全景
ONU 背面
NW 機器前面
NVR 背面

投入した設定

ip lan1 address 192.168.1.1/24
ip lan2 address dhcp
ngn type lan2 ntt
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.1.101-192.168.1.200/24
dhcp client release linkdown on
analog arrive number display 1 off
analog sip arrive permit 1 myname
analog sip arrive myaddress 1 1 sip:0[0-9]{9}@ntt-(east|west).ne.jp
analog arrive number display 2 off
analog sip arrive permit 2 myname
analog supplementary-service pseudo call-waiting
analog extension emergency-call-dial type normal-number
analog extension dial prefix routing route-table=1 ngn lan2
analog extension dial prefix port=1 routing route-table=1 ngn lan2
analog extension dial prefix port=2 routing route-table=1 ngn lan2
analog call route-table 1 1
analog call route 1 * * ngn lan2 * line
sip use on
sip codec permit lan2 g711u

SIP の項目は正規表現で代用しています

この設定を投入し、UNI と WAN を直結させて発着信テストを行います。Web GUI から行うのが良いと思います
もし、発信・着信ができない場合は何かがおかしいので公式サイト等を見てやり直してみましょう。今回は問題なく行ったので次に進みます

続いて、IPv6 の通信を止める設定を投入します

no ipv6 route default gateway dhcp lan2
no ipv6 prefix 1 dhcp-prefix@lan2::/64
no ipv6 lan1 address dhcp-prefix@lan2::1/64
no ipv6 lan1 rtadv send 1
no ipv6 lan2 address dhcp
no ipv6 lan2 dhcp service client

できたら、save で保存し、電源を落とします
そして、IX の配線をもとに戻し、起動させます

再び発着信を行います。多分ここで問題が出てくることはあまりないと思ってはいますが一応

あるいは、コンソールで以下のコマンドを実行して確認する方法もあります

# show status ngn

もし、うまく行っていない場合、このように帰ってくると思います

# show status ngn
NGN(UNI)に関する情報が足りません
# 

うまく行っている場合はこうなります

# show status ngn
NGN status

  LAN2
    sip:0*********@ntt-west.ne.jp
    起動OK

# 

これにて、自宅回線での通信を IX で収容しつつ、ひかり電話も使用できる環境が整いました。やったね!