2021年1月2日土曜日

CentOS7(Raspberry Pi 3)に接続したHDDを自動停止する
Raspberry PiをNAS化して2TBのHDDで無停止運転を実現できたが、HDDを24時間365日無停止で作動させるのは、電気代や機器の劣化・障害が気になる。
無停止運転とは言え、実際に使うのは1日当たり1時間も満たないし。
そこで、今回は使用していない時間帯はHDDを動作停止することで、無駄な電気代を減らした上で、HDDを少しでも長持ちさせてみようと思う。

■本日の目標

Raspberry Pi 3に接続したHDDを未使用時間帯は自動停止する

■主な作業環境

・HW:Raspberry Pi 3 Model B
・OS:CentOS Linux release 7.9.2009 (AltArch)
・HDD:I-O DATA 2.0TB (HDC-LA2.0)

■参考サイト

・自動停止用のシェルスクリプトは下記サイトを参考にしました。
外付け USB HDD を spin down する

■スクリプト用意

・参考サイトより拝借

■スクリプトを格納する

・格納した後、実行権限を付与しておく。
$ ll /usr/local/bin/usbhdd_spindown.sh
-rwxr-xr-x. 1 root root 637 10月 28 21:50 /usr/local/bin/usbhdd_spindown.sh

■HDDのUnit名を確認する

・後ほどServiceの起動順序を指定するため、マウント中のHDDのユニット名を確認する。
 ※HDDは /mnt/usb-m2 と /mnt/usb-m3 の2ヶ所
$ systemctl list-units| grep -F .mount
-.mount loaded active mounted /
boot.mount loaded active mounted /boot
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
mnt-nas.mount loaded active mounted /mnt/nas
mnt-usb\x2dm1.mount loaded active mounted /mnt/usb-m1
mnt-usb\x2dm2.mount loaded active mounted /mnt/usb-m2
mnt-usb\x2dm3.mount loaded active mounted /mnt/usb-m3
run-user-0.mount loaded active mounted /run/user/0
sys-kernel-config.mount loaded active mounted Configuration File System
sys-kernel-debug.mount loaded active mounted Debug File System

■Serviceファイルを作成する

・ポイントは2つ。
 →実行コマンド(ExecStart):
  スクリプトに引数(HDDを停止するまでの時間[s])を渡す
 →実行順序(After):
  /mnt/usb-m2 と /mnt/usb-m3 のマウント完了後に起動する
$ touch /etc/systemd/system/usbhdd_spindown.service
$ chmod 755 /etc/systemd/system/usbhdd_spindown.service
$ cat /etc/systemd/system/usbhdd_spindown.service
[Unit]
Description=hdd spindown by sdparm
After=mnt-usb\x2dm2.mount mnt-usb\x2dm3.mount

[Service]
ExecStart=/usr/local/bin/usbhdd_spindown.sh sdb 900 2>&1 | logger -t usbhdd_spindown &
KillMode=process
Type=simple
Restart=no

[Install]
WantedBy=multi-user.target

■Serviceを有効化&開始する

・ここからはServiceの有効化&起動のお作法。
$ systemctl enable usbhdd_spindown
$ systemctl start usbhdd_spindown
$ systemctl status usbhdd_spindown
● usbhdd_spindown.service - hdd spindown by sdparm
  Loaded: loaded (/etc/systemd/system/usbhdd_spindown.service; enabled; vendor preset: disabled)
  Active: active (running) since 日 2017-10-29 08:35:34 JST; 2min 12s ago
 Main PID: 10585 (usbhdd_spindown)
  CGroup: /system.slice/usbhdd_spindown.service
  tq10585 /bin/sh /usr/local/bin/usbhdd_spindown.sh sdb 900 2>&1 | logger -t usbhdd_spindown &
  mq10618 sleep 10

