LinuxMint19.3にMinicondaをインストール

故あって、LinuxMint19.3にMinicondaをインストールしました。

https://conda.io/projects/conda/en/latest/user-guide/install/linux.html
を参考にしてインストールします。

https://docs.conda.io/en/latest/miniconda.html
からPython3.7のMiniconda3 Linux 64-bit installerをダウンロードして、sha256を確認して起動します。

$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ sha256sum Miniconda3-latest-Linux-x86_64.sh 
957d2f0f0701c3d1335e3b39f235d197837ad69a944fa6f5d8ad2c686b69df3b Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh

(2)ライセンスの合意

Welcome to Miniconda3 4.8.2

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>

ENTERを入力します。

===================================
End User License Agreement - Anaconda Individual Edition
===================================

Copyright 2015-2020, Anaconda, Inc.
:
:
Last updated February 25, 2020

Do you accept the license terms? [yes|no]
[no] >>> yes

ライセンスを確認してyesを入力します。

Miniconda3 will now be installed into this location:
/home/xxxx/miniconda3

- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below

[/home/xxxx/miniconda3] >>> 
PREFIX=/home/xxxx/miniconda3

インストール先(標準では $HOME/miniconda3)を入力

Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>>

環境設定を勝手にやるか?ということみたいですが、yesのほうが良かったかも。

noを選んだら、手作業で、

xxxx@hostname:~/miniconda$ eval "$(/home/xxxx/miniconda3/bin/conda shell.bash hook)" 
(base) xxxx@hostname:~/miniconda$ conda init
no change     /home/xxxx/miniconda3/condabin/conda
no change     /home/xxxx/miniconda3/bin/conda
no change     /home/xxxx/miniconda3/bin/conda-env
no change     /home/xxxx/miniconda3/bin/activate
no change     /home/xxxx/miniconda3/bin/deactivate
no change     /home/xxxx/miniconda3/etc/profile.d/conda.sh
no change     /home/xxxx/miniconda3/etc/fish/conf.d/conda.fish
no change     /home/xxxx/miniconda3/shell/condabin/Conda.psm1
no change     /home/xxxx/miniconda3/shell/condabin/conda-hook.ps1
no change     /home/xxxx/miniconda3/lib/python3.7/site-packages/xontrib/conda.xsh
no change     /home/xxxx/miniconda3/etc/profile.d/conda.csh
modified      /home/xxxx/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

とする必要があります。

もとに戻す場合、

$ conda config --set auto_activate_base false

もとに戻しても、 新しいシェルでは conda コマンドは使えるみたい。

仮想環境を作る前に、miniconda の環境をアップデートしておきます。

$ conda update -n base -c defaults conda

仮想環境を作ってみます。

$ conda create -n sample

仮想環境をアクティベーションします。

$ conda activate sample

モジュールのインストールはこんな感じです。

$ conda install xlrd

minicondaのチートシートはここにありますので参考になるかも。

MicroServerにOpenMediaVaultをインストール(2)

4.ディスクのマウントと共有の作成

(1)「ストレージ」→「ファイルシステム」で、作成したRAIDボリュームをマウントして共有できるようにします。
(2)「アクセス権の管理」→「共有フォルダ」で、RAID領域の下に共有領域を作ります。このときに適当にその領域の共有名を付けます。
(3)「アクセス権の管理」→「ユーザ」で、Windowsファイル共有のユーザーを登録します。ここでユーザーを選んで「特権」をクリックすると共有ごとのアクセス権限を設定できるようです。
(4)「サービス」→「SMB/CIFS」で、まず「一般設定」で機能を有効化、ワークグループ名を適当に付けます。その後、「共有」で「+追加」をクリックして、共有されるフォルダを登録します。共有フォルダは先程作った共有名で指定します。

5.旧サーバから新サーバへのデータのコピー

自分はすべてのファイルにアクセス権があるので、Windows上でROBOCOPYでコピーすることにしました。

robocopy /copy:DT \\旧サーバ\共有名 \\新サーバ\共有名 /MIR /R:3 /W:5

でミラーリングします。

NanoPi NEO2にOpenMediaVaultをインストール

