LinuxでNTFSファイルシステムのマウントでアクセス権限やファイルの所有者変更で悩まないために

NTFSの外付けHDDをLinuxでマウントする時に気をつけなければならないこと

通常Linuxで外部HDDをマウントした場合、ファイルの所有者やファイルのアクセス権限を変更したりする必要があるなら、HDDは、問題なく必要に応じて変更が出来るExt4でフォーマットするのが最良です。
しかし、Windowsで使っているNTFSでフォーマットされたHDDをマウントする必要がある場合は注意が必要です。マウントした後は、ファイルはマウント時の所有者から変更が出来ません。ファイルのアクセス制限も後から変更は出来ません。
つまり、マウント後はファイルをchmod やchownで変更出来ないのです。
NTFSシステムではその情報を保持する場所が無いので、コマンドを打って変えようすると、エラーも出ずに何事もなく完了する。でも確認してみると変更されていないのである。
つい、やったつもりで先に進んでしまうとそれに気がつくまで時間がかかり、後で痛い目に合うということが多いので注意しましょう!!

実際のNTFSのマウント指示の方法

実際、mountコマンドをそのたびに打ってmountすることは少なくて起動時にmountすることのほうが圧倒的に多い。その場合は、マウントをfstabに書き込んで自動起動させましょう。
fatabは環境によって場所は違うのかもしれないが私の環境では /etc にあったので開くと

<例>

~$ sudo nano /etc/fstab

proc                 /proc          proc    defaults 0 0
PARTUUID=ea92b713-01 /boot/firmware vfat    defaults 0 2
PARTUUID=ea92b713-02 /              ext4    defaults,noatime 0 1

この例の様に表示されます。後でマウントの書き方は説明をしますが、この記述の最後に追加記述することになります。
ここでは何もせずいったん閉じておきましょう。

コマンドでLinux上のHDDの認識を調べる

sudo fdisk -l コマンドで現在接続されているディスクの状況を確認します

~ $ sudo fdisk -l

...省略...

Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: DT01ACA050
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe38dbb85

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            2048 755277823 755275776 360.1G  7 HPFS/NTFS/exFAT
/dev/sda2       755277824 976769023 221491200 105.6G  7 HPFS/NTFS/exFAT

上記の結果からHDDは /dev/sda として認識されていて、その内部は sda1と sda2 の2つのNTFSファイルシステムがあることがわかります。ひとつしか作っていなければ /dev/sda1だけの表示です。

UUIDでマウントする場合

ハードディスクのUUIDを lsblk で確認します。

~ $ sudo lsblk -f
NAME        FSTYPE FSVER LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
 sda1      ntfs         HDD        B88A62D38A628E26                        360G     0% /media/hdd1
 mqsda2      ntfs         ボリューム D63CABFB3CABD531                       55.9G    47% /mnt/samba/hdd
mmcblk0
 tqmmcblk0p1 vfat   FAT32 bootfs     EF6E-C078                             436.4M    14% /boot/firmware
 mqmmcblk0p2 ext4   1.0   rootfs     4aa56689-dcb4-4759-90e6-179beae559ac   19.6G    25% /


sda1を /mnt/hdd にマウントしたいなら USSID=B88A62D38A628E26をマウントする記述として/etc/fstabに以下のように追加記述します。

~$ sudo nano /etc/fstab

proc                 /proc          proc    defaults 0 0
PARTUUID=ea92b713-01 /boot/firmware vfat    defaults 0 2
PARTUUID=ea92b713-02 /              ext4    defaults,noatime 0 1
# マウントのUUIDを指定して以下を追加
UUID=B88A62D38A628E26 /mnt/hdd auto nofail,uid=33,gid=33,umask=007 0 0

最後の行の説明を簡単に説明しますと
<マウント元USSID><マウント先><ファイルシステムの種類><オプション><dump><pass>
となっています。

