
Ubuntu日本語フォーラム

ログインしていません。
お世話になります。
SDカードにイメージファイルの書き込みに失敗するとき(発生率は70%程度)があります。
これについて、ご相談したく、投稿しました。
よろしくお願いします。
以下のように書き込みしています。
1.アンマウントする
sudo umount /dev/sdb
2.ddで書き込みする
sudo dd if=イメージファイルのパス of=/dev/sdb conv=sync
3.書き込みしたSDのイメージデータ読み出す(次点でチェックサムを確認するため)
sudo dd if=/dev/sdb of=書き出し先パス
4.チェックサムを計算する⇒OK
md5sum --binary ./3で作成したイメージファイルへのパス
5.マウントしてみる⇒失敗するときがある
sudo mount /dev/sdb1 /media/sd
6.エラーコードを確認
echo $?
32
4のチェックサムまで計算し、問題ないことを確認したにもかかわらず、
作成したSDカードのmountに失敗する時があります。
作成したSDカードは他のLinuxPCでマウントできません。
カードリーダーの不具合を疑いましたが、
Windows上で、ツール「Win32DiskImager」を使ったイメージ書きには成功するため、
現状は、犯人と考えておりません。
<環境>
OS:ubuntu 14.04 LTS(32bit版)
PC LATITUDE E6440
アドバイス、よろしくお願いします。
オフライン
以下、訂正します。
>2.ddで書き込みする
>sudo dd if=イメージファイルのパス of=/dev/sdb conv=sync
conv=fsync (syncではなく、fsync)
オフライン
確認ですが、1から5までを一連の操作として行ったのでしょうか?(途中で他のコマンドなどを実行したり、各操作の間に時間が開いているということはないのですね?)
もし、そうならば、2つほど気がかりな点があります。
まず、SD カードのサイズが大きくない(kernel I/O buffer に使えるメモリーの量よりも小さい)場合には3で書きだしたデーターは kernel 内に buffering された値でカードから読み出されたデータではない可能性が高いです。本当に SD カード上のデーターと比較したいのであればデバイスを再認識させるなど、メモリー上の情報を破棄させる必要があります。reboot すれば確実ですが、もし、USB接続のSDカードアダプターを使っているのなら 14.04 では
udisksctl power-off -d /dev/sdb USBケーブルを抜く しばらく待って(機種にも依りますが10秒もあければ大抵大丈夫です)再びUSBケーブルを入れる
とすれば再認識させられます。
次に、仮にSDカードに情報が正しく書きだされていてメモリー上のデーターとSDカード上のデーターが一致している場合でも、手順5の前にパーティションテーブルの再読み込みが必要です。デバイスを再認識させればこれは再認識の過程で自動的に行われますが、コマンドラインからマニュアルで再読込させるなら
blockdev --rereadpt /dev/sdb
です。
(というか、パーティションテーブルを再読み込みしていないのになぜ30%もうまく行くのかがわかりません。たまたますべてのパーティションテーブルが同じなのでしょうか?)
本題の原因とは関係ありませんが、カードに書き出すべきイメージファイルが既にディスク上にあるのですから私なら md5sum は使わずに 手順 3,4 の代わりに
cmp 元となるイメージファイル /dev/sdb
とします。不一致があった場合にどこで有ったかわかります。
オフライン
一つ書き忘れました。デバイスを再認識させると、デバイス名が変わることがありますので、デバイス名を確かめて適宜変更してください。
オフライン
taka.zoo.n 様
お世話になります。
ご回答ありがとうございます。
大変勉強になりました。
>1から5までを一連の操作として行ったのでしょうか?
⇒おっしゃる通りです。
シェルスクリプトを書いて実行しました。
>SD カードのサイズが大きくない場合には3で書きだしたデーターは kernel 内に buffering された値でカードから読み出されたデータではない可能性が高いです。
⇒結論的には、大丈夫そうです。(4GBのイメージを読み書きしており、メモリーよりもサイズが大きい為。)
とは言え、この視点のチェックを見落としていたのも事実でした。(conv=fsyncの指定で安心していました)
cat /proc/meminfo
Buffersは数十M程度
>仮にSDカードに情報が正しく書きだされていてメモリー上のデーターとSDカード上のデーターが一致している場合でも、手順5の前にパーティションテーブルの再読み込みが必要です。
⇒このご指摘内容が、ほぼ100%の原因だと思います。(他の原因も疑う理由は最後に記述しました。)
手元のマシン(質問時のマシンとは異なる⇒※1)で掲題の現象が起きるのを確認したうえで、
パーテーションテーブルの再読み込みをした結果、無事マウントできました。
※1 質問時のマシンとリーダーは来週月曜日まで、貸し出しており、手元のマシンで評価しました。
>というか、パーティションテーブルを再読み込みしていないのになぜ30%もうまく行くのかがわかりません。
推測ですが、
検証時、空のSDカード(パーテーションテーブルが異なる)に書くパターンと、
一度同じイメージファイルを書き終えたSDカードを挿し直し、書き込みするパターンの2パターンありました。
後者の場合、挿し直した時に読み込まれたパーテーションテーブルをOSが覚えていた為に書き込み後のマウントがうまく行ったのだと思います。・・
>本題の原因とは関係ありませんが、カードに書き出すべきイメージファイルが既にディスク上にあるのですから私なら md5sum は使わずに 手順 3,4 の代わりに
>cmp 元となるイメージファイル /dev/sdb
>とします。不一致があった場合にどこで有ったかわかります。
⇒ありがとうございます。
頂いたアドバイスの方が、便利で合理的ですね。
【他の原因も疑う理由】
イメージ書き込みを終えたSDカードを物理的に挿し直しても、マウントができない時がありました。
(逆にマウントできる時もありました。)
書きミスが起きてしまう時もあるのだと思います。
これについて、もしアドバイスをお持ちでしたら、記載いただけますと幸甚に存じます。
オフライン
mount や partition table の読み込みエラーは /var/log/syslog に残されたエラーメッセージが原因の究明に役立つことが多いです。頻繁に見る必要があるのならご自身を adm グループに追加しておくといちいち sudo しなくとも読めるようになります。
SD カードへの書き込みエラーあるいは読み出しエラーに関しては、私もきちんとした情報を知りたいです。あくまでも「個人の感想」レベルですが、パソコンの SD カードスロットに直接入れた場合(デバイス名 /dev/mmcblk0)、書き込み時の kernel level での retry は書き込み量数十~数百MBに一度程度以上おきるているようです。(mmcblk* の場合は syslog に記録されるので分かるわけですが、USB 経由で sd* として認識されているときに記録されるかどうかは私は知りません。)ただ、この場合は結果として正しいデーターが書かれているようです。問題なのは kernel がまったく error を検出できずに読み出されたデータが異なる場合(いわゆる silent data corruption)で書き込み量50GB~500GBに一度程度起こっているようです。これはユーザープロセスレベルで誤り訂正符号で判明した分だけです。符号の仕様は私が根拠もなく適当に決めたのですり抜けたエラーがどの程度発生しているあるいは発生が見込まれるのかは見当も付きません。「NAND flush error burstness」とかで検索しても cell level の文献がヒットするだけでユーザープロセスから見たエラーの特性に関する文献は見つけることができませんでした。
read/write error はまず SD カード内部の偶発的あるいは cell の劣化に伴うエラーが疑われますが、発生頻度が異様に高ければ soft and/or hard のどこかに問題があることも考えられます。具体的にどの程度の頻度ならという後者も検討すべきかという情報も見つけることができませんでした。
上記はあくまでも一個人の経験に過ぎないことをご理解ください。より詳しい方の follow up をお願い致します。
オフライン
taka.zoo.n 様
アドバイスありがとうございます。
本日、まさに書き込みミスを確認しました。
教えていただいたsyslogログからもエラーを確認しました。
(USBカードリーダーでも確認できました。)
2回連続、しかも異なるSDカードで発生しました。
原因は不明ですが、低い確率とは思えません。
解析はこれからですが、
取り急ぎ、お礼と最初の報告まで。
オフライン
bushin による投稿:
2回連続、しかも異なるSDカードで発生しました。
原因は不明ですが、低い確率とは思えません。
おかしいなぁと思いつつ #1 を読み直してみたらもうひとつ気がかりな点を見つけました。
dd で SD カードに書くときに block size が指定されていません。default は512 byte なので、conv=fsync が指定されていると 512 byte ごとに kernel buffer が flush されてしまいます。(最悪の場合、カードの寿命も縮めます。)block size の値はいくつにすべきかというのは議論がわかれるところです。
私は /sys/block/デバイス名/queue ディレクトリの下の optimal_io_size や max_hw_sectors_kb や discard_granularity の値(cat すれば表示されます)を参考にして決めていますが、optimal_io_size はカードとカードコントローラやカードアダプタが対応していないと 0 になってしまいます。これらのファイルは単位がまちまちなので注意してください。個々の意味はお使いの kernel のソースがあれば Documentation/block/queue-sysfs.txt を見るのが一番確実ですが、kernel.org のここでも最新の kernel での解説が読めます。(これを書いている時点では discard_max_byte 以外には 14.04 kernel(linux-image-3.13.0-83-generic) と本質的な差異はありません。)
「そんな面倒なことしなくとも一律 bs=64k で大差ない」という人もいますし、むしろ私の身の回りでは多数派です(苦笑)。
外しているかもしれませんが、ご参考になれば幸いです。
オフライン
すみません。訂正です。
conv=fsync(と conv=fdatasync)は dd の処理を終了する直前に一度だけ同期処理を行うので block size の指定はメモリーカードへの入出力に影響を与えません。
# oflag=sync の場合と混同してしまいました。
oflag が何も指定されていないので kernel からメモリーカードへの書き出しは dd の bs 指定にかかわらず kernel で buffering されます。従って #8 は今回の問題とは全く関係がありませんのでお詫びして取り消します。申し訳ございません。
オフライン
お世話になります
貴重なアドバイスをありがとうございます。
現時点で、こちらからお出しできる新しい情報はございません。
代替の手段を作成することが優先になっていて、解析が後回しになってしまっております。
しかし、「今後、Linuxを使っていく以上、今回の原因をはっきりしたい」と考えております。
教わるばかりで、こちらからの情報が少なく、心苦しいのですが、以下のご質問にお答えいただけますと幸いです。
【ご質問】
#8で、「最悪の場合、カードの寿命も縮めます」とございますが、
その理由をお聞かせ願えませんでしょうか?(カードの書き込み回数??)
オフライン
bushin による投稿:
#8で、「最悪の場合、カードの寿命も縮めます」とございますが、
その理由をお聞かせ願えませんでしょうか?(カードの書き込み回数??)
はい、書き込み回数です。
oflag=sync や oflag=direct の場合は dd のブロックサイズごとに device driver に write(oflag=sync ならそれに加えて flush)が device driver に送られます。 bs を適切に設定しないとユーザーは一度しか書いていないと思ってもメモリーセルへの書き込み回数が膨れ上がってしまう可能性があります。この比率 (write amplification; WA)は例えば dd の bs が default(512B) でSD カードのページサイズが 2KB なら最悪 4倍、16KB なら最悪 32倍です。「最悪」と書いたのは実際には SD カード内部でもバッファリングされるからですが、この部分が具体的にどのような処理になっているかは不明です。
conv=fsync の場合は kernel の buffering のため dd に与える bs の値は WA には影響しません。
オフライン
taka.zoo.n 様
ご回答ありがとうございます。
ddの事、SDカードの事、大変勉強になりました。
解析は前に進んでおりませんが、一点ご報告があります。
#1で、ディスクイメージを描いた後に、マウントしてファイルのコピー処理を行っていたのですが、
コピー後のファイルが壊れていた時があった事が分かりました。(コピー後、cmpしているのですが、検出できていませんでした。)
ディスクイメージのコピーだけではなく、ファイルのコピー処理にエラーがあった事になります。
コピー処理には、コマンドcpを使用していました。
以前、taka.zoo.n様がおっしゃっていたように、ハードも含めて検証しないといけない雰囲気が濃くなっています。
問題が発生したPCは運用中の2台で、同じ型、同じSDカードを使っていました。
#1とは、別のPCで同じ事を始めましたが、未だ現象は発生していません。
また、何かありましたら、ご連絡します。
オフライン
お世話になります。
#3で教えていただいたkernel I/O bufferですが、コピー、読み出し時に bufferを使用しないようにサイズの変更をする事は可能でしょうか?
オフライン
私は使った経験がないのですが:
man dd か dd --help を実行すれば iflag や oflag に nocache というオプションがあることが分かりますが、これだけではどこのキャッシュがどう破棄されるのか分からないですよね。
info dd で表示されるオンラインマニュアルには具体例つきの解説があり、必読かと思われます。
あと dd のソースを読むとオンラインマニュアルでキャッシュといっているのは主に kernel 内のキャッシュの事で posix_fadvise を使って破棄される(あくまでもアドバイスであって仕様上は必ず実行されることが保証されるわけではない)ことが分かります。
# 老婆心ながら念のため:info 自体の使い方が分からない、あるいは分からなくなった場合は info の実行中に ? を押してください。
# help が表示されます。
オフライン
bushin による投稿:
#3で教えていただいたkernel I/O bufferですが、コピー、読み出し時に bufferを使用しないようにサイズの変更をする事は可能でしょうか?
ふと疑問に思ったのですが、dd で対処する必要があるのでしょうか?もし「dd で SD カードイメージを書き込むときに kernel に cache されたデーターを破棄させて、内容を比較するときにカードアダプタから read させる」のでよければカードイメージを書き込んだ後に
blockdev --flushbufs デバイス名
を実行すればそのデバイスに対応付けられた kernel cache をすべて破棄できるはずです。「はずです」と書いたのはデバイスドラーバーが独自の処理を行い、kernel cache が全く処理されない場合があるからです。(ですが、/dev/sd* ではそのようなことはなく、常に cache が破棄されるというのが私の理解です。)
なお、ご質問の主旨からは外れるかもしれませんが、この方法や dd に nocache を渡すなどで kernel の cache を破棄しても、USB-SDカードアダプターに cache されたデーターは影響を受けません。従って SD カードからの読み出しを確実に担保することはできないと思います。
オフライン
taka.zoo.n 様
お世話になります。
情報の取り方の見本を提示していただき、ありがとうございました。
info dd で確認すると、2つの方法がありそうでした。
oflag=nochace
oflag=direct
実際に2つの方法で コピー処理を行ってみると、
nochaceをしてもキャッシュ容量は少しずつ増えていましたが、directの場合は、ほとんど変わりませんでした。
(※cat /proc/meminfo Buffersで確認)
その代わり、directの場合は、nochaceに比べて、何十倍もの時間がかかりました。(書き込み速度 1kbyte程度/秒)
キャッシュしてない為に時間がかかったのかと思いましたが、それにしても時間がかかりすぎである気もするので、
directの使い方を間違えているのかも知れません.
もうすこし、資料を読んでみようと思います。
オフライン
taka.zoo.n 様
お世話になります。
#15のご回答、ありがとうございます。
#16は#14に対する返答でした。(更新を見逃してしまってました。)
>blockdev --flushbufs デバイス名
>を実行すればそのデバイスに対応付けられた kernel cache をすべて破棄できるはずです。
ありがとうございます。
自分でも確認をしたく、カーネルソースをダウンロードして読んでみました。
それらしい箇所(BLKFLSBUF時、最後にcleancache_invalidate_inodeしている)を発見しました。
>なお、ご質問の主旨からは外れるかもしれませんが、この方法や dd に nocache を渡すなどで kernel の cache を破棄しても、USB-SDカードアダプターに cache されたデーターは影響を受けません。従って SD カードからの読み出しを確実に担保することはできないと思います。
⇒だから、#3のご回答でUSBケーブルを抜き、10秒待ち、接続するように、教えてくださったのですね
恥ずかしながら、理解できていなかったです。。
このご忠告の部分、今後のやり方を検討するのに、かなり重要なアドバイスになりました
感謝しております。
オフライン
bushin による投稿:
directの場合は、nochaceに比べて、何十倍もの時間がかかりました。(書き込み速度 1kbyte程度/秒)
キャッシュしてない為に時間がかかったのかと思いましたが、それにしても時間がかかりすぎである気もするので、
directの使い方を間違えているのかも知れません.
ブロックサイズを設定していないか、値が小さすぎるということはありませんか?oflag に direct を含めた場合は必ず bs= で適切なブロックサイズを指定してください。とりあえず bs=64k あたりが、最適ではないかもしれませんが、oflag に direct を指定しなかった場合と似たような性能が期待できます。
bs を指定しなければならない理由は #11 に書いたとおりメモリーセルの寿命を縮めるからですが、write コマンド回数の増加が書き込み大幅な速度の低下を引き起こしている可能性もあります。このあたり、SDカードアダプターやSDカード自体の内部処理にも依存するのでお使いの環境で試してみてください。
オフライン
taka.zoo.n 様
お世話になります。
ご回答ありがとうございます。
>ブロックサイズを設定していないか、値が小さすぎるということはありませんか?
⇒おっしゃる通りです。
bsは何を意味するのかを、はっきり分かっておりませんでした。
最後の方に質問を記載しました。ご回答頂けますと、幸いです。
bsの設定方法について調べたことを以下に記載しました。
**************************************************************************************************************************
〔私なりの結論〕
bsは、SDカードに書き込む際の1ブロック当たりのサイズに影響する値。
ただし、実際には、SDの規格(ブロックサイズレジスタ)や、実際に使用するハードウェアに制限され、適切な値に設定しないと、十分なパフォーマンスが得られないことがある。
〔結論への過程〕
SDアソシエーションが発行しているSDホストコントローラーの規格書を読みました。
ブロックサイズレジスタというレジスタがあり、1データ当たりのブロックサイズを決める物のようで、指定できるサイズは決まっている事を知りました
ddのbsでどんな値を設定しようと、結局書き込み時には、このレジスタで設定するサイズに限られるのではと、考えました。
taka.zoo.n 様が回答くださった64kも此処から選択されているのではと推測しました。
(1)まず、bsをレジスタで設定できるサイズに設定し、ddで約400MBのデータの書き込み処理を行ってみました。(oflag =direct )
結果、64kが最も早く書き込めました。
32k・・・4.3MB/s
64k・・・10.3MB/s・・・・・・最も早い
128k・・・6.3MB/s
256k・・・7.5MB/s
512k・・・7.6MB/s
(2)続いて、64kに近い63k,65kで書いてみました。結果、64kに比べ、スピードが大きく落ちました。(oflag =direct )
(ドライバ等のCPU処理が入るため?)
63k・・・6.1MB/s・・・・・・64k時と比べ、速度が40%減。
65k・・・6.5MB/s
(3)なぜ、64kが最も早かったのかを考えました。
#9で教えていただいた、max_hw_sectors_kbを確認すると、120kbyteでした。
レジスタに設定できるサイズの内、120kbyte以下、且つ最大の値は64kであったために64kなのではと考えました。
(Linuxが max_hw_sectors_kbをどうやって設定するかは調べていません。。)
120kbyte・・・7.6MB/s
(4)最後に、oflag =direct指定無、bs指定無で書き込みをしてみました。(conv=fsync)
結果、そこそこのパフォーマンスを得られたものの、oflag =direct指定、bs=64kには届きませんでした。
(却って、キャッシュする分時間がかかる?)
conv=fsync・・・・8.6MB/s
※計測値
ddの結果を記載。
それぞれ2,3回繰り返し、ばらつきが小さく、傾向は変わらないことを確認したうえでの結果。
**************************************************************************************************************************
【ご質問】
taka.zoo.n様がおっしゃる通り、bs=64kにしたことで、oflag にdirect を指定しなかった場合と同等以上の書込速度を得られました。(最も効果的な値のようでした。)
64kbyteと、ご指定になった理由をお聞かせ願えませんでしょうか?
また、厚かましく恐縮ですが、上記に記載した実験、私の結論に対しましてもコメントを頂けますと、幸いです。(長ったらしい文で、申し訳ありません。)
オフライン
>ddのbsでどんな値を設定しようと、結局書き込み時には、このレジスタで設定するサイズに限られるのではと、考えました。
私は SD カードを直接制御した経験はありませんが、WRITE_MULTIPLE_BLOCK を使って SET_BLOCKLEN の値(SDHC, SDXC なら512固定)の整数倍サイズで書き込めると理解しています。device driver への write request がSDカードに対するどの命令にどのように変換されるかはカードアダプター依存(かつユーザーにとってはブラックボックス)だと思います。
>bsは、SDカードに書き込む際の1ブロック当たりのサイズに影響する値。
巡り巡って一つのSD カードコマンドで転送されるデータ量に影響するという意味でこれは正しいですが、直接的には oflag=direct のときの bs は(出力先デバイスの最大転送量以下の場合)kernel が device driver の write request で一度に渡すデータ量となります。
ところで write request を出してから kernel が処理を続行しユーザープログラムに制御が戻る時点で device への書き出しは完了している必要はありません。カードアダプターが大きなバッファーを持っている場合には kernel が認識している転送時間と SD カードが転送処理を終えるまでの時間に差がでます。カードアダプターは SD への書き込みが完了するまで device driver を待たせるかもしれません。この場合は2つの時間に差はほとんどでないはずです。
どちらの時間が問題なのかは bushin さんの目的に依存します。
kernel が最後の write request から戻るまでの時間が必要なら dd には oflag=direct だけ(conv は何も指定しない)を渡して測定すべきです。
SD カードが書き込み完了を報告してくるまでの時間が必要ならdd には oflag=direct conv=fsync の2つを渡して測定すべきです。
(fdatasync は device driver に flush request を出し、これは仕様上は出力の完了を待つことになってるため。)
いずれにせよ、論より証拠で、この実験環境の場合 bs=64k を使わない理由は見当たりません。ただ繰り返しになりますが、最適サイズはカードアダプターに依存します。
>64kbyteと、ご指定になった理由をお聞かせ願えませんでしょうか
optimal_io_size から意味のある値が得られればそれを使いますが、そうでない場合、64k には経験則以上の確たる根拠はありません。実験した範囲では kernel が buffering する場合には max_sectors_kb が 128k ても device driver へは 64k ごとに write request されたので無難な値だと思います。
あと、私の場合、PC のカードスロットで SD カードを使っています。カードの page size は分かりませんでした(physical_block_size は主旨に反して 512でした)が消去単位は /sys/block/mmcblk0/queue/discard_granularity から 4MiB と分かりましたので page size はこの約数のどれかです。他方 dd の bs が page size の倍数である限り多少(多少というのはかなり主観的ではありますが)遅くなっても write amplification は起きないはずです。WA が起きれば書き込み速度は遅くなりますし、カードは早く劣化するし、エラーも起きやすくなるので、WA を起こさないよう大きめで 64k としました。
大きめと言っても限度があり、極端に大きな 4M とかではたとえ kernel buffering を行ってもなぜかタイムアウトエラーが増えました。原因は私の能力では解明できませんでした。
オフライン
taka.zoo.n様
お世話になります。
ご回答いただきまして、ありがとうございます。
本当に参考にさせて頂いてます。
>SD カードが書き込み完了を報告してくるまでの時間が必要ならdd には oflag=direct conv=fsync の2つを渡して測定すべきです。
>(fdatasync は device driver に flush request を出し、これは仕様上は出力の完了を待つことになってるため。)
conv=fsync指定でSDからの書き込み完了まで待つ事を知りませんでした。
データを物理的に何処まで書いたのか把握できることは重要なポイントでして、今回だけではなく、今後にも役に立ちそうです。
>device driver への write request がSDカードに対するどの命令にどのように変換されるかはカードアダプター依存(かつユーザーにとってはブラックボックス)だと思います。
この点を念頭に入れながら、もう少し、勉強を進めたいと思いました。
先ずは、お礼まで。
オフライン
> >SD カードが書き込み完了を報告してくるまでの時間が必要ならdd には oflag=direct conv=fsync の2つを渡して測定すべきです。
> >(fdatasync は device driver に flush request を出し、これは仕様上は出力の完了を待つことになってるため。)
>
> conv=fsync指定でSDからの書き込み完了まで待つ事を知りませんでした。
誤解を招くような書き方ですいませんでした。conv=fsync は SD への書き込み完了を待つための必要条件ではありますが、十分条件ではありません。
特に SDカードアダプターを使っている場合にはデバイスドライバーが検出できるのはカードアダプターからの完了のみです。
(書き出しを完全に保証する方法を私は知りません。sync(2) の man page にも
This still does not guarantee data integrity
とあります。)
オフライン
taka.zoo.n様
お世話になります。
>特に SDカードアダプターを使っている場合にはデバイスドライバーが検出できるのはカードアダプターからの完了のみです。
追っての情報ありがとうございます。
もとは、私がmmcblkとsd*の違いをよく理解できていないために起きた勘違いでした。
カードリーダーを使用したとき、SDカードをUSBマスストレージデバイスとして認識していて、
SDを直接制御していないためにブラックボックスになってしまうという事ですね。
壊れたSDカードリーダーを持っていたので、分解してみると、
Alcor micro社のAU6371というチップが載っていました。このようなチップと通信していたのですね。
当然、USB MASS Storage対応でした。
オフライン