今度は、NanoPi NEO2にArmbian+OpenMediaVaultをインストールします。

1.Armbianのインストール

イメージはArmbianのNanoPi NEO2のページからArmbian Busterのイメージをダウンロードしてきました。これをMicroSDにディスクイメージライタで書き込んで、NanoPi NEO2にセットします。

電源投入して少し待ったら、SSHで接続します。ユーザー名はroot、初期パスワードは1234です。接続したら、rootパスワードの変更とユーザーの作成を聞いてきますので、適当に設定します。

一度ログアウトしてログインし直してから、apt-get update & apt-get upgrade をかけます。理由がよくわかりませんが、異常に時間がかかりました。、

再起動したら、再度 armbian-config を起動して、タイムゾーンをAsia/Tokyoにセット、ロケールにja_JP.UTF-8を追加、デフォルトロケールはen_US.UTF-8にセット、ホストネームを適当にセットして、一旦リブートします。

2.ArmbianのルートファイルシステムをHDDに移動

MicroSDだといつかブッ飛ぶので、ルートファイルシステムをHDDに移動します。

まず、fdiskでHDDのパーティションを作成します。

今回は30GBをルートパーティション、4GBをスワップ、残りをデータ領域にすることにしました。

Device        Start      End  Sectors Size Type
/dev/sda1      2048 62916607 62914560  30G Linux root (ARM-64)
/dev/sda2  62916608 71305215  8388608   4G Linux swap

フォーマットしておきます。

$ sudo mkfs.ext4 /dev/sda1
$ sudo mkswap /dev/sda2

次にルートファイルシステムをUSB-HDDに移動します。

$ sudo armbian-config

でarmbian-configを起動、systemメニューを選択して「Install」を選択して「1 Boot from SD – system on SATA, USB or NVMe」でUSB-HDDに /dev/sda1 にシステムを移動します。

移動が完了すると、再起動を勧められるので、再起動します。

3.OpenMediaVaultをインストール

$ sudo armbian-config

でarmbian-configを起動、softwareメニューを選択、Softy を選択して 3rd party のソフトウェアをインストールします。

ソフトウェアの一覧の中に「OMV」があるので、これにチェックマークをつけて、インストールします。(かなり時間がかかります)

4.OpenMediaVaultにログイン

完了したらブラウザでOpenMediaVaultにログインします。avahiが動いているので、http://(ホスト名).local でアクセスできます。ユーザー名は admin 、パスワードは openmediavault です。ログインしたら、以下の作業を行います。

(1)パスワードの変更とネットワーク設定を行います。
(2)sshでログインして、fdiskでHDDの空き領域をLinuxのファイルシステム領域にして、ext4でフォーマットしておきます。(OpenMediaVaultでできるかと思ったけど、できなそう)
加えて、e2labelコマンドでラベルを付けておきます。

$ sudo mkfs.ext4 /dev/sda3
$ sudo e2label /dev/sda3 mirror

(2)「ストレージ」→「ファイルシステム」で、/dev/sda3 をマウントして共有できるようにします。
(3)「アクセス権の管理」→「共有フォルダ」で、/dev/sda3 の下に共有領域を作ります。このときに適当にその領域の共有名を付けます。
(4)「アクセス権の管理」→「ユーザ」で、Windowsファイル共有のユーザーを登録します。
(5)「サービス」→「SMB/CIFS」で、まず「一般設定」で機能を有効化、ワークグループ名を適当に付けます。その後、「共有」で「+追加」をクリックして、共有されるフォルダを登録します。共有フォルダは先程作った共有名で指定します。

PINE64にOpenMediaVaultをインストール

ちょっと脱線してOpenMediaVaultのドキュメントを見ていると、Armbian Busterの場合には、armbian-configからインストールができるようなことが書いてあるので試してみました。

今回のターゲットはArmbian Busterをインストールしたまま放置していたPine64(1GB)です。ここにUSB接続で先程取り外した2TB HDDのうちの1台を取り付けました。

1.USB-HDDにパーティションを作成

今回は50GBをルートパーティション、4GBをスワップ、残りをデータ領域にすることにしました。

