HDDデータ復旧時にFAT32の制限に嵌ったメモ

2.5インチハードディスクをPCに接続しても認識しなくなったとのことで読めるようにならないか相談を受けました.

元々NotePCに内蔵されていたものをUSB接続の箱に入れて使っていたとのこと.
型番は TOSHIBA MK4058GSX で 約400GB のもの.
USB エンクロージャーは USB3.0 接続で USB A – micro B 3.0 久々に見ました.

復元したデータは一緒に渡された 3.5インチ外付けハードディスクに入れてほしいとのこと.
確認するとFAT32です.権限などは落ちてしまうよなーと確認するとファイルが救えさえすればいいとのこと.

まあディスク認識が出来れば吸い出してloopback mountしてコピーと言う感じかなと思っていたのですがFAT32のおかげで結構面倒でした.

今回は Debian sid amd64 環境でHDDから GNU ddrescue でイメージを吸い出してマウントしてからコピーすることにしました.

Linux環境がなければ SystemRescueCd とかをUSBメモリ起動したりするのがお手軽だと思います.

PCに接続するとキュルキュルカッコンといった異音がします.久々にこういう音をするハードディスクを触りました.

PCに接続して少し時間は掛かりましたが /dev/sdb として認識しました.

認識したところで GNU ddrescue でディスクイメージを吸い出してみます.rateがすごく変動して残り時間が数時間〜数十日で安定しません.幸い1日と少しで最後まで走りきって bad-sector/bad area も見つからなかったので恐らくデータの欠落もなかったようです.

ddrescue
$ time sudo ddrescue -n -v /dev/sdb ./disk.img ./disk.img.log
GNU ddrescue 1.23
About to copy 400088 MBytes from '/dev/sdb' to 'disk.img'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 7936 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
     ipos:  400088 MB, non-trimmed:        0 B,  current rate:  16015 kB/s
     opos:  400088 MB, non-scraped:        0 B,  average rate:   4225 kB/s
non-tried:        0 B,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:  400088 MB,   bad areas:        0,        run time:  1d  2h 17m
pct rescued:  100.00%, read errors:        0,  remaining time:         n/a
                              time since last successful read:         n/a
Finished

real    1578m2.468s
user    0m35.744s
sys     10m24.384s

吸い出したディスクイメージのパーティションを見るとこんな感じで元PCのリカバリ領域なども残っているようです.

disk partition
$ fdisk -l ./disk.img
Disk ./disk.img: 372.63 GiB, 400088457216 bytes, 781422768 sectors
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: 0xcd22cd22

Device      Boot     Start       End   Sectors   Size Id Type
./disk.img1           2048   3074047   3072000   1.5G 27 Hidden NTFS WinRE
./disk.img2 *      3074048 653834239 650760192 310.3G  7 HPFS/NTFS/exFAT
./disk.img3      653834240 758691839 104857600    50G  f W95 Ext'd (LBA)
./disk.img4      758691840 781422591  22730752  10.9G 17 Hidden HPFS/NTFS
./disk.img5      653836288 758691839 104855552    50G  7 HPFS/NTFS/exFAT

Partition table entries are not in disk order.

mount コマンドの offset option で mount することも出来ますが面倒なので kpartx コマンドでデバイスマッピングをしておきます.
これで出来たループバックデバイスを指定してマウントできます.

デバイスマッピング
$ sudo kpartx -av ./disk.img
add map loop8p1 (253:3): 0 3072000 linear 7:8 2048
add map loop8p2 (253:4): 0 650760192 linear 7:8 3074048
add map loop8p3 (253:5): 0 2 linear 7:8 653834240
add map loop8p4 (253:6): 0 22730752 linear 7:8 758691840
add map loop8p5 (253:7): 0 104855552 linear 7:8 653836288
1つ目のパーティションを読み込み専用で /mnt/p1 にマウント
$ sudo mkdir -p /mnt/p1
$ sudo mount -o ro,loop /dev/mapper/loop8p1 /mnt/p1

rsync を使ってコピー.(--modify-window=2 はFAT32対策)

$ rsync -avvc --modify-window=2 --log-file=rsync.log コピー元 コピー先

