Backup old floppy disks

時間に余裕ができたので、昔のフロッピーディスクの整理を始めた。
PC9801時代のものや5.25や8インチもあって手が付けられないので、まずは3.5インチから。

FreeBSDは、fdcontrolやfdreadなどの一連のコマンドがあるので、フロッピーディスク(FDC)を使用でき、コマンドソースはカーネルソースの/usr/src/usr.sbinに含まれている。
セクターIDを読むこともできるので、フォーマットが不明な場合に役立つので、まず使ってみた。
fdread -t TRACK -I COUNT
古いハードによく対応しているだが、BSD系を使い慣れていないので難しい。 DebianもFdutilsという一群のツールがあるので、昔のFDの読込にはこちらがよさそう。ただし、新しいカーネルでは、fdrawcmdが使用できない。
ubuntu 18.04, Debian 10, 9では、raw cmd: Operation not supportedと表示されて無視されるので、Debian 8 Jessieをインストール。
MAKEFOPPIESで、/dev/fd0*ができる。
floppycontrol –resetnow 2
fdrawcmd short seek 0 80
fdrawcmd short repeat=30 readid 0 2>&1 | sort -n | uniq
簡単にセクタサイズやオーバートラックの有無がわかる。
floppycontrol –resetは別の意味なので紛らわしい。 昔の3.5inch FDを確認すると、1.7M フォーマットのxiafsだった。高速かつ大容量で便利だったのでlinuxで使っていたが、今や読込む方法がない。Linux Kernel 2.1.21から、xiafsとextのサポートがなくなっている。Debian 2.2 potatoからはkernelが2.2.19になっているので、Debian 2.1 slink r4 (Kernel 2.0.36)を旧機にインストールすると、xiafs形式のディスクも読み込みができるし、1.7Mにも対応できた。1.7Mと1.4Mが混在しているので確認が必要。
mount -t xiafs /dev/fd0u1743 /mnt
mount -t xiafs /dev/fd0u1440 /mnt
fdrawcmd short readid 0 need_seek track=80 repeat=2を実行して、シリンダが0x50、最大セクタ数が15、セクタサイズ0x02(512)と読み取りができれば、1743Kフォーマット。moden-xiafsというのがあり、Debian 8 Jessieに導入してみた。
まずは、カーネル再構成ができる環境を準備。
apt install kernel-package
apt install linux-source-3.16
cd /usr/src
tar xvf linux-source-3.16.0.tar.xz
cd linux-source-3.16
cp -a /boot/config-3.16.0-6-amd64 .config
make deb-pkg
カーネルに合わせたxiafsのソースを準備
cd /usr/src
git clone https://github.com/ctdk/modern-xiafs
cd modern-xiafs
git branch -a
git checkout linux-3.16.4
なぜか修正が必要
module/file.c
-error = inode_change_ok(inode, attr);
+error = setattr_prepare(dentry, attr);
xiafsのモジュールを作成、導入。
cd /usr/src/modern-xiafs/module
make -C /usr/src/linux-source-3.16 SUBDIRS=$PWD modules
mkdir /lib/modules/3.16.0-6-amd64/kernel/fs/xiafs
cp -a xiafs.ko /lib/modules/3.16.0-6-amd64/kernel/fs/xiafs
depmod
modprobe xiafs
mkfsとfsckも作成、導入
cd ../programs
make install
フロッピーでxiafsを使ってみる。
superformat /dev/fd0 sect=18 cyl=83
MAKEFLOPPIES
mkfs.xiafs /dev/fd0u1743 1743
mount /dev/fd0 /mnt
df -T
umount /mnt
正常に稼働しているようである。
xiafが読み込めないときは、1.7Mなら0x7c00から、1.44Mなら0x6800からダンプするととりあえずルートの内容は確認できる。
od -v -Ax -tx1z -j 0x7c00 disk.17m | less

古いDistributionでは、NICなどが認識できないので、不便。
そのため、FDドライブ付ubuntuマシンにfdutilsをインストールしてディスクイメージを作成。
その後、Virtualboxで、slackware 3.5 CD Liveを起動して、読みだした。
dd if=/dev/fd0u1743 of=x1.dsk
x1.dskをVirtualBoxのフロッピーに割り当て。
mount /dev/fd0u1743 /mnt
ls -l /mnt
slink CDは、なぜかVirtualBoxで起動しなかった。