Device     Boot     Start        End    Sectors  Size Id Type
/dev/sda1            2048  104859647  104857600   50G 83 Linux
/dev/sda2       104859648  113248255    8388608    4G 82 Linux swap / Solaris
/dev/sda3       113248256 3907029167 3793780912  1.8T 83 Linux

sda3は

$ sudo mke2fs -t ext4 /dev/sda3

でフォーマットしておきます。

2.ルートファイルシステムをUSB-HDDに移動

$ sudo armbian-config

でarmbian-configを起動、systemメニューを選択して「Install」を選択して「1 Boot from SD – system on SATA, USB or NVMe」でUSB-HDDに /dev/sda1 にシステムを移動します。

移動が完了すると、再起動を勧められるので、再起動します。

3.OpenMediaVaultをインストール

$ sudo armbian-config

でarmbian-configを起動、softwareメニューを選択、Softy を選択して 3rd party のソフトウェアをインストールします。

ソフトウェアの一覧の中に「OMV」があるので、これにチェックマークをつけて、インストールします。(かなり時間がかかります)

4.OpenMediaVaultにログイン

完了したらブラウザでOpenMediaVaultにログインします。avahiが動いているので、http://(ホスト名).local でアクセスできます。ユーザー名は admin 、パスワードは openmediavault です。ログインしたら、以下の作業を行います。

(1)パスワードの変更とネットワーク設定を行います。ネットワークは設定前に再起動すると無効に設定されてしまうようなので、コンソールからしか直せなくなります。
(2)「ストレージ」→「ファイルシステム」で、/dev/sda3 をマウントして共有できるようにします。
(3)「アクセス権の管理」→「共有フォルダ」で、/dev/sda3 の下に共有領域を作ります。このときに適当にその領域の共有名を付けます。
(4)「アクセス権の管理」→「ユーザ」で、Windowsファイル共有のユーザーを登録します。
(5)「サービス」→「SMB/CIFS」で、まず「一般設定」でワークグループ名を設定して機能を有効化、ワークグループ名を適当に付けます。その後、「共有」で「+追加」をクリックして、共有されるフォルダを登録します。共有フォルダは先程作った共有名で指定します。

これで、Linux上からはWindowsファイル共有として見えるようになりました。後ほど、Windowsから実際に見えるか試してみたいと思います。

まとめ

ほぼ同じ手順で、NanoPi NEO2 NASキットもOpenMediaVault化できると思います。FriendlyElecで配布しているNASキットのイメージ(OpenMediaVaultのイメージ)では、ルートファイルシステムをMicroSDに取っているからか、あるいは、ベースとなっているArmbianに何か問題があるのかわかりませんが、長期間運用するとMicroSD上のシステムが破損するという傾向がありました。(過去2年で3回)
そのため、3台あるNASキットのうちの1台はHDDにルートファイルシステムをインストールして、手作業でSambaの設定を行って運用してきました。他の2台はFreeNASのコピーを保持しているだけ(夏場に高温だろうが雷がなりまくろうがデータ参照できるように電源を入れっぱなしにするのが目的)なので、放置していました。
今回の方法であれば、ArmbianやOpenMediaVaultなどのBugFixも取り込めますし、ルートファイルシステムもHDD上にあるのでMicroSDの破損の心配もありません。

MicroServerにOpenMediaVaultをインストール(1)

昔HPのMicroServerを購入して長くFreeNASで運用してきました。途中、単身赴任していた時期に単身赴任先にも設置していた関係でMicroServerは2台導入していて、1台をマスターとしてZFSで3TB HDD×2台のミラー構成、もう1台をスレーブとして、ZFSでお古の2TB HDD×4台でRAID10相当の構成で運用して、rsyncでマスターからスレーブに同期してバックアップという運用をしてきました。(何重にバックアップとってんだw)

で、起動に使用しているUSBメモリが死んでしまったのか、このスレーブ側がまともに立ち上がらなくなってしまったので、これを気にSTAY HOMEな2020年ゴールデンウィークに再整備して、こちらをマスター側に、それが完了したら、元のマスター側をスレーブ側にすることにします。

