2019年12月3日火曜日

raspberry pi : アクセスの無いときに USB HDD を スピンダウンさせる

目的:

USB HDD に一定期間アクセスが無いときに スピンダウンさせる。

手順:

  1.  スピンダウン用のソフトウェアをインストールする。(2種)
    $ sudo apt install sdparm
    $ sudo apt install hdparm
  2. どちらのコマンドでスピンダウンするか確認する。
    $ sudo sdparm -r --command=stop /dev/sda1
    $ sudo hdparm -y /dev/sda1
    のどちらでスピンダウンするか確認する。
    sdparm : スピンダウンし、LED 消灯。
         ただし、しばらくすると LED点灯。スピンアップは無し。
    hdparm : スピンダウンするが、LED点灯。
    当初、どちらもスピンダウンせず、何回か試したりしている内、スピンダウンする様になっていた。 原因は不明。
  3. スピンダウンのコマンドを常駐化させる。
    (1) スクリプトファイルを作成する。
    下記の内容のスクリプトファイルを /root/hdd_spindown.sh で作成し、
    /root/hdd_spindown.shのパーミッションを700に変更する。

    $ sudo vi /root/hdd_spindown.sh
    #!/bin/sh
     
    if [ $# -lt 2 ]; then
            echo "not enough arguments supplied."
            echo "hdd_spindown.sh [UUID] [INTERVAL]"
            exit 0
    fi
     
    disk=`findfs UUID="$1"`
    interval=$2
     
    count=$interval
    up=1
     
    if [ -z $disk ]; then
            #echo "findfs error"
            exit 1
    fi
     
    disk=`echo "$disk" |sed -e "s@/dev/@@"`
     
    state=`grep " $disk " /proc/diskstats`
     
    while [ true ]; do
            sleep 10
            count=$(($count-10))
            newstate=`grep " $disk " /proc/diskstats`
            if [ "$state" = "$newstate" ]; then
                    if [ $count -lt 0 ]; then
                            count=$interval
                            if [ $up = 1 ]; then
                                    #echo -e "spin-down"
                                    sync
                                    state=`grep " $disk " /proc/diskstats`
    
    #次のどちらかを記述
    # hdparmを利用するとき
    #                               hdparm -y /dev/$disk > /dev/null 2>&1
    # sdparmを利用するとき
                                    sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
    
                                    up=0
                            fi
                    fi
            else
                    #echo -e "drive is up"
                    count=$interval
                    state="$newstate"
                    up=1
            fi
    done
    

    $ sudo chmod 700 /root/hdd_spindown.sh

    (2) マウントされている対象のデバイスのUnit名を確認する
    $ systemctl list-units| grep -F .mount
    実行例
    ~ $ 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-hdd1.mount                                                                                                                                     loaded active mounted   /mnt/hdd1                                                                            
      run-rpc_pipefs.mount                                                                                                                               loaded active mounted   RPC Pipe File System                                                                 
      run-user-1001.mount                                                                                                                                loaded active mounted   /run/user/1001                                                                       
      sys-kernel-config.mount                                                                                                                            loaded active mounted   Kernel Configuration File System                                                     
      sys-kernel-debug.mount                                                                                                                             loaded active mounted   Kernel Debug File System                                                             
    
    対象デバイスのUnit名は mnt-hdd1.mount

    (3) /etc/systemd/system/user_hdd1_spindown.service を下記の内容で作成
      ( Unit名, UUID, スピンダウンまでの時間 を 変更すること。)
    $ sudo vi /etc/systemd/system/user_hdd1_spindown.service
    [Unit]
    Description=hdd spindown by sdparm
    After=(先ほど、確認したUnit名)
     
    [Service]
    ExecStart=/root/hdd_spindown.sh (USBHDDのUUID) (直近のアクセスからスピンダウンまでの時間(秒)) > /dev/null 2>&1
    KillMode=process
    Type=simple
    Restart=no
     
    [Install]
    WantedBy=multi-user.target
    

    記述例
    [Unit]
    Description=hdd spindown by sdparm
    After=mnt-hdd1.mount
    
    [Service]
    ExecStart=/root/hdd_spindown.sh d67444b3-b379-42ce-9c41-d97d60b698db 300 > /dev/null 2>&1
    KillMode=process
    Type=simple
    Restart=no
    
    [Install]
    WantedBy=multi-user.target
    

    (4) スクリプトが起動時に動作するように設定
    $ sudo systemctl enable user_hdd1_spindown.service
     
  4. リブート後、スクリプト(サービス) の状態を確認する。
    $ sudo reboot
    $ sudo systemctl status user_hdd1_spindown.service
参考 :
  8.USBHDDの定期的なスピンダウン方法 – RaspberryPiで各種サーバー作り! – ある阪大生の物置小屋

0 件のコメント:

コメントを投稿