10月 29 08:35:34 WSTD-RPI3 systemd[1]: Started hdd spindown by sdparm.
10月 29 08:35:34 WSTD-RPI3 systemd[1]: Starting hdd spindown by sdparm...
10月 29 08:35:44 WSTD-RPI3 usbhdd_spindown.sh[10585]: drive is up: /dev/sdb
10月 29 08:37:04 WSTD-RPI3 usbhdd_spindown.sh[10585]: drive is up: /dev/sdb

■自動停止の状況を確認する

・今回は「900秒=15分」で設定したが、実際の処理状況を確認してみる。
$ systemctl status usbhdd_spindown
● usbhdd_spindown.service - hdd spindown by sdparm
   Loaded: loaded (/etc/systemd/system/usbhdd_spindown.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 1970-01-01 09:00:15 JST; 51 years 0 months ago
Main PID: 276 (usbhdd_spindown)
   CGroup: /system.slice/usbhdd_spindown.service
           tq  276 /bin/sh /usr/local/bin/usbhdd_spindown.sh sdb 900 2>&1 | logger -t usbhdd_spindown &
           mq20375 sleep 10

1月 02 12:27:57 WSTD-RPI3 usbhdd_spindown.sh[276]: drive is up: /dev/sdb
1月 02 12:43:09 WSTD-RPI3 usbhdd_spindown.sh[276]: spin-down: /dev/sdb
1月 02 12:43:09 WSTD-RPI3 usbhdd_spindown.sh[276]: /dev/sdb: I-O DATA  HDCL-UT  5112
1月 02 12:45:09 WSTD-RPI3 usbhdd_spindown.sh[276]: drive is up: /dev/sdb
1月 02 13:00:21 WSTD-RPI3 usbhdd_spindown.sh[276]: spin-down: /dev/sdb
1月 02 13:00:22 WSTD-RPI3 usbhdd_spindown.sh[276]: /dev/sdb: I-O DATA  HDCL-UT  5112
1月 02 14:03:39 WSTD-RPI3 usbhdd_spindown.sh[276]: drive is up: /dev/sdb
ログには、
 停止:spin-down
 再開:drive is up
で出力される。
NAS(HDD)にアクセスすると再開し、アクセスが無いと15分後に停止している。
実際にHDD本体を見てみると、ランプが点灯→消灯していたため、うまく導入できたようだ。

2017年5月22日月曜日

CentOS7(Raspberry Pi 3)でNASサーバを構築する
Raspberry Pi 3にUSBメモリをマウントしたので、
今度はNAS化して他のPCからアクセスできるようにしたい。


■本日の目標

 Raspberry Pi 3に差したUSBメモリをNAS化する。


■主な作業環境

・HW:Raspberry Pi 3 Model B
・OS:CentOS Linux release 7.3.1611 (Core)
・USBメモリ:64GB
・主にアクセスするPC(OS):Windows10 Pro 64bit


■今回のNAS構築要件

1.NASアクセス用ユーザを用意(ユーザ名:rpi-nas)
2.ローカルネットワーク内からのみアクセス
3.アクセス元端末はWindowsとAndroid
4.NASで公開するディレクトリは先日マウントしたUSBメモリ
5.プリンター共有は無し

 ちなみにNASに使うのはこちら。
$ df -hT | grep usb
/dev/sda1                ext4        58G   53M   55G    1% /mnt/usb-m1


■Sambaをインストール

・まずはSambaをインストールする。
$ yum info samba
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
利用可能なパッケージ
名前                : samba
アーキテクチャー    : armv7hl
バージョン          : 4.4.4
リリース            : 12.el7
容量                : 583 k
リポジトリー        : updates/7/armhfp
要約                : Server and Client software to interoperate with Windows machines
URL                 : http://www.samba.org/
ライセンス          : GPLv3+ and LGPLv3+
説明                : Samba is the standard Windows interoperability suite of programs for Linux and
                    : Unix.
$ yum install samba
・・・(中略)・・・
完了しました!

・インストール後のサービス状態を確認する。
[root@WSTD-RPI3 /]# systemctl status smb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)


■ユーザを追加

・Linuxアカウントの追加
 グループの作成
$ groupadd -g 500 nas-user

 ユーザアカウントの作成
$ useradd -g 500 rpi-nas

 パスワード設定
$ passwd rpi-nas

 ユーザとグループの紐付け
$ gpasswd -a rpi-nas nas-user
ユーザ rpi-nas をグループ nas-user に追加

・Sambaアカウントの追加
 ユーザアカウントの作成
$ pdbedit -a rpi-nas
new password:
retype new password:

 作成したユーザの確認
 (ユーザリスト)
$ pdbedit -L
 (個別ユーザの詳細)
$ pdbedit -v rpi-nas


■Sambaの設定

・Sambaの設定ファイルを書き換える。
 【変更前(初期状態)】
$ cat /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = root
        create mask = 0664
        directory mask = 0775

 【編集】
$ cp -p /etc/samba/smb.conf /etc/samba/smb.conf.`date "+%Y%m%d"`
$ vi /etc/samba/smb.conf

 【変更後】
$ cat /etc/samba/smb.conf
### Sambaの基本設定 ###
[global]
  ## ユーザアクセス管理
  # ユーザ認証方式
  security = user
  # アクセスOKネットワーク
  hosts allow = 192.168. 127.
  # アクセスNGネットワーク
  hosts deny = ALL

  ## サーバ情報
  # ワークグループ
  workgroup = WORKGROUP
  # NetBIOS名
  netbios name = RSPI-NAS
  # Windows側の文字コード
  dos charset = CP932
  # Linux側の文字コード
  unix charset = UTF-8
  # 以下、Windows側のファイル設定
  dos filemode = Yes
  dos filetimes = Yes
  dos filetime resolution = Yes
  # LinuxとSambaのパスワードを同期(次も同じ)
  unix password sync = Yes
  pam password change = Yes

  ## ログ設定
  log file = /var/log/samba/%m.log
  max log size = 50

### 共有ディレクトリ:USBメモリ ###
[usb-m1]
  comment = USB Memory Directory
  # 公開パス
  path = /mnt/usb-m1
  # ゲスト不可
  guest ok = No
  # 共有表示
  browseable = Yes
  # 読み取り専用
  read only = no

 設定ファイルの内容に誤りが無いかチェックする。
$ testparm /etc/samba/smb.conf
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[usb-m1]"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
        dos charset = CP932
        netbios name = RSPI-NAS
        log file = /var/log/samba/%m.log
        max log size = 50
        pam password change = Yes
        security = USER
        unix password sync = Yes
        idmap config * : backend = tdb
        dos filemode = Yes
        dos filetime resolution = Yes
        hosts allow = 192.168. 127.
        hosts deny = ALL


[usb-m1]
        comment = USB Memory Directory
        path = /mnt/usb-m1
        read only = No


■NAS公開ディレクトリの所有権を変更

・USBメモリをマウントしたディレクトリはrootで作っていたので、所有権を変えておく。
 【変更前】
$ ll /mnt/
合計 4
drwxrwxrwx. 12 root root    0  5月  9 22:31 nas
drwxr-xr-x.  3 root root 4096  5月  7 19:50 usb-m1

 【変更】
$ chown -R rpi-nas:nas-user /mnt/usb-m1/

 【変更後】
$ ll /mnt/
合計 4
drwxrwxrwx. 12 root    root        0  5月  9 22:31 nas
drwxr-xr-x.  3 rpi-nas nas-user 4096  5月  7 19:50 usb-m1


■ファイアウォール(firewalld)の設定 ※一時設定

・次はファイアウォールでSambaを許可する。
 【設定前】
$ firewall-cmd --list-services
dhcpv6-client ssh

 【設定】
$ firewall-cmd --add-service samba
success

 【設定後】
$ firewall-cmd --list-services
dhcpv6-client samba ssh


■Sambaの起動

・Sambaを起動する。
$ systemctl start smb
$ systemctl status smb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2017-05-13 13:17:37 JST; 6min ago
 Main PID: 3505 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
           tq3505 /usr/sbin/smbd
           tq3506 /usr/sbin/smbd
           tq3507 /usr/sbin/smbd
           tq3508 /usr/sbin/smbd
           mq3525 /usr/sbin/smbd

 5月 13 13:17:35 WSTD-RPI3 systemd[1]: Starting Samba SMB Daemon...
 5月 13 13:17:36 WSTD-RPI3 systemd[1]: smb.service: Supervising process 3505 which is not our child. We'll most likely not notice when it exits.
 5月 13 13:17:37 WSTD-RPI3 smbd[3505]: [2017/05/13 13:17:37.973496,  0] ../lib/util/become_daemon.c:124(daemon_ready)
 5月 13 13:17:37 WSTD-RPI3 smbd[3505]:   STATUS=daemon 'smbd' finished starting up and ready to serve connections
 5月 13 13:17:37 WSTD-RPI3 systemd[1]: Started Samba SMB Daemon.

・有効化して、自動起動にする。
$ systemctl enable smb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.


■NASアクセス確認(Windows)

・Windows(エクスプローラ)から確認してみる。
 IP指定で・・・

 資格情報が出てきたので、疎通は問題なし。
 それでは、NAS用のユーザとパスワードを入力する。

 NASディレクトリとして指定した「usb-m1」だけ出てきた。

 アクセスも問題なし。

・次はNAS専用ユーザのアクセスや読み書き確認のため、コマンドプロンプトから確認する。
 rootでアクセスできないことを確認する。
C:\>net use Y: \\192.168.1.100\usb-m1 XXXX /USER:root
システム エラー 1326 が発生しました。

ユーザー名またはパスワードが正しくありません。

 もちろんrpi-nasではアクセスできることを確認する。
C:\>net use Y: \\192.168.1.100\usb-m1 YYYY /USER:rpi-nas
コマンドは正常に終了しました。

 一応セッションも確認しておく。
C:\>net use
新しい接続は記憶されます。

ステータス  ローカル名 リモート名                ネットワーク名
-------------------------------------------------------------------------------
OK           Y:        \\192.168.1.100\usb-m1    Microsoft Windows Network
コマンドは正常に終了しました。

 ドライブを移動する。
C:\>y:
Y:\>

 ファイルを書き込む。
Y:\>echo NASアクセステスト > Nasアクセスの確認.txt
Y:\>dir
 ドライブ Y のボリューム ラベルは usb-m1 です
 ボリューム シリアル番号は E3F2-4B80 です

 Y:\ のディレクトリ

2017/05/13  14:27              .
2017/05/07  19:39              ..
2017/05/13  14:27                22 Nasアクセスの確認.txt
2017/05/07  19:44              lost+found
               1 個のファイル                  22 バイト
               3 個のディレクトリ  58,826,170,368 バイトの空き領域

 ファイル内容を読み込む。
Y:\>type Nasアクセスの確認.txt
NASアクセステスト

 ファイルを削除する。
Y:\>del Nasアクセスの確認.txt
Y:\>d

 一通りの操作は確認できた。


■NASアクセス確認(Android)

・ネットワーク内をスキャンすると、Raspberry PiのNAS(192.168.1.100)が出てきた。
 ※ESファイルエクスプローラを使用

 ユーザ・パスワードを入力する。

 Androidからも問題なくアクセスできた。


■ファイアウォール(firewalld)の設定 ※永続化

・永続化しておき、再起動してもSambaが許可されるようにする。
$ firewall-cmd --add-service samba --permanent
success


■SELinux(参考)

・SELinuxはファイルアクセスに影響を与えるようだが、
 今回のRaspberry Pi 3に載せたCentOS7からでは、
 特別な設定(SELinuxでSambaを許可したり、そもそもSELinuxを無効化したり)は不要だった。
 参考までに現状を以下の通り。
 【動作状況】
$ getenforce
Permissive

 【設定ファイル(初期状態)】
$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted



2017年5月17日水曜日

CentOS7(Raspberry Pi 3)にNASをマウントする
LinkStation LS-VLの代替として
当時行き着いた先のUSBメモリ(苦笑)のNASをRaspberry Pi 3にマウントしてみる。
また、自動マウントすることで毎回手動マウントしないようにする。


■本日の目標

・無線LANルータで簡易NAS化したUSBメモリをマウントする。


■主な作業環境

・HW:Raspberry Pi 3 Model B
・OS:CentOS Linux release 7.3.1611 (Core)
・NAS:無線LANルータに刺したUSBメモリ(32GB)
    ⇒フォーマット:XFS


■NASをマウント(NFSタイプ:CIFS)

・まずはマウント先のディレクトリを作成する
$ mkdir /mnt/nas
$ ll /mnt/nas/
合計 0

・次はマウント先のディレクトリを調べる
 ※NAS(無線LANルータ)のIPアドレスがわかっていることが前提
$ smbclient -L 192.168.1.5 -U%
Domain=[XXXX] OS=[Unix] Server=[Samba 3.0.24-1.35_OSSTECH]

        Sharename       Type      Comment
        ---------       ----      -------
        disk1_pt1       Disk      auto-mount (disk1/part1)
        IPC$            IPC       IPC Service ()
・・・(以下、略)・・・

 disk1_pt1がマウントしたいディレクトリであることがわかった。

・続いてマウント
$ mount -t cifs //192.168.1.5/disk1_pt1 /mnt/nas -o username=XXXX
Password for XXXX@//192.168.1.5/disk1_pt1:
$ ll /mnt/nas/
合計 4096
drwxrwxrwx.   2 65534 65534     0 10月 29  2016 apps
drwxrwxrwx.   6 65534 65534     0  1月 16 21:56 document
drwxrwxrwx.   2 65534 65534     0  4月 23  2016 movie
drwxrwxrwx. 172 65534 65534     0  8月  9  2016 music
drwxrwxrwx.   3 65534 65534     0  7月  6  2015 photo

・ちなみにアンマウントする場合は次のコマンドで。
$ umount /mnt/nas


最後に自動マウントの設定を行う。


■/etc/fstabを設定する

・マウント設定前にファイルシステムの情報を取得する。
$ df -hT
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/root      ext4        13G  1.2G   11G   10% /
・・・(以下、略)・・・

・/etc/fstab ファイルにマウント情報を追記する。
$ echo '//192.168.1.5/disk1_pt1 /mnt/nas cifs username=XXXX,password=XXXX' >> /etc/fstab
$ cat /etc/fstab
#Generated by RootFS Build Factory
・・・(中略)・・・
//192.168.1.5/disk1_pt1 /mnt/nas cifs username=XXXX,password=XXXX

・マウントを実行する。
$ mount -a

・マウント結果を確認する。
$ df -hT
ファイルシス            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/root               ext4        13G  1.2G   11G   10% /
・・・(中略)・・・
//192.168.1.5/disk1_pt1 cifs        31G   24G  6.6G   79% /mnt/nas

・NASのディレクトリ詳細が参照できればOK。
$ ls -l /mnt/nas
合計 4096
drwxrwxrwx.   2 65534 65534     0 10月 29  2016 apps
drwxrwxrwx.   6 65534 65534     0  1月 16 21:56 document
drwxrwxrwx.   2 65534 65534     0  4月 23  2016 movie
drwxrwxrwx. 172 65534 65534     0  8月  9  2016 music
drwxrwxrwx.   3 65534 65534     0  7月  6  2015 photo

・最後に再起動して、マウントが維持されていることを確認する。
$ reboot


■残課題

・自動マウントには「/etc/fstab」と「autofsサービス」の方法があるが、
 両者の違いを簡単に表現すると、
  /etc/fstab  :常時接続
  autofsサービス:随時接続
 となるだろうか。
 実行環境がRaspberry Pi 3となり、
 一般的なサーバと比較するとリソースを大量消費できないため、
 「autofsサービス」を使いたいところだったが、どうにも上手くマウントうまくできなかった。
 サービスは問題なく起動していた(/var/log/messagesにもエラー無し)ので、後日もう少し調査してみたい。