昔の2HDは78トラックなどの内周でリードエラーが多発しているが、2DDは比較的エラーが少ない。
mount -t msdos /dev/fd0 /mntでマウントできなかったときは、mountがdisk sleepになって終了できなくなる。
Ubuntu 20.04で正常にマウントできても、Arch Linux 20200401でマウントできないことがある。
ディスクの内容確認にdisktypeが便利。
エラーリトライの場合は、ddよりddrescueが便利。
apt install gddrescue
ddrescuelogもあるが、書式は簡単で、エラー部分が-で表示される。
既存のlog(map)fileを指定すると、エラー部分しか読み込まないので、エラーが発生した時に新規に指定するか、初回読込前に必ず削除しておく必要がある。
ddrescue -r2 -d device file map
-dをつけると、キャッシュを介さずに読むので、エラーがセクタ単位になる。
フロッピー程度であれば、-dをつけてもさほど時間がかかるわけでもない。 USB接続の3.5インチFDDを接続するとUSB機器として認識されるが、フロッピーディスクを挿入するまでは、ブロックデバイスとしてlsblkで表示されない。3モードのドライブだと、Debianでも3モードで動作するので素晴らしい。
/etc/mtools.confを編集し、下記を加えると、mdir -a b:でmtoolsも使える。
drive b: file=”/dev/sdc”
ddrescueも使用できるが、デバイスのサイズが判断できず、最後でエラーとなることもある。
1.7M,  1784832, 1743*1024,  0x1B3C00
1.44M, 1474560, 1440*1024, 0x168000
1.2M, 1228800, 1200*1024, 0x12C000
720K, 737280, 720*1024, 0xB4000
16進数の計算にはbcが便利だが、数字に小文字は指定できない。mtoolsをインストールすると、MS-DOSの扱いが便利になる。mtoolsでコマンドの一覧が表示される。
mdir -a, minfoなどは特に便利。
/etc/mtools.confを編集すると、Diskイメージファイルに対しても実行できる。
mformatはfsを作成するだけなので、ローレベルフォーマットには、superformatまたはfdformatを使用する。
superformatはfdutils、mformatはmtools、fdfromatはutil-linuxに含まれている。
導入済みならdpkg -S、未導入ならapt-file searchでパッケージを確認できる。 USB-FDDの場合は、ufiformatを使うが、これがかなり優秀で3モードに対応してるみたい。ufiformat -i ; USB-FDDのpathを表示してくれる。
ufiformat -i /dev/sg3 ; USB-FDDと挿入されているフロッピの詳細を表示してくれる。
ufiformat -f 1232 /dev/sg3 ; pc98の物理フォーマット
mformat -t77 -h2 -s8 -S3 b: ; pc98のDOSフォーマット

CP/M-86の3.5インチもあった。fdrawcmd short readid 0 need_seek track=79 repeat=10
どうやら、512x8x80x2=640Kであり、下記の手順でバックアップできる。
apt install cpmtools
setfdprn /dev/fd0 hd ssize=512 head=2 sect=8 cyl=80
getfdprm /dev/fd0
ddrescue -d -s 512 /dev/fd0 cpm.dsk
cpmls -l cpm.dsk
実によくできている。

fdrawcmdのrateはデータ転送レートの設定で、0:500Kbps、1:300Kbps、2:250Kbps、3:1Mbps。
3.5インチ(300RPM)なら、2HD1.4Mは0、2DD720Kは2、2ED2.8Mは3。
3.5インチ(360RPM)なら、2HD1.232Mは0。
5.25インチ(360RPM)の場合、2HD1.232Mは0、2HC1.2Mは0、2D360Kは1。

Macintoshの2HDは1.44Mと同じ物理フォーマットなので、Linuxでマウントできる。読み取りエラーがある場合、ddrescueでイメージ化して、mini vMac上でNorton Disk Doctorにかけるとエラーを復旧できる場合がある。 LinuxでのFATの修復は、fsck.fat /dev/fd0。
修復する際は、-wのオプションをつける。
-aは自動、-rは会話的な処理。

FDDケーブルの接続には注意が必要。メスコネクタの突起はあてにならないので、常に確認が必要。
メスコネクタのノッチがある側は奇数ピン。また、3番ピンを抜いてある場合はわかりやすい。
フラットケーブルをねじってある側がドライブ側なので、逆挿しでマザーボードに接続するとだめ。
3モード3.5インチドライブの場合は、2番ピンをGNDに直結してやるとドライブの回転数が360RPMになる。その状態で、512x15x80x2であればsetfdprm /dev/fd0 1200/1200、1024x8x77x2の場合は、setfdprm /dev/fd0 sor1232とすれば、mount /dev/fd0 /mntでマウントできる。フォーマットの一覧は/etc/mediaprmにある。
1024セクタのイメージ化は、ddrescue -d -b1024 -r1 /dev/fd0 image.dsk image.map。
イメージ化できたら、DiskExplorer(editdisk)で開くことができる。
PC-6000の1DDは、setfdprm /dev/fd0 dd ss ssize=256 sect=16 cyl=80、ddrescue -d -b256 -r1 /dev/fd0 image.dsk image.mapでイメージ化できる。
getfdprm -a /dev/fd0で、すべてのパラメータが確認できる。
setfdprmは、ドライブにフロッピーを挿入した状態で実行する。512x15x80x2であれば、mknod /dev/fd0h1200 b 2 8でノードの作成もできる。マイナー番号は、fdc番号1ビット、フォーマット番号5ビット、ドライブ2ビット。fdc番号とドライブ番号は0、フォーマット番号は2なので、2x4=8。

mtoolsは便利だが、ファイル名に漢字(Shift JIS)が使用してあると、mdirがエラーとなる。その場合は、mount -o loop,codepage=932 -tvfat image.dsk /mnt; ls /mnt

コメント