数時間後.ログが止まってるけど大きいファイル転送中なのかな?
半日後……未だ終わらない.ログ変わってないような?メモしておく.
1日後.画面に変化がないので固まってる!

Ctrl+Cで中断.
再度実行すると同じところで止まる.

なんでだろう?といろいろ試すと転送先の該当ディレクトリにファイルを作成しようとするとエラーとなることがわかりました.

FAT32の問題で1ディレクトリ内のファイル数制限に引っかかったよう.

短いファイル名長で沢山ファイルを作ると65535個まで
$ n=1;while :;do if ! touch ${n};then echo ${n} ;break;fi ;n=$(( n + 1 ));done
touch: cannot touch '65534': No space left on device
65534
$ ls -1A|wc -l
65533
$ ls -1a|wc -l
65535
255文字のファイル名長だと3123個まで
$ n=1;while :;do if ! touch `printf %0255d ${n}`;then echo ${n} ;break;fi ;n=$(( n + 1 ));done
touch: cannot touch '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003121': No space left on device
3121
$ ls -lA|wc -l
3121
$ ls -la|wc -l
3123

--exclude '除外' でとりあえずあとで対応.と --timeout=30 オプションを付けてエラー時に終了するようにして再度実行.

$ rsync -avvc --modify-window=2 --timeout=30 --log-file=rsync.log --exclude '除外' コピー元 コピー先

何度か同じエラーがでたので都度除外リストを伸ばしていく><

終わった後に該当ディレクトリはzipアーカイブ化した.4GBを超えるものについてはzipのSplit archives機能(zip 3.0以上)を利用.

$ zip -9rs 3800m /fat32/hoge.zip source_dir

同様にパーティーション2つ目以降もコピーしていく.

書き出しHDDの空き容量に余裕があったので吸い出したRAW Disk イメージもコピーしておく.
4GB制限があるのでsplitで分割してコピー.

$ split -b 4000000000 ./disk.img

これでとりあえず簡単なドキュメントと一緒に渡して終わりにしました.
その後返信ないけど返信がないってことは多分大丈夫なのかな?

てことでディスクはFAT32 は避けたほうがいいねという.デジカメなどでFAT32にしか対応していないものは仕方がないですが,PCに繋ぐ外付けHDDなどはNTFSやexFatなどにしたら今回のようなトラブルに会いにくいと思います.(Linuxでも読み書きできる)

Bluetooth ヘッドセットが A2DP に切り替えられなくて困る

最近Bluetooth ヘッドセットで A2DP に切り替えが出来なくなっていました.オーディオプロファイルを A2DP にしようとすると変更に失敗します.

20200410 03:04:39 1847144

20200410 03:04:39 1847144 2

有線のヘッドホン(セリア製100円!)で使っていたのですが頭に合わなかったり不自由なので調べることに.
以下のページを見つけました.

どうも PulseAudio の自動切り替えがうまく行っていないようでこれを無効にすることで直りました.

具体的な設定は, /etc/pulse/default.pa ファイルの load-module module-bluetooth-policyauto_switch=false というオプションを付けでデーモンの再起動です.

/etc/pulse/default.pa を修正.
$ sudo git -C /etc diff /etc/pulse/default.pa
diff --git a/pulse/default.pa b/pulse/default.pa
index f670be0..494c1ce 100644
--- a/pulse/default.pa
+++ b/pulse/default.pa
@@ -64,7 +64,7 @@ load-module module-jackdbus-detect channels=2

 ### Automatically load driver modules for Bluetooth hardware
 .ifexists module-bluetooth-policy.so
-load-module module-bluetooth-policy
+load-module module-bluetooth-policy auto_switch=false
 .endif

 .ifexists module-bluetooth-discover.so
daemonを再起動(Pulseaudioは自動復帰した)
$ pulseaudio -k
$ sudo service bluetooth restart

この後ヘッドセットを接続し直すことでA2DPが使えるようになりました.

今使っているヘッドセットは Aukey EP-B26 で長時間使えていたのが良かったのですが,バッテリーがへたってしまっています.今はUSBケーブルで給電しながら使っています.有線なんだけど細いケーブル(100円ショップの巻取りUSB microBの中の線だけにしたもの)で小さなモバイルバッテリーをポケットに入れて使うと結構自由度高い感じです.