メモリは8GBとはいえ、さすがにCPUが古いので、今回は負荷がかかると言われるFreeNASではなく、OpenMediaVaultで構築することにしました。

HDDは4TB×2台、本来ならNAS用を入れたいところですが、どうせ24/365運用ではなく週末しか起動していないので、安価に済ませるためにWDとSeagateの安い4TBを2台調達しました。(どうせしつこいくらいバックアップとってるわけですから)

1.Debianのインストール

OpenMediaVaultはDebian上にインストールしますので、まずDebianを入れます。
まずは、古い2TBのHDDを4本とも撤去し、溜まったホコリを掃除しました。その後、システムドライブとして、ほとんど使っていないまま放置していたWD Black 500GBを取り付けました。まだ、4TB×2は取り付けていません。

まずは、amd64用のnetinst.isoをこちらからダウンロードしてきて、Linux上のディスクイメージライタでUSBメモリに書き込みます。

書き込んだUSBメモリを取り付けて電源ONすると、確かインストーラの選択画面が出ます。とにかく最小限でインストールせよ、というのがOpenMediaVaultのドキュメントに記載があるので、TUIのインストーラでインストールを行いました。

(1)言語の選択で日本語を選択
(2)場所の選択で日本を選択
(3)キーボードの設定で日本語を選択
(4)ホスト名で「server1」を設定
(5)ドメイン名を適当に設定
(6)rootのパスワードを設定
(7)ユーザを作成(本名、アカウント名、パスワードを入力)
(8)パーティショニングの設定
ディスク全体を使用して、以下の通り分割。ガイドだとルートパーティションが30GBになったので、これを倍のサイズにしました。スワップはガイドの通り。
領域1 基本 60 GB ext4 /
領域5 論理 8.6 GB スワップ
領域6 論理 431.5 GB ext4 /home

以上を設定するとベースシステムのインストールが行われます。

(9)アーカイブミラーの選択
自分は ftp.riken.jp を設定しました。
(10)プロキシの設定
(11)インストールするソフトウェアパッケージの選択
デスクトップ環境とプリンタサーバを外して、SSHサーバと標準システムユーティリティを選択して次へ進みます。

(12)GRUBブートローダのインストール

でインストール完了。USBメモリを抜いて次へ進む

2.OpenMediaVaultのインストール

こちらの指示に従ってインストールします。

まず、コンソールからログインして、 ip addr コマンドでIPアドレスを確認、別のPCから作成したアカウントを使ってSSHでリモートログインします。su コマンドでルートになってから以下の作業をします。

apt-get install --yes gnupg
wget -O "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc" https://packages.openmediavault.org/public/archive.key
apt-key add "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc"

リポジトリを追加します

cat <<EOF >> /etc/apt/sources.list.d/openmediavault.list
deb https://packages.openmediavault.org/public usul main
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul main
## Uncomment the following line to add software from the proposed repository.
# deb https://packages.openmediavault.org/public usul-proposed main
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul-proposed main
## This software is not part of OpenMediaVault, but is offered by third-party
## developers as a service to OpenMediaVault users.
# deb https://packages.openmediavault.org/public usul partner
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul partner
EOF

インストールします

export LANG=C.UTF-8
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
wget -O "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc" https://packages.openmediavault.org/public/archive.key
apt-key add "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc"
apt-get update
apt-get --yes --auto-remove --show-upgraded \
    --allow-downgrades --allow-change-held-packages \
    --no-install-recommends \
    --option Dpkg::Options::="--force-confdef" \
    --option DPkg::Options::="--force-confold" \
    install openmediavault-keyring openmediavault

omv-confdbadm populate

3.ログイン

しばらくするとインストールが完了します。途中で avahi もインストールされるので、ブラウザで http://server1.local にアクセスすると、OpenMediaVaultのログイン画面に到達できます。

デフォルトのパスワードはこちらに書いてありますが、ユーザー名 admin、パスワード openmediavault です。最初に管理者パスワードを設定する必要があります。また、ネットワークの設定もやりおなします。どうも、再起動か何かのタイミングで無効に設定されるようです。(無効になるタイミングがよくわかりません)

