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

GA-E7AUM-DS2Hはフロッピードライブが1つだけ接続できるので、BIOSで5.25ドライブに変更し、ケーブルを3.5ドライブから差し替える。
5.25インチの2Dは、下記のコマンドで確認
fdrawcmd short repeat=10 readid 0 need_seek track=10 rate=1
0x00 0x00 0x00 0x05 0x00 0x09 0x02 no_disk_change
5.25インチの2Dは2種類あるので、注意。
標準は、512 type, 9 sectors, 40 cylinders, 2 heads, 360Kで、そのままmdirが使用できる
バックアップは、rm -f map; ddrescue -r2 -d /dev/fd0h360 image.d360 map
5.25インチの2Dは、8セクタの320K形式はそのままではmdirがエラーになる。
512 type, 8 sectors, 40 cylinders, 2 heads, 320K
バックアップは、ディスクを挿入した状態で、
setfdprm /dev/fd0 NEC320
rm map; ddrescue -r1 -d /dev/fd0 image.d320 map
setfdprm後は、mdirも使用できる。setfdprmは-pをつけないと、ディスク交換でクリアされる。
getfdprm /dev/fd0の結果は、DS DD sec=8。

5.25インチ2Dの初期MSDOSは256サイズのものもある。これが、512サイズ8セクタの日本式の由来。
256 type, 16 sectors, 40 cylinders, 2 heads, 320K
setfdprm /dev/fd0 DS DD sect=16 cyl=40 ssize=256
rm map; ddrescue -r1 -d /dev/fd0 image.d320 map
mtoolsは利用できない。
CP/M-86の2Dも同じ様にバックアップできる。
cpmtoolsが使えるので、
setfdprm後に、cpmls -l /dev/fd0
または、バックアップ後に、cpmls -l image.d320

5.25インチには、1.25MBフォーマットもある。
1024 type, 8 sectors, 77 cylinders, 2 heads, 1232K
バックアップは、ディスクを挿入した状態で、
setfdprm /dev/fd0 DS HD sect=8 cyl=77 ssize=1024
rm map; ddrescue -r1 -d /dev/fd0 image.d1232 map

FDCのリザルトコード
ST0、0xc0(0:normal, 1:abnormal, 2:invalid, 3:drive not ready), 0x02(1:seek end), 0x01(unit check), 0x08(1:drive not ready), 0x04(current head), 0x03(current drive)
ST1、0x80(1:end of cylinder), 0x20(1:data error), 0x10(1:time out), 0x04(1:no data), 0x02(1:not writable), 0x01(1:no id address mark)
ST2、0x40(1:deleted data address mark), 0x20(1: CRC error), 0x10(1:wrong cylinder), 0x04(1:seek error), 0x02(1:bad cylinder), 0x01(1:no data address mark)

コメント