Samba 4サーバでWindows標準ゴミ箱を有効にする

ネットワークドライブ (コンピュータ -> ネットワークの場所、に表示される。) では、ゴミ箱が有効にならず、ファイルを削除すると、単に完全に削除されます。

Samba4サーバで, ゴミ箱を使えるようにします。

_ZFS snapshotを使う

(2017.7.27 追加)

最近思っているのは、ゴミ箱という発想がどうなのか。ゴミ箱を空にするまではファイルを復活できるが、ゴミ箱を空にしたら復活できない。

FreeBSD (またはFreeBSD由来のディストリビューション) で、ファイルシステムに ZFS を使えば、ゴミ箱ではなくスナップショットを使う方法がある。

スナップショットはほとんどディスク容量を消費しないので、頻度高くスナップショットを作り、いつでもユーザが過去からファイルを取り出せるようにする。

zfsコマンド

zfs snapshot コマンド一つでスナップショットが取れる。

# zfs snapshot <dataset>@<snap>

zroot/usr/home というデータセットが /usr/home にマウントされているとして、次のようにする。

# zfs snapshot zroot/usr/home@2017-07-27

ls -la /usr/home しても表示されないが, /usr/home/.zfs/snapshot でアクセスできる.

snapshot 以下はファイルシステムの機能で read-onlyになっている。書き込みもできない。

# touch .zfs/snapshot/2017-07-27/hoge
touch: .zfs/snapshot/2017-07-27/hoge: Read-only file system

snapshotの一覧を表示する。

# zfs list -t snapshot
NAME                        USED  AVAIL  REFER  MOUNTPOINT
zroot/usr/home@2017-07-27   316K      -  2.34M  -

これをSambaユーザ (クライアント) から見えるようにリンクを張ったりすればOK.

運用

定期的にsnapshotを取るようなスクリプトを書くのも、手間ではない。

例えば, 次のようにする;

  1. 1時間ごとにスナップショットを取る。
  2. 24時間が経過した分は, 1日に1回分以外は削除する
  3. 1ヶ月が経過したら月に1回以外のを削除する

Sambaの [homes]セクションを使っている場合は、/usr/home/.zfs/snapshot/<日付>/<ユーザ名> を /usr/home/<ユーザ名>/snapshot/<日付> 辺りにシンボリックリンクを張るようにする。

ZFS quota はユーザ単位に設定できる。

さらに自動レプリケーションを組み合わせて、バックアップも行う手もある。FreeBSD / ZFS 関係についてはこちら; FreeBSD

ZFSを使う方法は昔からあったが、これをデザインよく再発明したのが Apple Time Machine.

_Sambaごみ箱

重要.

このセクションのごみ箱機能は、ユーザーインターフェイスの点から適切ではないので、有効にしないほうがいいように思う。

次のセクションで説明する, Windows標準ゴミ箱が望ましいです。

Sambaには, サーバ側ゴミ箱機能があります。ゴミ箱モジュールは、Windowsクライアントからのファイル削除の要求を横取りして、サーバのゴミ箱ディレクトリに移動します。

Sambaの設定ファイル smb.conf ファイルに設定を書きます。(man vfs_recycle)

ファイ共有セクションの「vfs objects」パラメータにrecycleモジュールを指定することで、ごみ箱機能を有効にします。

recycle:repository パラメータでゴミ箱ディレクトリを指定します。ただし, [homes]セクションのときは、自動的に「/home/ユーザ名/指定ディレクトリ」として扱われます。

recycle:keeptree パラメータがyesのときは、ゴミ箱ディレクトリの中に、削除したファイルのディレクトリツリーも復元されます。

[homes]
    comment = Home Directories
    browseable = no
    writeable = yes

    # 以下がゴミ箱の設定
    vfs objects = recycle
    ; recycle:repository = .recycle
    recycle:keeptree = no
    recycle:versions = yes
    recycle:touch = no
    recycle:maxsize = 0
    recycle:exclude = *.tmp *~

設定ファイルを更新したら, sambaを再起動します。

しかしながら, この機能は単純にファイルを移動するだけなので、Windowsエクスプローラで元の場所に戻したり、削除した時間順に並べ替える、などのことはできません。また、ファイル削除のときのダイアログなども、ゴミ箱へ移動アイコンではなく、削除アイコンのままです。

ですので、特に、ITに通じた人だけではない場面では、ちょっと使いにくいと思います。

_Windows 7/10 の設定で頑張る

(2017.9.24) Windows 10でも同様にできることを確認。

Windowsの設定を変更して、ネットワークドライブでもゴミ箱が有効になるようにします。こちらのほうが使い勝手がよくなります。

[制限] このセクションの設定を行ったとしても, UNCパス (\\ホスト名\\パス名) でネットワーク越しのドライヴにアクセスしてファイルを削除した場合は、ゴミ箱を通らずに、直ちに削除されます。必ずネットワークドライブの割り当てをおこなって, そのドライブ内で操作してください。

レジストリ登録エントリファイルを作ります。ドライブごとに, ランダムな GUID を用意します。

GUIDの作り方

スタートメニューから, PowerShell を起動して次のようにする。ドライブの数だけ作ります。

PS C:\Users\hori> [guid]::NewGUID().ToString().ToUpper()
35527C2E-D360-4607-B2B6-807495A0B25F
PS C:\Users\hori>

レジストリ登録エントリファイル

サンプルは、次のようになります。ドライブが一つだけのときは RelativePath のドライブ名だけ変えて、そのまま使えます。複数ドライブのときは, GUID を変えて、エントリを複製してください。

一つ目: 管理者権限で投入.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{35527C2E-D360-4607-B2B6-807495A0B25F}]
"Name"="mySharedDrive"
"Category"=dword:00000004
"RelativePath"="P:\\"

二つ目: ゴミ箱を使いたいユーザで投入。GUID は一つ目と揃える.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\KnownFolder\{35527C2E-D360-4607-B2B6-807495A0B25F}]
"MaxCapacity"=dword:00003ad4
"NukeOnDelete"=dword:00000000

これらを拡張子 .reg で保存します。一つ目は管理者権限でレジストリエディタを開き, インポートします。二つ目はエクスプローラでファイルを開いてインポートさせます。

設定の考え方:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume 以下に, 各ドライヴの設定があります。MaxCapacity はゴミ箱の最大サイズ。「ゴミ箱のプロパティ」で決めた値です。

しかし、ここにはネットワークドライヴのエントリがありません。

そこで, Known Folder の機能を使ってネットワークドライヴを登録し, そのフォルダにゴミ箱を作る、という二段構えで対応します。Known Folders (Windows)

確認

一般ユーザでログインしなおすか, 単にエクスプローラを再起動すれば反映されます。デスクトップのゴミ箱のプロパティで、次のようにネットワークドライブが表示されれば成功です。

Windows 10でも、同様に動きます;

$RECYCLE.BIN の場所、アクセス権限

Windows側の設定は上のとおりですが、若干、注意点があります。

Sambaサーバ上のファイルを初めて削除したときに, ネットワークドライブの根 (root) として見えている場所に $RECYCLE.BIN フォルダが自動的に作成されます。ユーザ権限でこのフォルダが作れなければなりません。あるいは最初から用意しておく。

また、ローカルドライブと違って, $RECYCLE.BIN 以下に、ユーザごとのサブフォルダが作られません。なので、/home 以下などユーザごとに分かれた区画でなければ、ゴミ箱を有効にしてもいいかどうか、よく考える必要があります。

_参考リンク