また、OpenMediaVaultをインストールすると以下の変更がされていますので、適宜設定が必要です。

  • root での ssh ログインが許可されています
  • ホスト名がopenmediavaultに変更されています

インストールは無事に完了したので、一旦シャットダウンして、4TBのディスク2台を取り付けて、再度起動します。

起動したら、ディスクを認識していることを確認したら、SMARTの設定をスタンバイに設定変更して、RAIDデバイス作成を行います。

今回はミラーで設定します。対象ディスク2台を選択して適用するとしばらく時間がかかります。RAID管理で状態を見ると、resyncingが少しづつ増えていって、6時間強かかることがわかります。

博物館等の無料バーチャルツアー

新型コロナでみんな籠もってる状況ですが、博物館等で無料バーチャルツアーが流行っている模様。

なかなか(つーか、まず無理)行けない海外の博物館を画面を通してとはいえじっくり眺められるのは嬉しいところ。GWにゆっくりみたいので、とりあえずメモ。

無料で世界中の美術館を楽しみ尽くせる「バーチャルミュージアム」が公開中(GIGAZINE)

無料&オンラインで収蔵品を鑑賞できる超著名な海外美術館・博物館まとめ(GIGAZINE)

無料でエジプトの古代遺跡の中に入って回れる3Dバーチャルツアーが公開中(livedoor NEWS)

Minicondaを使ってみる

これまで、Pythonの環境構築はPythonを単体でインストールして、venvで仮想環境を作って、pyinstaller(exe化する場合)をインストールして・・・とやってきました。

機械学習にPythonを使う場合にはAnacondaという管理ツールが便利だ、という話はよく目にするのですが、なにせ巨大でpyinstallerでexe化するとできたexeも巨大になってしまう、ということで避けてきました。

ところがふとしたことから、Minicondaという最小パッケージのものがあるというのを目にして、それでやってみることにしました。今回はWindowsでやってみます。(インストーラはWindows,Mac,Linux版などがあるようです)

1.Minicondaのインストール

Condaの公式サイトMinicondaのページからインストーラをダウンロードします。まだexeを使用する先に32bitが残っているので最終的には32bit環境を使いたいのですが、まずは64bit版をダウンロードします。

ダウンロードしたインストーラをダブルクリックして、起動します。
途中で、インストール先を聞いてくるので、後で32bit版を入れるときにはここでインストール先を変更すればよいのかもしれません。

インストールを終わると、Webサイトを開くか聞いてきますが、これで開くとAnaconda Cloudのアカウント作成について聞いてきます。

2.起動

スタートメニューに Anaconda(miniconda)ができていました。

コマンドプロンプトとPowershellと2つできています。GIMPは別にインストールしたものです。

今回は下の通常の(?)コマンドプロンプトの方をクリックして起動します。
起動したら、Pythonのバージョン確認、condaのバージョン確認、作成済みの仮想環境(この場合は、デフォルトの環境)の表示をしてみます。

仮想環境を作る前に、condaのアップデートをしておきます。

(base) C:\Users\xxxxx>conda update -n base -c defaults conda

次に、仮想環境を作ってみます。

(base) C:\Users\xxxxx>conda create -n sample
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: C:\Users\xxxxx\miniconda3\envs\sample

Proceed ([y]/n)?

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate sample
#
# To deactivate an active environment, use
#
#     $ conda deactivate


(base) C:\Users\xxxxx>

仮想環境を立ち上げます。

(base) C:\Users\xxxxx>conda activate sample

(sample) C:\Users\xxxxx>py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

という感じでした。

Bottleというフレームワークを試してみた(2)

あちこち参考にして、もう少し遊んでみました。

test001.py

#!/usr/bin/env python3

from bottle import route, run, view, template, static_file, url

@route('/static/<filename:path>', name='photo')
def server_static(filename):
    return static_file(filename, root='./static')

@route('/hello')
@route('/hello/<name>')
@route('/hello/<name>/<count:int>')
@view('hello_template')
def hello(name='名無し',count=1):
    return dict(name=name, count=count, url=url)

run(host='localhost', port=8080, debug=True, reloader=True)

hello_template.tpl

