あなたの次のNASは、NASではありません

📢 この記事は Gemini-2.5-pro によって翻訳されました 

はじめに

遡ること 2022年、僕がLinuxをいじっていた頃(中国語簡体字) 、NASを構築するのに必ずしも専用システムにお金を払う必要はない、という話をした。

それから現在、サーバーをいじくり回す中で、クラウドストレージのマウント速度がどうにもイマイチだ。そんなフラストレーションから、衝動的にN5095マザーボードをポチってしまった。手持ちの4Gメモリは少し心許ないが、これ以上出費を増やしたくもない。

こうして、僕は再び「サーバーいじり」の旅に出ることにした。

技術選定

まずはシステム。この低スペック構成なら、当然最軽量のAlpine Linuxを選ぶ。

次にインストール方法。 WEPE との互換性を考慮し、 Ventoy をメインブートにしてシステムをインストールする。

サービスのデプロイはDockerを使い、ホストOSのクリーンさと再現性を担保する。

使用するサービス:

検討したけど使わなかったサービス:

ファイル構成

各サービス用ディレクトリの配置は、僕のいつものスタイルだ。サービスごとにフォルダを分け、/home配下に置く。

HDDはすべて/mnt配下にマウントする。これは一般的なやり方だろう。

mount –bind(バインドマウント)を使い、HDD上の対応するファイルを、各サービスが参照する場所(パス)にマッピングする。

pic

システムインストール

公式サイトでAlpine Linuxをダウンロード し、VentoyをインストールしたUSBメモリに入れる。マザーボードのBIOSでUSBメモリから起動するよう設定し、Ventoyの画面でAlpine Linuxを選んで起動する。

ロードが完了したら、ユーザーrootでログイン(パスワード不要)。ログイン後、インストールコマンドを叩く。

1
setup-alpine

あとはガイドに従って設定を完了させればOK。

公式ドキュメント: setup-alpine - Alpine Linux

公開鍵認証でのログイン

NAS関連の設定ファイル ~/.ssh/authorized_keys を編集する。まず設定フォルダを作成。

1
mkdir .ssh

フォルダに移動。

1
cd .ssh

自分の公開鍵を貼り付ける。

1
vi authorized_keys

(自分の公開鍵は %USERPROFILE%\.ssh にある)

公開鍵認証を有効にする。

1
vi /etc/ssh/sshd_config

41行目あたりにあるコメントを外し、以下のように変更。

1
PubkeyAuthentication yes

コミュニティリポジトリの有効化

リポジトリファイルを開く。

1
vi /etc/apk/repositories