<ファイルシステムの種類>
上記の場合ファイルシステムは NTFSなので [ntfs-3g] と書いても良いが [auto] と書けばどのファイルシステムかをマウントに自動で推測してもらえて便利です。
<オプション>
オプションは複数をカンマで区切って記述。nofailはもしも記述に問題があった場合読み飛ばしてくれる便利なオプション!!(必須ですね!!)
※以下重要 uidgidumaskは、先に述べた「NTFSのHDDをマウントした場合は、マウント後はファイルのアクセス制限とファイルの所有者情報はマウント時の所有者から変更出来ない。」ということなので、ここで予め設定します。
ここではapacheのホルダにするためのマウントだったのでオーナーはwww-dataにしてます。
uid,gidを調べるには
~ $ id www-data
で、自分の環境ではwww-dataは33でした。目的のオーナーのidを調べて入れて下さい。
umask=007は通常のマウントではファイルアクセスは777→770にするためマスクして007とした。

<dump>
dumpコマンドによるバックアップ対象にするかを決める。1か0を設定できる。
1ならバックアップ対象、0ならdumpの対象外
<pass>
起動時にfsckがチェックする順番。0,1または2を設定できる。
0のファイルシステムはチェックしない。
1はチェックの優先度が一番高いもの、ルートファイルシステム(/)は必ず1。
2はその他のファイルシステムのときに入れる。

UUIDを使わないでマウントする場合の書き方

個人的には判りやすくUUIDを調べなくて良いのでこちらが好きです。
ただし、HDDがいくつもあると、マウント状況が入れ替わって(sdaとsdbが入れ替わったり)してうまくマウント出来ないことがあるので注意しましょう。

~$ sudo nano /etc/fstab

proc                 /proc          proc    defaults 0 0
PARTUUID=ea92b713-01 /boot/firmware vfat    defaults 0 2
PARTUUID=ea92b713-02 /              ext4    defaults,noatime 0 1
# マウント場所を指定して以下を追加
/dev/sda1 /mnt/hdd auto nofail,uid=33,gid=33,umask=007 0 2

LinuxでUSB接続のストレージをsambaで共有する

USB接続のHDD等をLinuxにマウントしてSambaで共有する方法

知人がraspberry piでファイルサーバーを作るのになかなか難儀していたので協力することになった。
もう何年の前にLinuxでSambaを使ってファイルサーバーを作ったことがあった私だが・・
「USB機器をmountしてSambaをインストールし、smb.confをちょちょっと書き換えれば出来るな!…」などと安易に考えていたのでしたが、なんと!!なかなかインストールが先に進まない。
簡単にWindowsのネットワークを開けば共有ファイルが見えるようにはならないんです。
それに、いつの間にかWindowsの仕様??が変わってしまって表示しない!動かない!!
そんな訳で、またも覚書です。

まずはUSB機器のマウント

まずはUSB接続でHDDをmountしてみることにする。

1. USBデバイス名を調べる
   USBを未接続の状態と、接続状態の両方それぞれで以下のコマンドを入力

$ ls /dev/sd*

   結果の違いから、USBのHDDは /dev/sda1 というデバイス名だとわかった。
   他に調べる方法として簡単な方法としては

$ sudo blkid

   と入力し、出力された以下の文

/dev/mmcblk0p1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="EF6E-C078" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="ea92b713-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="4aa56689-dcb4-4759-90e6-179beae559ac" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="ea92b713-02"
/dev/sda1: LABEL="HDD" BLOCK_SIZE="512" UUID="B99A73D38A628E26" TYPE="ntfs" PARTUUID="e27dbb85-01"

/dev/sda1: LABEL=”HDD” BLOCK_SIZE=”512″ UUID=”B99A73D38A628E26″ TYPE=”ntfs” PARTUUID=”e27dbb85-01″
ここがUSB機器情報なのでこれを使います。
ちなみにUSBメモリなら
/dev/sda: UUID=”C51E-E72D” BLOCK_SIZE=”512″ TYPE=”vfat”
などと表示される
特にこれらの情報では、UUIDとTYPE(フォーマットのタイプ)が重要です。