やあ、<b>{{name}}</b>さん<br />
% if count > 1 :
<br />
{{count}}回表示します<br />
<br />
%   for i in range(count):
{{i+1}}回目<br />
%   end
% end
<img src="{{url('photo', filename="cat.jpg")}}">

そして、./photo/cat.jpg に写真を置いて表示してみるとこんな感じ。

パスにパラメータを入れるとこんな感じ。

写真は フリー素材ぱくたそ(www.pakutaso.com) さんのところから入手したのを縮小して使いました。

Bottleというフレームワークを試してみた(1)

Flaskよりもさらに軽いPython上のフレームワークで Bottle というのがあるということで、試してみました。

参考にさせていただいたのはこちら(とても参考になる)です。

まずは環境構築。いつものように LinuxMint19 Mate 64bit 上にPythonの仮想環境で準備します。

~/python$ python3 -m venv BottleTest
~/python$ cd BottleTest/
~/python/BottleTest$ source bin/activate
(BottleTest) ~/python/BottleTest$ pip install --upgrade pip
(BottleTest) ~/python/BottleTest$ pip install bottle

これだけ。

おためし用のソースを用意します。

#!/usr/bin/env python3

from bottle import route, run

@route('/hello')
def hello():
    return "Hello World!"

run(host='localhost', port=8080, debug=True, reloader=True)

実行してみます。(コンソール出力も含んでます)

(BottleTest) ~/python/BottleTest$ python3 quickstart.py 
Bottle v0.12.18 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

127.0.0.1 - - [08/Mar/2020 15:02:04] "GET / HTTP/1.1" 404 720
127.0.0.1 - - [08/Mar/2020 15:02:04] "GET /favicon.ico HTTP/1.1" 404 742
127.0.0.1 - - [08/Mar/2020 15:02:16] "GET /hello HTTP/1.1" 200 12

表示してみた感じはこんな感じ。

たしかに簡単です。

VLANを追加

今度は一つのインタフェースにIPアドレスを降るのではなく、VLANタグを追加して、そこにIPアドレスを振ってみます。

まずはインタフェースの状態を確認。今回はPC側でUSBで増設したインタフェースに対して試してみます。インタフェース名の下6桁やMACアドレスなどは掲載時にXXに置換しています。

$ ip -s -d addr show dev enx384b76XXXXXX
3: enx384b76XXXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    inet 192.168.0.253/24 brd 192.168.0.255 scope global noprefixroute enx384b76XXXXXX
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XX:XXXX:XXXX/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    4170690    14491    0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3975503    37565    0       0       0       0

VLANを作成してみます

$ sudo ip link add link enx384b76XXXXXX name vlan100 type vlan id 100

結果を確認します(関係ないインタフェースの情報は削除しています)

$ ip -s -d addr show
3: enx384b76XXXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    inet 192.168.0.253/24 brd 192.168.0.255 scope global noprefixroute enx384b76XXXXXX
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XX:XXXX:XXXX/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    4170690    14491    0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3978513    37579    0       0       0       0       
7: vlan100@enx384b76XXXXXX: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vlan protocol 802.1Q id 100 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0

IPアドレスを割り振ってみます。

$ sudo ip addr add 192.168.1.253/24 brd 192.168.1.255 dev vlan100

結果を確認します。

$ ip -s -d addr show dev vlan100
7: vlan100@enx384b76XXXXXX: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vlan protocol 802.1Q id 100 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    inet 192.168.1.253/24 brd 192.168.1.255 scope global vlan100
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0

この状態だとインタフェースがDOWNのままなので、起動します。

$ sudo ip link set dev vlan100 up

結果を確認します。

$ ip -s -d addr show dev vlan100
7: vlan100@enx384b76XXXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vlan protocol 802.1Q id 100 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    inet 192.168.1.253/24 brd 192.168.1.255 scope global vlan100
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XXXX:XXXX:XXX/64 scope link 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3181       23       0       0       0       0

この状態では、192.168.0.0/24 にアクセスするとタグ無しで、192.168.1.0/24 にアクセスすると VLANID=100 の802.1Qタグありで通信することになります。

次に、その先のスイッチの設定です。ここではTP-LINKのTL-SG105Eを使っています。

