白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

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

WindowsマシンのネットワークにSambaのサーバを表示させる - 白猫のメモ帳
前回の続きです。(続きじゃないかな…?)

参考にさせていただきました。
kinsta.com
qiita.com

前回まででNASとしての機能の準備ができたので、今度はもろもろのアプリケーションを引っ越していきます。
直接インストールしていったりしてももちろん良いのですが、せっかくなのでDockerを使って構築してみることにします。
なんか間違えたりしたときも変なゴミを残したりせずにやりなおしが簡単だし、環境の再構築もしやすいのがGoodです。

インストール

まずは前準備。

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

前回のwsddと同じようにaptの取得先を追加、証明書を登録してからインストールです。

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ 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
$ sudo apt install docker-ce docker-ce-cli containerd.io

サクッと終わります。

sudoなしでdockerコマンドが叩きたい

デフォルトだとsudoをつけないとdockerコマンドが叩けませんのでちょっとごにょごにょします。
dockerのユーザグループにユーザを追加。

$ sudo gpasswd -a shironeko docker
$ getent group docker
docker:x:999:shironeko

ちなみにグループへの追加はこれでもできる。
aオプションつけ忘れると既存のグループが外れたりするのが怖い。

$ sudo usermod -aG shironeko docker

一旦ログアウトしてから再度ログインするとsudoなしでdockerコマンドが叩けるようになっています。
ちなみにこの一旦ログアウトっていうのがポイントで、Dockerfileでグループをごにょごにょしようとするとハマったりします。

とりあえずなんか動かしてみる

まだなにもないです。

$ docker ps
CONTAINER ID   IMAGE   COMMAND    CREATED    STATUS    PORTS    NAMES

とりあえずhellow-world。
docker pullでイメージ取ってこれるけど、いきなりrunしても勝手にダウンロードしてくれて親切。

$ docker run hello-world

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

Docker Composeもちゃんとある。

$ docker compose version
Docker Compose version v2.16.0

これでDockerの準備ができました。
次はコンテナを使ってMySQLとかnginxとかを構築していきます。

WindowsマシンのネットワークにSambaのサーバを表示させる

UbuntuにSambaをインストールしてNAS化する - 白猫のメモ帳
前回の続きです。

Sambaの設定をしたのでWindowsからUbuntuのフォルダが見られるようになったのですが、Windows側のネットワークのところに対象のサーバが出てきません。
IPアドレスやホスト名を入れてのアクセスはできているのに不思議です。

参考にさせていただきました。
pcvogel.sarakura.net
qiita.com

wsddをインストール

色々調べていたらWindows側でSMB1.0を有効にするといいよみたいなことも書いてあったのですが、わざわざ無効になっている古い機能を有効にするのも何かなと思ったのでWeb Service Discoveryに対応させる方向で行きます。
wsddを使わせてもらいます。

wsdd implements a Web Service Discovery host daemon. This enables (Samba) hosts, like your local NAS device, to be found by Web Service Discovery Clients like Windows.

まずrootにsuした上で以下のコマンドを叩きます。
なんでsudoじゃないっていうとsudoはリダイレクトに効かないので権限がないよと言われてしまいます。
(まぁいろいろ技はあると思うのですが、rootになれるので面倒なことはせずにこれで)

$ sudo su -
# echo deb https://pkg.ltec.ch/public/ $(lsb_release -cs) main > /etc/apt/sources.list.d/wsdd.list
# exit

rootから戻って続き。
やってることはaptの取得先を追加、証明書を登録してからインストールという流れ。
最初からなんでもaptでとれるわけじゃないんですね。

$ sudo apt-key adv --fetch-keys https://pkg.ltec.ch/public/conf/ltec-ag.gpg.key
$ sudo apt update
$ sudo apt install wsdd
$ sudo systemctl enable wsdd

あとからよく見たら公式のGitHubにオフィシャルに入ったよって書いてありました。
Ubuntu 22.04 LTS以上はいきなりapt installでよかったみたい。あらら。

Starting from Ubuntu 22.04 LTS (Jammy Jellyfish), wsdd has landed in the official universe package repository. Thus, it is sufficient to install it via

ユニットファイルの編集

wsdd.serviceをsmbd.service(Samba)より後に起動したいのでおまじないを書きます。

$ sudo vi /lib/systemd/system/wsdd.service

こっちでもいいけどnanoのエディタで開いてしまったので上のコマンドで…。