でも出来れば新調したいところ.同じものはもう売ってないようなのでこのへんとかかな?

AfterShokz も気になってるけどちょっとお高いですね.

環境
$ dpkg-query -W pulseaudio* bluez* blueman
blueman 2.1.2-1
bluez   5.53-0ubuntu2
bluez-alsa
bluez-audio
bluez-cups      5.53-0ubuntu2
bluez-gnome
bluez-input
bluez-network
bluez-obexd     5.53-0ubuntu2
bluez-serial
bluez-utils
pulseaudio      1:13.99.1-1ubuntu1
pulseaudio-module-bluetooth     1:13.99.1-1ubuntu1
pulseaudio-utils        1:13.99.1-1ubuntu1
$ lsb_release -dr
Description:    Ubuntu Focal Fossa (development branch)
Release:        20.04
$ uname -m
x86_64
$ lsusb -d 0a5c:217f
Bus 001 Device 016: ID 0a5c:217f Broadcom Corp. BCM2045B (BDC-2.1)
$ lspci | grep -i audio
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 06)

Zoom のLinuxクライアントをFirejail経由で利用する

最近みんなよく使うようになった Zoom ですがみんなが使うようになっていろいろとプライバシーやセキュリティの問題が表層化してきている感じです.

Linux関連だとパッケージング周りがあまりよろしくない感じです(◞‸◟)

それ以外にもLinux版は利用者が少なく見つかっていないだけで問題がありそうな気がします.

とりあえず手元の環境ではpkg版は削除してなるべくウェブブラウザで利用をしておこうかと思っています.Linux版ChromiumではUA偽装が必要という記事も見かけましたが,

2020-04-03 に Version 80.0.3987.162 (Developer Build) built on Debian bullseye/sid, running on Debian bullseye/sid (64-bit) で試したところUA偽装せずに使えました.

$ chromium --temp-profile https://zoom.us/……

でもリソースはデスクトップ版より余計に食いそうです.デスクトップ版にはbinary tar ball もあるのでそれならバッケージングの問題は回避できると思います.
これを試してみます.

少し手間な気がしますが,pkg版の方もリポジトリはないのでアップデート毎にインストールし直しが必要なのであまり手間は代わりません.

ダウンロードしたアーカイブを /opt 以下に展開します.

$ tar tvf ~/Downloads/zoom_x86_64.tar.xz
$ tar xvf ~/Downloads/zoom_x86_64.tar.xz -C /opt

これで,` /opt/zoom/zoom` で起動しようとすると Segmentation fault になってしまいます.zoom.sh かな?と思ったけど中を見ると debug用のようです./opt/zoom/zoomlinux で実行すればokのようです.

次にアプリケーションをサンドボックス内で動かしてセキュリティリスクを軽減できる Firejail 経由で動くか試してみます.

先ずは Firejail を導入します.

$ sudo apt install firejail firejail-profiles

これでとりあえず,firejail /opt/zoom/zoomlinux で Firejail 経由で起動できます :)

$ firejail /opt/zoom/zoomlinux

Firejail の管理下にあるものは firejail --list で確認できます.firejail --tree で pstree のようにプロセスツリーが確認できます.負荷状況は firejail --top で topやvirtop 的な感じで確認できます.

Firejail のプロファイルを確認すると Zoom のものもありました.

$ dpkg -L firejail-profiles | grep zoom
/etc/firejail/zoom.profile

せっかくなのでこれを使います.pkg版のときは zoom という名前で起動するのでそのままでこのプロファイルを使うようですが,zoomlinux で起動すると認識してくれないようなので,zoomlinux 用のプロファイルを用意します.といってもコピーするだけです.

$ mkdir -p ~/.config/firejail
$ cp /etc/firejail/zoom.profile ~/.config/firejail/zoomlinux.profile

/opt/zoom/zoomlinux のようにパスが付いていると認識してくれないので,パスを通して起動します.

$ PATH=/opt/zoom:$PATH firejail zoomlinux
Reading profile /home/matoken/.config/firejail/zoomlinux.profile
  :

若しくは --profile オプションでプロファイルを指定します.(こっちのほうがいいかな?)