PC側でVLANなしのアドレスの方で192.168.0.253/24を振っているので、こちらを使ってこのスイッチのデフォルトIPアドレスの場合の管理画面へ http://192.168.0.1 にアクセスして admin/admin(初期パスワードの場合)でログインします。

802.1Q VLANの設定で、VLAN ID 100を設定して、このPCが繋がっているポート5をTagged Ports に、その先で Raspberry Pi が繋がっているポート1をUnttaged Ports に設定します。

設定後は上記のような感じです。画面の上半分は設定を行う画面で、VLAN IDのところに設定対象のVLAN IDを入れてから、各ポートの設定内容にチェックをして「Add/Modify」を押して使います。
下半分が設定状況で、VLAN IDが100の行を見ると、Member Ports が 1,5 で、Tagged Ports が 5、Unttaged Ports が 1になっています。ですので、ポート5には802.1Qタグが付いた状態で、ポート1には802.1Qタグがない状態で通信することがわかります。
これだけではダメで、ポート1のPVIDを100に設定して、Raspberry Piとの通信時に使うポート1の通信時に802.1Qタグの付け外しをさせます。

これで、Raspberry Piにpingを打つと帰ってくるようになります。

$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.07 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.435 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.517 ms
^C
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2031ms
rtt min/avg/max/mdev = 0.435/0.676/1.077/0.286 ms

もちろん、SSHでもログインできます。同様のことは Raspberry Pi でもできると思いますが、ip コマンドを使った設定は再起動で失われてしまいます。

永続的に使うには・・・NetworkManegerでやるのが簡単でした・・・。というか、はじめからLinuxMintには入ってた・・・。

以下は設定後のスクリーンショットです。説明いらないくらい簡単のような。

シェル上でも

$ export LANG=jp_JP.UTF-8
$ nmtui

こんな感じで設定できるし、楽ちんです。

で、tuiでできるということは、Raspberry Pi でもsshでログインして、

$ sudo apt-get install network-manager
$ sudo systemctl enable NetworkManager.service
$ sudo systemctl start NetworkManager.service
$ export LANG=ja_JP.UTF-8
$ nmtui

で、

という感じで設定ができてしまいます。

追加できるモジュール?もこんなにたくさん。

$ sudo apt list Network*
Listing... Done
network-config/stable 0.2-2 all
network-manager-config-connectivity-debian/stable 1.14.6-2+deb10u1 all
network-manager-dev/stable 1.14.6-2+deb10u1 armhf
network-manager-fortisslvpn-gnome/stable 1.2.8-2 armhf
network-manager-fortisslvpn/stable 1.2.8-2 armhf
network-manager-gnome/stable 1.8.20-1.1 armhf
network-manager-iodine-gnome/stable 1.2.0-3 armhf
network-manager-iodine/stable 1.2.0-3 armhf
network-manager-l2tp-gnome/stable 1.2.10-1 armhf
network-manager-l2tp/stable 1.2.10-1 armhf
network-manager-openconnect-gnome/stable 1.2.4-2 armhf
network-manager-openconnect/stable 1.2.4-2 armhf
network-manager-openvpn-gnome/stable 1.8.10-1 armhf
network-manager-openvpn/stable 1.8.10-1 armhf
network-manager-pptp-gnome/stable 1.2.8-2 armhf
network-manager-pptp/stable 1.2.8-2 armhf
network-manager-ssh-gnome/stable 1.2.10-1 armhf
network-manager-ssh/stable 1.2.10-1 armhf
network-manager-strongswan/stable 1.4.4-2 armhf
network-manager-vpnc-gnome/stable 1.2.6-2 armhf
network-manager-vpnc/stable 1.2.6-2 armhf
network-manager/stable,now 1.14.6-2+deb10u1 armhf [installed]
networkd-dispatcher/stable 2.0-2 all
networking-bagpipe-doc/stable 9.0.0-2 all
networking-bgpvpn-doc/stable 9.0.0-1 all
networking-mlnx-common/stable 1:13.1.0-2 all
networking-mlnx-eswitchd/stable 1:13.1.0-2 all