LinuxでHDD自動マウントSCRIPT

#概要
今日はLinuxサーバにて外部HDDをマウントするSCRIPTについて紹介します。

#背景
いつも使っていた外部HDDを違うファイルシステムにFORMATして刺すとmountコマンドのコマンドを変更が必要です。
それを自動で検知してマウントするようなSCRIPTを作成したいなと思ってます。

#作業環境
SBC : tinkerboard
OS : Debian GNU/Linux 9

#事前確認
現在外部HDDがどんな状況であるか確認しましょう。
次のコマンドで確認ができます。

~~~bash
#全体のディスク情報を確認するコマンド
linaro@linaro-alip:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G  7.3G   49G  13% /
devtmpfs        988M     0  988M   0% /dev
tmpfs           997M  4.0K  997M   1% /dev/shm
tmpfs           997M   17M  980M   2% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           997M     0  997M   0% /sys/fs/cgroup
/dev/mmcblk0p7  4.9M  329K  4.3M   8% /boot
tmpfs           200M  8.0K  200M   1% /run/user/1000
/dev/sdb5       466G  320G  147G  69% /media/linaro/hdd1
tmpfs           200M     0  200M   0% /run/user/0

#外部HDDのみ表示するため、「sd」文字列でGrepしています。
#以下はOSが起動された後自動でマウントされたパスになります。
linaro@linaro-alip:~$ df -h |grep sd
/dev/sdb5       466G  320G  147G  69% /media/linaro/hdd1
linaro@linaro-alip:~$

#外部HDDは今二つを繋げているので、次のコマンドでも確認できます。
#この外部HDDはなぜか自動でマウントされていないです。
linaro@linaro-alip:~$ sudo  fdisk -l /dev/sda|grep /dev/sda | cut -c 1-10|tail -1
Partition 1 does not start on physical sector boundary.
/dev/sda2
#これは自動でマウントされているので、次のような表示になります。
linaro@linaro-alip:~$ sudo  fdisk -l /dev/sdb|grep /dev/sdb | cut -c 1-10|tail -1
/dev/sdb5
linaro@linaro-alip:~$
~~~

#自動SCRIPTソース
次の内容通りにコードを追加して保存します。

~~~bash
linaro@linaro-alip:~$ cat hdd.sh
#!/bin/sh
sudo df -h|grep sd > /home/linaro/df.txt
dfh=`wc -l /home/linaro/df.txt|cut -c 1`

if [ $(( dfh )) -le 1 ]; then
    echo "run"
    sudo  fdisk -l /dev/sda|grep /dev/sda | cut -c 1-10|tail -1 >/home/linaro/sda.txt
    sda=`tail -1 /home/linaro/sda.txt`
    sudo umount $sda

    sudo  fdisk -l /dev/sdb|grep /dev/sdb | cut -c 1-10|tail -1 >/home/linaro/sdb.txt
    sdb=`tail -1 /home/linaro/sdb.txt`
    sudo umount $sdb

    sudo mount -t ntfs $sda /home/linaro/mnt/sda1
    sudo mount -t ntfs $sdb /home/linaro/mnt/sdb1
else
    echo "not run"
fi
~~~

#実行
次のコマンドで実行します。

~~~bash
#mountされていないので、次のメッセージは表示されます。
linaro@linaro-alip:~$ sh hdd.sh
Partition 1 does not start on physical sector boundary.

#正しく指定した場所にmountされていることが確認できます。
linaro@linaro-alip:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G   18G   39G  31% /
devtmpfs        988M     0  988M   0% /dev
tmpfs           997M  4.0K  997M   1% /dev/shm
tmpfs           997M   17M  980M   2% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           997M     0  997M   0% /sys/fs/cgroup
/dev/mmcblk0p7  4.9M  329K  4.3M   8% /boot
tmpfs           200M  8.0K  200M   1% /run/user/1000
tmpfs           200M     0  200M   0% /run/user/0
/dev/sda2       7.3T  4.6T  2.7T  64% /home/linaro/mnt/sda1
/dev/sdb5       466G  320G  147G  69% /home/linaro/mnt/sdb1
linaro@linaro-alip:~$
~~~

#crontabに設定
次のコマンドで設定画面を表示して内容通りに追加しましょう。
本当はBootする際に１回実行する方法はありますが、起動中に変更もあるので、
cronに設定しました。
設定した後、起動してみましょう。

~~~bash
linaro@linaro-alip:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 * * * * sh /home/linaro/hdd.sh
~~~

#OS起動した後、確認
次のコマンドで確認できます。
念のため、手動でも実行してみました。

~~~bash
Linux linaro-alip 4.4.194 #75 SMP Thu Jun 24 14:03:34 UTC 2021 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Nov  3 17:16:45 2016
linaro@linaro-alip:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G   18G   39G  31% /
devtmpfs        988M     0  988M   0% /dev
tmpfs           997M  4.0K  997M   1% /dev/shm
tmpfs           997M  9.0M  988M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           997M     0  997M   0% /sys/fs/cgroup
/dev/mmcblk0p7  4.9M  329K  4.3M   8% /boot
tmpfs           200M  8.0K  200M   1% /run/user/1000
/dev/sda2       7.3T  4.6T  2.7T  64% /home/linaro/mnt/sda1
/dev/sdb5       466G  320G  147G  69% /home/linaro/mnt/sdb1
tmpfs           200M     0  200M   0% /run/user/0
linaro@linaro-alip:~$ sh hdd.sh
not run
~~~

#終わりに
今回のSCRIPTはいかがでしょうか。
昨日一杯飲んだからか今朝早く目が覚めたので、書いてみました。
やっぱり朝早く何かやるのがよいですね。W