Synology NAS(DS218j) ユーザ、グループごとの容量制限値をコマンドで取得する

ほしがき2019/01/01(火) - 16:26 に投稿

 

長い前置き


 

今使っているPCのHDDは2年近く使用していてそろそろバックアップ取らないと危ないなーと思い、

NAS(Synology DiskStation DS218j)を購入しました。

容量4TBを2台突っ込んでRAID1にしているのでこれで一応安心です。

家族で使用するのでそれぞれアカウントを作成し、個別のフォルダを使うようにしました。

アカウントには使用する容量の制限もかけられるため各々に数百GB程度割り当てを行いました。

管理者の私としては使いすぎている人がいないかとか割り当てた容量なくなりそうとか知っておきたいわけです。

もちろんDS218jにはメールで通知できるのですがそうではないのです。違うのです。

別の方法で通知させたいのです。

そこでどうしたらいいかなとSSHでNASに繋いでファイルをあさっていたら見つけました。

各アカウントの容量制限値が格納されていたのです。

それではいきます。

 

情報の在り処


まず、前提としてNASにはSSHで繋ぎます。

とりあえずsudo -iでルートになっておきましょう。

以下にDB(sqlite)のファイルがあります。

/volume1/synoquota.db

これはsqliteのファイルなので以下コマンドにて中身を確認できます。

# sqlite3 /volume1/synoquota.db
SQLite version 3.10.2 2016-01-20 15:27:19
Enter ".help" for usage hints.
sqlite> .table
group_quota  user_quota
sqlite> .schema user_quota
CREATE TABLE user_quota(id INTEGER PRIMARY KEY, quota_mb INTEGER NOT NULL);
CREATE UNIQUE INDEX user_quota_idx ON user_quota(id);
sqlite> .schema group_quota
CREATE TABLE group_quota(id INTEGER PRIMARY KEY, quota_mb INTEGER NOT NULL);
CREATE UNIQUE INDEX group_quota_idx ON group_quota(id);

 

見たまんまですが、このようになります。

テーブル

  • group_quota
  • user_quota

カラム(両テーブル同じ)

  • id
  • quota_mb

 

カラムのquota_mbはそのまま割り当てた容量のMBの値が入っています。

idは何かというとLinuxのユーザとしてNASのアカウントは登録されているので/etc/passwdを見ればいいのです。

グループの場合は/etc/groupです。

中身はそれぞれこんな感じです。

  • /etc/passwd
~省略~
testuser:x:1027:100::/var/services/homes/test:/bin/sh
~省略~

 

  • /etc/group
~省略~
testgroup:x:65536:
~省略~

上記の1027と65536がそれぞれidに格納されています。

これでアカウント名から割り当てサイズが特定できます。

※容量制限をつけていないグループ、ユーザに関してはこのDBには情報が格納されません

シェルで操作


以下は容量制限したアカウントのアカウント名、id、割り当てMBを表示するシェルとなります。

グループも同じようにやれば取得できます。

あとはこれを少し改造してslackに通知したりできます。

私はサーバを借りてそこにMattermostをインストールしているのでそちらで通知を受け取ろうかと考えています。

# DB結果保存ファイル
DB_DATA=/volume1/userquota.dat

# ユーザ情報
USER=`cat /etc/passwd`

##########################
# ユーザの容量制限値を取得
##########################
function selectQuotaMB() {
  sqlite3 synoquota.db "SELECT id,quota_mb FROM user_quota" > $DB_DATA
  echo `cat $DB_DATA`
}

########################
# idからユーザ名を取得
########################
function getNameById() {
  for line in `cat /etc/passwd`
  do
    username=`echo $line | cut -d':' -f1`
    id=`echo $line | cut -d':' -f3`

    if [ $1 = $id ]; then
      echo $username
    fi
  done
}

for dbdata in `selectQuotaMB`
do
  cut_id=`echo $dbdata | cut -d"|" -f1`
  cut_mb=`echo $dbdata | cut -d"|" -f2`
  name=`getNameById $cut_id`
  echo "==>" $cut_id $name $cut_mb"MB"
done

 

残念なこと


今の私の使い方としては1アカウントに対して1フォルダで権限付与しているので、このシェルを使って該当フォルダのduを取れば割り当て容量まであと何GBとかできます。

しかし、例えば1アカウントに複数のフォルダにアクセスできるよう権限を変更し、さらにそのフォルダが複数アカウントからアクセスできる場合、かなりややこしくなります。

ファイルの所有者みてサイズ足していってごにょごにょ・・・。

ありえません。きっと他に何かあると思うのですが今のところ見つけられていません。

暇なときにもう少し調べてみます。