2. 自分のIDを調べておく

$ id

現在ログインした自分のユーザー名myuserのuid とgidがわかります。
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser)….

3. 試しにmountしてみる

まずmount先のホルダ /share を作ります。
場所はどこでも良いのですがテストなので書き込み権限などの問題が起こらないように自分のホームの/Publicホルダに/shareを作ってTESTします。

$ mkdir /home/myuser/Public/share

そこにUSB機器  /dev/sda1 をマウントすることとします。
しかし、すでにUSB接続したときに自動で外の場所にマウントされているので、いったんアンマウントして、再度マウントしなおします。

$ sudo umount /dev/sda1
$ sudo mount -t ntfs-3g -o owner,uid=1000,gid=1000,utf8 /dev/sda1 /home/myuser/Public/share

エラーが出なければOKです。
このNTFS フォーマットのドライブを認識させるには、予め ntfs-3g というパッケージをインストールする必要があるかもしれません。その時は以下説明に沿ってインストールしてください。
詳しくは、ネット上の他の文献を参考にしてくださいね。

mount -t ntfs-3gの説明
コマンドのオプションには以下があります。
ext4 Linuxのファイルシステム
ext2ext3 少し前のLinuxのファイルシステム
msdos MS-DOSのファイルシステム
vfat FATのファイルシステム
iso9660 CD-ROMなどの光学ディスク全般
ntfs-3g NTFS
   ただし、NTFS フォーマットを扱うために ntfs-3g を使用する。
   インストールされているか確認。
      $sudo dpkg -l | grep ntfs-3g
   もし、インストールされていない場合は、インストールする。
      $sudo apt install ntfs-3g
nfs ネットワークファイルシステム

など、フォーマットの種類で書き換えます。
-o owner以下の部分はマウントされたファイルシステムの権限を持つ者のuid,gidです。
もちろん自分のホームディレクトリに作ったのだから、扱いやすいように先程の自分のuid,gidを入れましょう。

エラーがでなければOK mount出来ることがわかった。
マウントを自動起動でするように組み込むのはsamba設定後にする。

Sambaの設定をする

1. Sambaをインストールする

インストール説明は他のサイトにまかせてインストール終了したとします。
sambaをインストールしたなら次の再起動コマンド、Linuxの種類によりもよります

$ sudo systemctl restart smbd

または

$ sudo service smb restart

おおまかにどちらかのコマンドで再起動出来ます。
なにもエラーなくコマンドに戻ればインストールはOK

2. Sambaの設定を開く

$ sudo nano /etc/samba/smb.conf

必要のないオプションもあるかもしれないが、とりあえず無ければ追加する

	[global]
	dos charset = CP932
	netbios name = raspi4
	security = user
	wins support = yes
	browseable = No
  	# 以下の1行をglobalに追加しておけば余計な[nobody]共有が表示されなくなる
	browseable = No
	
	[homes]
   	comment = Home Directories
  #homesは必要無いので今回は非表示に!!
   	browseable = No
   	guest ok = no
	read only = yes

	[share]
    #今回はここを共有。誰でも読み書き可の設定
    comment = Share
    path = /home/myuser/Public/share
	force user = myuser
	security = user
	force group = myuser
    force create mode = 0777
    force directory mode = 0777
    guest ok = yes
    read only = no
	browseable = yes
	writable = yes
    #アクセス権のないものは表示しない設定にするために次の1行追加
	hide unreadable = yes

再起動コマンドを打ってsambaを再起動する。

自動でマウントするようにするには

電源を入れたときにマウントを自動でさせるには、おおまかに2種類あります。
ひとつは、/etc/fstab に書き込んで最初からroot権限でマウントする方法
もう一つはOSが起動した後、/etc/rc.local からマウントさせる方法があります。