$ sudo systemctl edit --full wsdd.service

AfterとWantsに追加。

[Unit]
Description=Web Services Dynamic Discovery host daemon
Documentation=man:wsdd(8)
; Start after the network has been configured
After=network-online.target smbd.service
Wants=network-online.target smbd.service

[Service]
Type=simple
; The service is put into an empty runtime directory chroot,
; i.e. the runtime directory which usually resides under /run
EnvironmentFile=/etc/default/wsdd
ExecStart=/usr/sbin/wsdd --shortlog --chroot=/run/wsdd $WSDD_PARAMS
DynamicUser=yes
User=wsdd
Group=wsdd
RuntimeDirectory=wsdd
AmbientCapabilities=CAP_SYS_CHROOT

[Install]
WantedBy=multi-user.target

ファイアウォールは3702/udpと5357/tcpを開ける。

sudo ufw allow 3702/udp
sudo ufw allow 5357/tcp


見えるようになりました。
やったね。
次回はDockerのインストールをします。

UbuntuにSambaをインストールしてNAS化する

自宅のサーバをWindowsからLinuxに乗り換えるよ - 白猫のメモ帳
前回の続きです。

LinuxWindowsでファイルのやり取りをするのと、NASとしての役割を果たすためにSambaの設定をします。

前回SSHの設定をしたので、TeraTermなどの任意のターミナルからログインできているはず。
うちにはモニタが1枚しかないので、切り替えながらやるのは面倒なのでここからは基本ずっとCUIです。
(じゃあGUIなくてもよかったんじゃないのとかいう無粋なことは言わない)

参考にさせていただきました。
tamnology.com
self-development.info

Sambaのインストール

まずインストール。Linuxはインストール楽でいいですね。

$ sudo apt install samba

UbuntuのログインユーザをSambaにも追加。(設定ファイルそのままならパスワードも同期される)

$ pdbedit -a shironeko

ファイアウォールにSambaを許可。

$ sudo ufw allow samba

共有ディレクトリを作ってみる

とりあえずディレクトリ作成。

$ sudo mkdir /home/share
$ sudo chmod 777 /home/share

Sambaの設定ファイルを編集(関係ないけどVimの使い方わからなくて意味もなくわたわたするという)

$ sudo vi /etc/samba/smb.conf

以下を末尾に追加して保存。

[share]
path = /home/share/
browsable = yes
writable = yes
guest ok = no
read only = no

Windowsのマシンから見えるか確認。
この時点でネットワークのところにコンピュータは見えないのでサーバ名直打ちで。
これについては次回。

はい、これでWindows側からもディレクトリが見れるようになりました。
対象を増やしたいときはsmb.confの編集でできます。

WindowsのHDDをマウントする

NAS化したいので、NTFSフォーマットされた外付けHDDを繋げます。
とりあえずUSBで接続すると認識はされる。(sdaはOSが入っているディスク)

$ sudo fdisk -l
~略~
デバイス     開始位置   最後から     セクタ サイズ タイプ
/dev/sdb1          64 7807340263 7807340200   3.6T Microsoft 基本データ
/dev/sdb2  7807340264 7810688743    3348480   1.6G Microsoft 基本データ
/dev/sdb3  7810688744 7814037134    3348391   1.6G Microsoft 基本データ
~略~

マウント。/mntと/mediaどちらが良いんだろう?
/mntが一時的で/mediaが常時とか、/mntが手動で/mediaが自動とか…。
常時接続だけど手動のときはどっち…?とりあえず/mntにしておきます。

$ sudo mkdir /mnt/hdd1

試しに普通にmountコマンド叩いてみる。

$ sudo mount /dev/sdb1 /mnt/hdd1
The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Falling back to read-only mount because the NTFS partition is in an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or fast restarting.)
Could not mount read-write, trying read-only

あーなんか良くない感じっぽい。(雑)

ntfsfixをしたあとでもう一回マウントしたらうまくいったっぽい。

$ sudo ntfsfix /dev/sdb1
Mounting volume... The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sdb1 was processed successfully.
$ sudo mount /dev/sdb1 /mnt/hdd1

で、これをまたsmb.confに追加します。

[hdd1]
path = /mnt/hdd1/
browsable = yes
writable = yes
guest ok = no
read only = no

Windows側からも見えるようになりました。

これでNASとしてのお引越しが完了です。