$ firejail --profile=zoom /opt/zoom/zoomlinux
Reading profile /etc/firejail/zoom.profile
  :

zoom プロファイル経由で起動できました :)

この状態だとファイルの共有をしようとすると共有するものが何もなかったり,チャットログの保存が出来なかったりします.

Screenshot from 2020 04 09 05 22 18

firejail のプロファイルを編集して許可したいファイルやディレクトリを設定します.以下は ~/Documtnts/Zoom を許可する例です.

$ diff -u /etc/firejail/zoom.profile ~/.config/firejail/zoomlinux.profile
--- /etc/firejail/zoom.profile  2020-01-21 03:53:34.000000000 +0900
+++ /home/matoken/.config/firejail/zoomlinux.profile    2020-04-09 06:35:43.591973723 +0900
@@ -7,6 +7,7 @@

 noblacklist ${HOME}/.config/zoomus.conf
 noblacklist ${HOME}/.zoom
+noblacklist ${HOME}/Documents/Zoom

 include disable-common.inc
 include disable-devel.inc
@@ -16,9 +17,11 @@
 mkdir ${HOME}/.cache/zoom
 mkfile ${HOME}/.config/zoomus.conf
 mkdir ${HOME}/.zoom
+mkdir ${HOME}/Documents/Zoom
 whitelist ${HOME}/.cache/zoom
 whitelist ${HOME}/.config/zoomus.conf
 whitelist ${HOME}/.zoom
+whitelist ${HOME}/Documents/Zoom
 include whitelist-common.inc

 caps.drop all

ということで少しは安全になったかな?
しばらくはこまめに Zoom の情報はアップデートしておこうと思います.

環境
$ /opt/zoom/zoom 2>&1 | grep Version
Linux Client Version is 3.5.382995.0407
$ dpkg-query -W firejail*
firejail        0.9.62-3
firejail-profiles       0.9.62-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

ADSLモデムが壊れたのでACアダプタを交換した

スマホにアラートが飛んできました.
自宅サーバが落ちてるとのこと.回線細いので落ちてなくてもたまに来るのですが確認すると実際繋がらない.
ルータを見ると接続中となっているけど外に出られない.再接続しようとすると接続できなくなりました.
機器を見るとADSLモデム-SVIIIの電源が入っていません.電源アダプタを繋ぎ直したりAC側の口を変えても駄目.

WebでADSLモデムの中古を少し探しましたが中古も案外高い.オークションやフリマサイトを見ても4k〜という感じで以前購入したことより値上がりしているようです.
鹿屋に届け物をする用事もあったのでダメ元でハードオフに行ってみました.

IMG 20200305 155518
IMG 20200305 165952

このお店では一度もADSLモデムを見たことがなかったのですがやはり無い.仕方ないので電源ジャンク箱から電気的に合いそうなACアダプタを探してみます.

ADSLモデム-SVIIIの電源アダプタ(WBC 3000MV)の電源は9V 1.5A でプラグはセンターポジティブのもの.

IMG 20200305 024604
IMG 20200305 024633

ぴったりなものは見つかりませんでしたが A が少し大きい 9V 1.6A の物を買ってみました.プラグの形は明らかに違いますが元のものを使うことにします.

IMG 20200305 172117

帰って電源が生きているのを確認しようとしたらテスターの電源が入りません.電池は CR2032 だけど手持ちがない.自転車のフラッシャーに使っているものを入れてみても動かないので壊れているかもしれない…….仕方ないのでジャンク袋LEDから1個出してそれで確認しました.
ケーブルは極性わからないものだったので極性もこれで確認.

IMGP6247

はんだ付けした後熱収縮性チューブも無いのでとりあえず自己融着テープを巻いておきました.見た目はゴツくなったけど絶縁と保護は大丈夫そう.
これで電源を入れてみると復活しました.

IMG 20200306 170152

しばらく使っていますが問題なく使えているようです.
ADSLモデムでPPPoEしようとすると20分以上掛かるし本体も含めそろそろ寿命かもですね…….

環境
  • NTT西日本 フレッツ・ADSL モア40
  • DIX
  • ADSLモデム-SVIII
  • YAMAHA RT57i