2つを比べるとサーバーとしてCUIで起動するならfstab起動が良いと思います。
GUIでいつも決まったユーザーで起動しているなら rc.local に書いても良いでしょう。
そのままmountコマンドを書き込めるので簡単です。
fstabに書き込んだ場合は、入力ミスがあったらOSそのものが起動しないなんて事が経験上何度かあったので慎重な書き込みが必要です。どちらが適しているかは使い方次第です。もっともCUI起動ならfstab一択でしょうけどね。

rc.local での自動マウント処理方法

$ sudo nano /etc/rc.local

と入力し開きます。
#!/bin/sh -e の下の行にmount設定を追加しましょう。(#はコメントアウトですので無視されます)

先程のマウントコマンド文字をそのまま入れます
mount -t ntfs-3g -o owner,uid=1000,gid=1000,utf8 /dev/sda1 /home/myuser/Public/share

	#!/bin/sh -e
	##vfatフォーマットのUSB memoryの時は以下のように
	##mount -o owner,rw,uid=1000,gid=1000,utf8,flush /dev/sda /home/myuser/Public/share
	##今回はNTFSのUSB HDDなので以下のように
	mount -t ntfs-3g -o owner,uid=1000,gid=1000,utf8 /dev/sda1 /home/myuser/Public/share
	#

保存してLinux を再起動します。
これでWindowsからアクセスしてみる。すぐにはネットワークに現れないときがある
その時はwinパソコンも再起動すると現れると思います。

fstab での自動マウント処理の方法

今度は先程とマウント場所を変えます。root権限で予め/mnt/samba/hddというホルダを作っておきましょう。そこにmountすることとします。
(root権限で無くても良いのだがuid,gidを指定することで、rootホルダーがマウントするとmyuserのユーザーホルダに権限が変化してマウントされるのでそれを確認するためです^^;)

sudo nano /etc/fstab

以下のように表示(例)されるので最後の行を追加
UUID=B88A62D38A628E26 /mnt/samba/hdd auto nofail,uid=1000,gid=1000,umask=002 0 3

proc                  /proc          proc     defaults          0       0
PARTUUID=ea92b713-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=ea92b713-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
UUID=B88A62D38A628E26 /mnt/samba/hdd auto nofail,uid=1000,gid=1000,umask=002 0 3

[上記 UUIDの行の解説]
通常
UUID=B88A62D38A628E26 /mnt/samba/hdd auto default 0 0
のような簡単な書き方をしてマウントしてしまうと、マウントの中はすべてroot権限になってしまって何かと不便です。それなので細かくuid,gidを指定してマウントする。

左から説明すると
デバイスファイル名:UUIDは blkidで調べたマウントすべき物のUUID。””をつけずに入力
次はマウントポイント
次の autoはファイルシステムの種類 ntfsなのでntfsと書いても良いがautoにすると自動認識となる。
次はマウントオプション
nofailはマウントポイントのマウントに失敗してもブートは続行という意味。
知りませんでした!以前は無かった新しいもの??エラーを出さずに読み飛ばしてくれる(必須かも)
uid, gidは誰としてmountするか指定出来る。これでrootホルダでもmyuserになれるはず。
次はumaskで、新しくファイルを作成する際に、許可しないビットを示すもの。
普通、ファイルの新規作成時はファイルの実行ビット (eXecute) は立てないので、
umask が 022 ということは、666(rw-rw-rw-) から 022 を引いた 644(rw-r–r–) というパーミッション
で新規ファイルが作られることになる。
umask が 002 なら 664 、 umask が 000 なら 666 となる。
次のゼロはdumpフラグ、1であればdumpコマンドによるバックアップの対象になる。etx2/3は1を指定し、その他は0を指定
最後は、fsckがチェックする順番

これで、誰でも読み書き出来るSamba共有は完成!!
ただ、今回は解説なしですが他のマシンからSambaにアクセスできるようにファイアウォールの設定の変更は必要です。