コメントアウト(#)を外し、communityを使えるようにする。

1
2
3
#/media/dm-0/apks
http://dl-cdn.alpinelinux.org/alpine/v3.22/main
http://dl-cdn.alpinelinux.org/alpine/v3.22/community

Dockerのインストール

パッケージを更新。

1
apk update

Dockerをインストール。

1
apk add docker docker-cli-compose

自動起動を設定。

1
rc-update add docker default

Dockerを起動。

1
service docker start

起動確認。

1
docker ps

swapの追加

サーバーのイメージにデフォルトでswapがなかったので追加した。が、後で確認したらデフォルトで追加されていた。必要に応じて判断すればOK。

スワップファイルを作成。

1
fallocate -l 8G /swapfile

パーミッションをrootのみに設定。

1
chmod 600 /swapfile

swapとしてフォーマット。

1
mkswap /swapfile

swapを有効化。

1
swapon /swapfile

有効化されたか確認。

1
free -h

ハードディスクのマウント

すべてのブロックデバイスを確認。

1
fdisk -l

NTFSのサポートをインストール。

1
apk add ntfs-3g

マウントポイント(フォルダ)を作成。

1
mkdir /mnt/hc550

マウントする。

1
mount -t ntfs-3g /dev/sdc1 /mnt/hc550

アンマウントは2通りの方法がある。パス指定(推奨):

1
umount /mnt/hc550

またはデバイス指定:

1
umount /dev/sdc1

自動マウント

再起動後にデバイス名(sdc1など)が変わっても大丈夫なように、パーティションのUUIDを取得する。

1
blkid

/etc/fstabを編集。

1
vi /etc/fstab

設定を追記。

1
2
# <デバイスUUID>  <マウントポイント> <ファイルシステム> <オプション>                  <dump> <pass>
UUID=xxxxxxxx   /mnt/hc550     ntfs-3g      defaults,uid=1000,gid=1000 0 0

設定が正しいかテストする。まずアンマウント。

1
umount /dev/sdc1

fstabの設定をすべて読み込んでマウント。

1
mount -a

マウントが成功したか確認。

1
ls /mnt/hc550

SMB共有

Sambaを使って共有すれば、WindowsにHDDをマウントして、ローカルドライブのようにファイルを操作できる。

/home/sambaに docker-compose.yml を作成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: '3.1'
services:
  samba:
    image: 'ghcr.io/crazy-max/samba:latest'
    container_name: samba
    network_mode: host
    volumes:
      - '/home/samba/data:/data'
      - '/mnt/hdd4t:/mount/hdd4t'
      - '/mnt/hc550:/mount/hc550'
    environment:
      - 'TZ=Japan/Tokyo'
      - 'SAMBA_LOG_LEVEL=0'
    restart: always

Sambaの設定ファイル config.yml を編集。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
auth:
  - user: yexca
    group: yexca
    uid: 1000
    gid: 1000
    password: passwd

global:
  - "force user = yexca"
  - "force group = yexca"

share:
  - name: HDD4TB
    comment: hdd4t
    path: /mount/hdd4t
    browsable: yes
    readonly: no
    guestok: no
    veto: no
    validusers: yexca
    writelist: yexca
    recycle: yes
  - name: HC550
    comment: hc550
    path: /mount/hc550
    browsable: yes
    readonly: no
    guestok: no
    veto: no
    validusers: yexca
    writelist: yexca
    recycle: yes

Windowsでネットワークドライブとしてマウント

Win + Rでcmdを開き、コマンドを入力。

1
net use Z: \\alpine-nas\HDD4TB /user:yexca passwd /persistent:yes

エクスプローラーをリフレッシュ。

1
explorer.exe Z:

もちろん、エクスプローラーのGUI(「ネットワーク ドライブの割り当て」)から追加してもOK。

バインドマウント

シンボリックリンクと比べて、バインドマウント(Bind Mount)はDockerコンテナとの互換性が良い。

1
mount --bind /mnt/hc550/anime /anime

OS起動時に自動でバインドマウントするには、/etc/fstabに書き込む必要がある。この時、必ず(HDD自体の)マウント設定より下に書くこと(ファイルが上から順に実行されるため)。

1
2
/mnt/hc550/anime   /tmp/anime   none   bind   0 0
/mnt/hc550/comic   /tmp/comic   none   bind   0 0

確認。

1
df -h

その他のサービス

他のサービスについては、以前の記事で結構書いた気がするので、ここでは割愛する。

関連記事(中国語簡体字):

カスタムドメイン

ここではOpenWRTルーターのDNSリダイレクト(DNSハイジャック)機能を使い、特定のドメイン(例: emby.nasなど)にアクセスすると、自分のNASのサービスに繋がるようにする。

前提条件として、PCやスマホなどのデバイスのDNSサーバーがルーターになっている必要がある。その上で、ルーターのDHCP/DNS設定で、NASに静的IPを割り当て、さらにドメインハイジャック設定で、使いたいドメインをすべてNASのIPアドレスに向ける。

Nginx-UI

カスタムドメインを有効にするには、NginxでNAS上の各サービスをリバースプロキシする必要がある。

Docker Compose設定ファイル:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: '3.1' 
services: 
  nginx-ui:
    image: uozi/nginx-ui:v2.2.0-patch.1
    container_name: nginx_UI
    volumes:
      - /home/nginxUI/nginx:/etc/nginx
      - /home/nginxUI/nginx-ui:/etc/nginx-ui
      - /home/nginxUI/www:/www
    environment:
      - NGINX_UI_IGNORE_DOCKER_SOCKET=true
    ports:
      - 80:80
      - 443:443
    restart: always

コンテナから別のコンテナ(のホストOSポート)にアクセスする際のブリッジIPは 172.17.0.1 になる。

つまり、もしホストの8888ポートにマッピングされたサービス(例: Emby)がある場合、リバースプロキシで設定するプロキシ先アドレスは 127.0.0.1:8888 ではなく 172.17.0.1:8888 になる。

(なぜ環境変数を設定するのかは、 2025 新サーバー構築記録#Nginx-UIのインストール(中国語簡体字) を参照)

最後に

我ながら、2022年の自分が言っていたことを、ようやく実現できたかな、と思う。

このわずか3年間、主観的には自分は何も変わっていないつもりだった。でも、昔の自分の記事を読み返して、当時その文章を書いていた時の心境を思い出すと、自分の思考が天と地ほど変わってしまったことを実感する。

正直、当時はTrue NASのような専用システムを使うことばかり考えていた。

でも、いざ自分がそれを実現する時、昔の自分では考えもしなかった「ゼロから構築する」という方法を選び、過去の記事を見ながら一つ一つ組み上げていく。このプロセスで、「価値」というものを確かに感じ取ることができた。

「いじる」は終わらない、この熱意も止まらない。

yexca-261

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。