2016年3月4日金曜日

OpenBlocks IoT EX1 で microSDXC メモリーカードを利用する

OpenBlocks IoT EX1 には microSD メモリーカードスロットが用意されています。このスロットを使って実際に microSDXC メモリーカードを読み書きする方法について説明します。

OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

はじめに


OpenBlocks IoT EX1 (以下EX1)には、筐体内部に microSD メモリーカードスロットがあり microSDXC メモリーカード(以下 microSDXC)を利用できますが、実は、市販されている microSDXC をそのまま利用するためには、EX1側で少し設定作業が必要になります。

ここでは microSDHC メモリーカード(以下 microSDHC)と比べながら、microSDXC を EX1 で読み書きする方法について説明しましょう。

本文が長くなったので最後にまとめを用意してあります。ざっくりと概要を知りたい方は最後のまとめをお読みください。

microSDXC と miroSDHC


今回用意したメモリーカードは次の2枚で、左側の黒いカードが microSDHC 16GB、右側の上部が赤いカードが microSDXC 64GB です。


microSDHC の利用


まず microSDHC を EX1 にマウントしてみましょう。

EX1 で microSD メモリーカードを利用するために EX1 本体の蓋を開ける必要がありますが、蓋を固定してあるネジを外す際は次のようなグリッップの太いしっかりした0番のプラスドライバーを利用してください。


よくある細い精密ドライバーでは力が十分にかからず、ネジを開けられないことがあります。


この写真は microSDHC を EX1 に差し込んでいる途中の状態です。このままカチっと音がするまで奥に差し込みます。完全に差し込むと次のようになります。


ここに刺した microSDHC のデバイス名は、/dev/mmcblk1 となります。

次の例はまだ microSDHC カードを刺していない状態で、デバイスが存在しません。

# ls -l /dev/mmcblk1*
ls: cannot access /dev/mmcblk1*: No such file or directory

microSDHC を刺すと、次の通りデバイスが現れます。

# ls -l /dev/mmcblk1*
brw-rw---T 1 root floppy 179, 128 Feb 24 14:12 /dev/mmcblk1
brw-rw---T 1 root floppy 179, 129 Feb 24 14:12 /dev/mmcblk1p1

ここで /dev/mmcblk1 が microSDHC カード全体を表し、/dev/mmcblk1p1 が microSDHC の最初のパーティションを表していて、実際の記憶領域はこのパーティションとなります。

では実際に /dev/mmcblk1p1 をマウントしてみましょう。

# mount /dev/mmcblk1p1 /mnt     ← microSDHC パーティションのマウント
# mount | fgrep /mnt            ← マウントできたかどうかの確認その1
/dev/mmcblk1p1 on /mnt type vfat (rw,relatime,fmask=0022, dmask=0022,codepage=437,iocharset=iso8859-1, shortname=mixed,errors=remount-ro)
# df -h /mnt/.                  ← moountできたかどうかの確認その2
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk1p1   15G  2.2M   15G   1% /mnt

この通りマウントできています。あとは /mnt ディレクトリの配下で microSDHC のデータを読み書きできます。

ファイルのコピー等必要な作業が終わったら microSDHC を本体から抜きますが、抜く前には必ず unmount します。

# umount /mnt

これで安全に microSDHC カードを安全に本体から抜くことができます。

microSDXC の利用


今度は microSDXC で同様の作業を行ってみましょう。

まず本体に microSDXC カードを挿入します。



写真は差し込み途中のものですが、奥までしっかり差し込んで下さい。正しく差し込めば次のように microSDXC のデバイスが現れます。microSDXC でもデバイス名は microSDHC と同じ名前です。

# ls -l /dev/mmcblk1*
brw-rw---T 1 root floppy 179, 128 Feb 24 14:42 /dev/mmcblk1
brw-rw---T 1 root floppy 179, 129 Feb 24 14:42 /dev/mmcblk1p1
#

ではマウントしてみましょう

# mount /dev/mmcblk1p1 /mnt
mount: unknown filesystem type 'exfat'
#

exfatは知らないファイルシステムだというエラーメッセージが表示されました。df コマンドや、mount コマンドの結果を見ても次のように microSDXC のマウントはできていません。

# mount | fgrep /mnt
# df /mnt/.
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/root         198337 156166     31931  84% /
#

マウントに失敗した理由は、市販の microSDXC は exFAT 形式でフォーマットされていて、OpenBlocks IoT Familyの標準の状態では exFAT 形式のドライバを持っていないからです。

