ntfs のストレージをLinuxから操作したい
Linuxに接続してNTFSのHDD/SSDをメンテナンスしたときのメモ
使うツール
- ntfsresize
- ntfsfix
- gdisk
- losetup
- ddrescue
- kpartx
NTFSのディスクイメージを作る
ddrescue で取り出せばおっけ
ddrescue /dev/sda2 ntfs.img
ディスクイメージを接続する
losetup で ディスクイメージファイルを接続して通常HDD同等に扱えるようにする。
losetup -f ntfs.img losetup -l | grep ntfs.img
空っぽのディスクイメージを使って操作する
NTFSの操作の練習のために、空っぽのディスクイメージを作って練習する
- 5Gのファイルを作る
- sgdisk でパーティション作成
- kpartx(losetup) で接続する
次のようにして実験用の環境を作ることができた。
truncate -s 5G ntfs.img sudo sgdisk -Z ntfs.img sudo sgdisk -n "0::+1G" ntfs.img sudo sgdisk -p ntfs.img sudo sgdisk -t 1:0700 ntfs.img sudo sgdisk -p ntfs.img sudo losetup -f --show ntfs.img sudo kpartx -a /dev/loopX sudo ls /dev/mapper/loop sudo mkfs.ntfs /dev/mapper/loopXp1
/dev/loopX
は毎回変わるので注意
後片付け
sudo kpartx -d /dev/loop0 sudo losetpup -d /dev/loop0
マウントする
マウントする。 /dev/loopX
は losetup している場合
# シンプルボリュームにした場合 mount -t ntfs /dev/loopX /mnt # partitionを作った場合 mount -t ntfs /dev/mapper/loopXpN /mnt
losetup をmount と同時にやる
mount -t ntfs -o loop ntfs.img /mnt
NTFSのチェック
ntfsresize のコマンドにチェック機能があるので、NTFSのディスクチェックに使える。
sudo ntfsresize -c /dev/loopX # または sudo ntfsresize -c /dev/mapper/loopXp1
info の表示でもチェックは走るみたい
sudo ntfsresize -i /dev/loop10
NTFS リサイズ
sudo ntfsresize -n -v -x /dev/loop10
やった結果(正常終了)
takuya@:~$ sudo ntfsresize -f /dev/loop10 ntfsresize v2017.3.23AR.3 (libntfs-3g) Device name : /dev/loop10 NTFS volume version: 3.1 Cluster size : 4096 bytes Current volume size: 511411470848 bytes (511412 MB) Current device size: 511411471360 bytes (511412 MB) New volume size : 511411470848 bytes (511412 MB) Nothing to do: NTFS volume size is already OK.
やった結果(エラー時)
実際にやってみた結果。CHKDSKで修正が必須らしいです。CHKDSKはWindowsのコマンドなのでLinuxでは修復ができないのかもしれない。
takuya@:~$ sudo ntfsresize -n -i /dev/loop10 ntfsresize v2017.3.23AR.3 (libntfs-3g) Device name : /dev/loop10 NTFS volume version: 3.1 Cluster size : 4096 bytes Current volume size: 511411470848 bytes (511412 MB) Current device size: 511411471360 bytes (511412 MB) Checking filesystem consistency ... Cluster 16521360 is referenced multiple times! Cluster 16521361 is referenced multiple times! 100.00 percent completed ERROR: Filesystem check failed! ERROR: 2452 clusters are referenced multiple times. NTFS is inconsistent. Run chkdsk /f on Windows then reboot it TWICE! The usage of the /f parameter is very IMPORTANT! No modification was and will be made to NTFS by this software until it gets repaired.
NTFS の修正
-n
をつけて調査だけしたあとにオプションを外して書き込みをする
sudo ntfsfix -n -b -d /dev/loopX sudo ntfsfix -b -d /dev/loopX
takuya@:~$ sudo ntfsfix -b -d /dev/loop0 Mounting volume... OK Processing of $MFT and $MFTMirr completed successfully. Checking the alternate boot sector... OK NTFS volume version is 3.1. Going to un-mark the bad clusters ($BadClus)... No bad clusters...OK NTFS partition /dev/loop0 was processed successfully.
NTFSのリサイズ(縮小・拡大)
sudo ntfsresize -s 1G /dev/loop0
CHKDSK が要求される場合
ntfsfix を試す
sudo ntfsfix /dev/loop0 sudo ntfsresize -s 1G /dev/loop0
データ破損を覚悟して forcesする
sudo ntfsresize -s 1G --force /dev/loop0
パーティションサイズとNTFSのサイズが合わない場合
NTFSは、パーティションサイズとNTFSのサイズが一致している必要がありWindowsで認識できない。Cドライブで不一致を起こすと起動失敗してBSoDになる。
Successfully resized NTFS on device '/dev/mapper/loop0p1'. You can go on to shrink the device for example with Linux fdisk. IMPORTANT: When recreating the partition, make sure that you 1) create it at the same disk sector (use sector as the unit!) 2) create it with the same partition type (usually 7, HPFS/NTFS) 3) do not make it smaller than the new NTFS filesystem size 4) set the bootable flag for the partition if it existed before Otherwise you won't be able to access NTFS or can't boot from the disk! If you make a mistake and don't have a partition table backup then you
ext4 ならresize2fs を実行すればいいが、NTFSには適切なコマンドが無いので、gdisk を使ってセクタサイズとボリュームサイズを計算しパーティション修正を頑張る。根性で。
partedでも可能だが自動にやってくれるわけじゃない。基本的に経験と勘と気合と根性の4K作業です。(計算方法さえ知ってれば大丈夫)tune2fsやresize2fs のようなものはない。
gdisk で修正すると、パーティションのUUIDが変わってしまうのでNTFSがCドライブのならWindowsのライセンス認証が無効になる。
かんたんな修正方法
パーティションサイズの修正には、すごく簡単な方法がある。
GPartedを起動してOKを押す。
GPatedの起動時のパーティションチェックで修正すれば簡単です。
GPartedをつかえば、ddイメージのGPT自体がおかしくなったときにも対応可能ですし、GPartedが楽だと思う。
CHKDSK がない
chkdsk /f
を掛けろとメッセージが出てくるのだが、それに相当するコマンドがどれかわからなかったので、最悪の場合ではWindowsを持ち出してきてCHKDSKをまわすしか無いと思う。
NTFSの利点
Linuxのext4とNTFSを比較したとき、最大のメリットは「ファイル名の最大文字数」です。
巷にはファイルシステムを比較したとかでパフォーマンスの記事が溢れていますが、ファイル名の最大長に触れた記事は殆どありませんね。記事を見てもメンテナンスをしたりとかディスク交換したりとか、そういう記事は見当たりませんよね。誰も使い込んでないんですよ。なので今回は、NTFSのメンテナンスをLinuxからする場合に着目してまとめてみた。NASのデータをNTFSmにしておけば、最悪の場合Windowsでマウントできるので、便利だと思うんですよね。
LinuxのカーネルにNTFSが取り込まれたので、そろそろ常用していいんじゃないかと思ったんですが。LinuxでNTFSを常用するのはまだ茨の道なので少し覚悟が必要ですね。