smbdファイル共有、プリンタ共有などのSMBサービスを提供。待機ポート番号は139/tcpと445/tcp
nmbdNetBIOSのネームサービスを提供。待機ポート番号は137/udpと138/udp
とのことなのでそれらのポートについてはファイアウォールの設定をやっておいてください。


ついでにPassword認証もやってみよう!

Sambaでパスワード認証する

これらは、他のサイトに詳しく書いてあるのでササッと簡単に参ります。

1.Sambaにアクセスするユーザーを作成します。

ユーザーはとりあえず今ログインしているmyuserにします。
パスワードを聞かれてきますので入力します。

$ smbpasswd -a myuser
New SMB password:
Retype new SMB password:
Added user myuser.
<参考資料>
尚、Sambaは、Linuxのユーザー認証とは異なる認証システムを持っている。
新規ユーザーにSambaパスワードを設定するには、smbpasswdコマンドでLinuxとは別にパスワードを設定する必要がある。Sambaにはパスワードを同期させる機能もあり、Sambaで変更したパスワードをLinuxに自動的に反映することもできる。
この機能を利用するためには
$ sudo nano /etc/samba/smb.conf で開いて、
[global]セクションに以下の記述を追加する。
unix password sync = Yes
passwd program = /usr/bin/passwd %u

まあ、同期する必要があれば追加してください。

2.Sambaの設定を開く

$ sudo nano /etc/samba/smb.conf

[Share]以下を修正する

omment =Share
path = /mnt/samba/hdd
force user = myuser
security = user
force group = myuser
force create mode = 0665
force directory mode = 0774
guest ok = no
read only = no
browseable = yes
writable = yes
hide unreadable = yes

3.再起動

Sambaサーバでは次の2つのサーバプロセスsmbdとnmbdがサービスを提供してる。
まずは
$ sudo service smb restart
で sambaを再起動するのだが、nmbdはそれで一緒に再起動するのかどうかよく知らない。
なのでその後に
$ sudo service nmbd restart
として、こちらも一応再起動させておいたほうが間違いがないので実施してます。

WindowsネットワークにLinuxが表示されてもアクセス出来ない場合

Windows 11 のエクスプローラーからLinux上のsambaサーバーにアクセスしようとするが
「この共有に対するアクセス許可がありません」というメッセージが表示されてアクセス出来ない場合の対処。

1.Win + R で検索ボックスを出して
  名前の欄に gpedit.msc と入力

2.ローカルグループポリシーエディターが立ち上がるので
[コンピューターの構成] >> [管理用テンプレート] >> [ネットワーク] >> [Lanman ワークステーション]
を選び、その中の安全でないゲストログオンを有効にするをダブルクリックして表示させる。
「有効にする」にチェックを入れて「適用」ボタンを押す。
その後、それらを終了させる。

3.Windowsを再起動する。
これで、ネットワークのコンピューターからパスワード認証の画面が出現!!

おいおい!!Windows11になって余計な設定変更をしないでほしい!!

これがわかるまでに随分と時間を費やしてしまったじゃないか!!

これは覚書として残しておかないとまた次も悩みそうです・・・

Windowsネットワークに表示される時とされない時があり、安定しない場合

現在のWindowsバージョン23H2では、SambaでWindowsネットワークに表示されない、または表示しても次に開くと消えている等の不具合があるようです。非常に安定していません!!
Sambaサーバーを再起動して直後はネットワークに表示するのですが、時間が経つと表示が消えているようならWindowsが原因です。
以下のようにネットワークを開いて直接 \\192.168.1.130のように目的のパソコンのアドレスを入れてみて下さい。それで開けるようならSambaサーバーは正常に動いています。
そのような状況ならWindowsに問題があります。気長にWindowsの不具合の修正を待つしか今のところ手がないようですョ。その時はアドレスのリンクを作って直接呼び出して使用しましょう。