これに対して microSDHC は FAT32 形式でフォーマットしてあり、元々カーネルがドライバを持っています。

exFAT 形式のディスクを読み書きするためのドライバとツール類は、Debianのパッケージで用意されています。次のように exFAT 用のパッケージを探してみましょう。

# apt-get update             ← パッケージインデックスの更新
Hit http://ftp.plathome.co.jp ./ Release.gpg
---------- 中略 ---------- 中略 ----------
Hit http://cdn.debian.or.jp wheezy-updates/main Translation-en
Reading package lists... Done
#
# apt-cache search exfat     ← exFAT関係のパッケージの検索
exfat-utils - utilities to create, check, label and dump exFAT filesystem
exfat-fuse - read and write exFAT driver for FUSE

#

exfat-utils と exfat-fuse が見つかりました。ここでは exfat-utils をインストールします。exfat-fuse 並びに他に必要なパッケージが一緒にインストールされます。

# apt-get install exfat-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  exfat-fuse fuse libfuse2
The following NEW packages will be installed:
  exfat-fuse exfat-utils fuse libfuse2
0 upgraded, 4 newly installed, 0 to remove and 23 not upgraded.
Need to get 348 kB of archives.
After this operation, 720 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
---------- 中略 ---------- 中略 ----------
Done.
udev active, skipping device node creation.
Setting up exfat-fuse (0.9.7-2) ...
Setting up exfat-utils (0.9.7-2) ...
#

これで環境が整ったので microSDXC をマウントしてみます。

# mount /dev/mmcblk1p1 /mnt
FUSE exfat 0.9.7
# mount | fgrep /mnt
/dev/mmcblk1p1 on /mnt type fuseblk (rw,nosuid,nodev,relatime, user_id=0,group_id=0,allow_other,blksize=4096)
# df -h /mnt/.
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk1p1   60G   26M   60G   1% /mnt
#

マウントできたので、簡単に読み書きしてみます。

# cd /mnt
# ls
# touch test
# ls
test
# ls -l test
-rwxr-xr-x 1 root root 0 Feb 24 15:39 test
#

microSDXC を抜く時もアンマウントを忘れないようにしてください。

# umount /mnt

microSDXC を EXT4 形式で使う


microSDXC は exFAT 形式のまま使うには exFAT 形式サポート用のドライバとユーティリティが必要ですが、カード側をカーネルがサポートしているファイル形式に変換してから使う方法もあります。ここでは Linux で標準的な EXT4 形式でフォーマットしてみましょう。

# fdisk /dev/mmcblk1     ← fdisk コマンドでパーテションテーブルを変更する

Command (m for help): p  ← 現在の状態を確認する

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 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
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360    7  HPFS/NTFS/exFAT

Command (m for help): t    ← パーテションタイプを変更
Selected partition 1
Hex code (type L to list codes): 83  ← Linux の "83" を指定する
Changed system type of partition 1 to 83 (Linux)

Command (m for help): p   ← 変更結果を確認する

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 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
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360   83  Linux

Command (m for help): w   ← 変更を書き込んで fdisk を終了
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# fdisk -l /dev/mmcblk1   ← 改めて変更結果を確認

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 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
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360   83  Linux
#
# mkfs -t ext4 /dev/mmcblk1p1 ← ext4ファイルシステムの作成
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3899392 inodes, 15587840 blocks
779392 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
476 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

# mount /dev/mmcblk1p1 /mnt ← マウントする
# mount | fgrep /mnt
/dev/mmcblk1p1 on /mnt type ext4 (rw,relatime,data=ordered)
# df /mnt/.
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/mmcblk1p1 61241372 53064 58054356   1% /mnt

まとめ


OpenBlocks IoT EX1 で microSDXC を利用する方法をまとめます。
  • 市販の microSDXC は exFAT 形式でフォーマットされている
  • exFAT 形式はそのままでは Linux のカーネルがサポートしていないため、次のいずれかの対応が必要となる
    • exFAT 形式のドライバとユーティリティーをインストールして利用する
    • microSDXC のフォーマットを EXT4 などのLinux のファイルシステムに変換してから利用する
microSD メモリーカードはシステム運用に十分な信頼性を確保できない為、ファイル交換やログ保存用等の限定用途で利用するのが安全です。

また OpenBlocks IoT BX1, BX3 などでも、USB 二股ケーブルとUSBのメモリカードリーダライタを使って microSDXC を読み書きする場合には、同様の手続きが必要になります。

0 件のコメント:

コメントを投稿