Help us understand the problem. What is going on with this article?

NetBSDでUSBメモリをフォーマットしてみる

More than 1 year has passed since last update.

NetBSD Advent Calendar 2018、2日目の記事です。
今日はNetBSDを使用した、簡単なTipsを紹介しようと思います。

背景

コンビニに置いてあるコピー機はUSBメモリやSDカード内のデータから印刷することも可能なため、ちょっとした印刷に重宝します。

しかしながら、USBメモリを自分のPCとコンビニのコピー機で使いまわすのは、セキュリティ的にちょっと不安な面もあります。
その都度USBメモリをフォーマットすれば良いという話ですが、WindowsやMacではUSBメモリを接続するとautorunが走ったらどうしよう等々、考えだしたらキリがありません。

そこで、明示的にmountしないとUSBメモリの中身が見られないNetBSD(というかUNIX系OS)でフォーマットを楽に行えるようにすれば良いのではなかろうか、というのが今日のお話の背景になります。

NetBSDでのUSBメモリフォーマット

そもそもNetBSDでUSBメモリのフォーマットはどう行うのか、簡単に手順を解説します。
適当なUSBメモリをNetBSDがインストールされているマシンに接続すると、以下のようなdmesgが確認できます。この例ではUSBメモリが /dev/sd0 というデバイス名で見えています。

$ dmesg
...中略...
sd0 at scsibus0 target 0 lun 0: <JetFlash, Transcend 16GB, 8.07> disk removable
sd0: fabricating a geometry
sd0: 15316 MB, 15316 cyl, 64 head, 32 sec, 512 bytes/sect x 31367168 sectors
sd0: fabricating a geometry

あとは disklabel コマンドで確認したデバイスに対して newfs_msdos を実行します。
newfs_msdos はフォーマット対象のデバイスをキャラクタデバイス名で指定する必要があります。先述した disklabel コマンドの一行目にキャラクタデバイス名(今回のケースでは /dev/rsd0d )が示されているので、それを指定します。

$ # sd0aはブロックデバイス
$ file /dev/sd0a
/dev/sd0a: block special (4/0)
$
$ # rsd0aはキャラクタデバイス
$ file /dev/rsd0a
/dev/rsd0a: character special (13/0)
$
$ # キャラクタデバイスを指定してnewfsする
$ sudo newfs_msdos /dev/rsd0d

フォーマットしたデバイスをmountできることを確認します。

$ sudo mount -t msdos /dev/sd0a /mnt
$ mount | grep \/mnt
/dev/sd0a on /mnt type msdos (local)

ちなみに、ブロックデバイスを指定して newfs_msdos すると以下のエラーになります。

$ # エラーになる例!
$ sudo newfs_msdos /dev/sd0a
newfs_msdos: warning, /dev/sd0a is not a character device

パーティション情報が飛んでしまったUSBメモリをフォーマットする

先述した手順により、USBメモリを使う都度フォーマットすることが可能になります。
しかし、USBメモリにOSのインストールイメージを書き込んでいたものを普通のUSBメモリとしてフォーマットしたいような場合は、パーティション情報が失われているため、 newfs_msdos でエラーになってしまいます。

そのような場合には、以下の手順を実行します。

  • fdiskコマンドでMSDOSパーティションを設定する
  • disklabelコマンドでNetBSDディスクラベルを設定する
  • newfsコマンドでフォーマットを実行する

fdiskコマンドでMSDOSパーティションを設定する

まずはMSDOSパーティションを設定します。今回は以下のようなまっさらなパーティションの状態から手順を実行して行きます。

$ sudo fdisk -u /dev/sd0
Disk: /dev/sd0
...中略...
Partition table:
0: <UNUSED>
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
First active partition: 0
Drive serial number: 86212239 (0x05237e8f)
Which partition do you want to change?: [none]

編集したいパーティションの番号を指定します。今回は「1:」のパーティションを編集してみます。 sysid は6(=MSDOS)、 startsize はデフォルトではUSBメモリの全体のサイズが提示されるので、デフォルト値のまま設定します。

Which partition do you want to change?: [none] 1
The data for partition 1 is:
<UNUSED>
sysid: [0..255 default: 169] 6  # ←sysid(後述)を指定する
start: [0..115cyl default: 63, 0cyl, 0MB] # ←そのままリターンキーを入力
size: [0..115cyl default: 1855425, 115cyl, 906MB] # ←そのままリターンキーを入力
bootmenu: []
The bootselect code is not installed, do you want to install it now? [n]

Partition table:
0: <UNUSED>
1: Primary 'big' DOS, 16-bit FAT (> 32MB) (sysid 6)
    start 63, size 1855425 (906 MB, Cyls 0-115/127/12)
        PBR is not bootable: All bytes are identical (0x00)
2: <UNUSED>
3: <UNUSED>
First active partition: 0
Drive serial number: 86212239 (0x05237e8f)
Which partition do you want to change?: [none]

ちなみに、sysidの一覧は fdisk -l で確認できます。今回は 006 Primary 'big' DOS, 16-bit FAT (> 32MB) を指定したいので、 sysid は「6」になります。

$ fdisk -l | grep DOS | grep FAT
001 Primary DOS with 12 bit FAT
004 Primary DOS with 16 bit FAT <32M
006 Primary 'big' DOS, 16-bit FAT (> 32MB)
011 Primary DOS with 32 bit FAT
012 Primary DOS with 32 bit FAT - LBA
014 DOS (16-bit FAT) - LBA

設定が済んだら"Should we write new partition table?"で「y」を指定してパーティション情報を書き込みます。

We haven't written the MBR back to disk yet.  This is your last chance.
Partition table:
0: <UNUSED>
1: Primary 'big' DOS, 16-bit FAT (> 32MB) (sysid 6)
    start 63, size 1855425 (906 MB, Cyls 0-115/127/12)
        PBR is not bootable: All bytes are identical (0x00)
2: <UNUSED>
3: <UNUSED>
First active partition: 0
Drive serial number: 86212239 (0x05237e8f)
Should we write new partition table? [n] y

disklabelを設定する

次はNetBSDディスクラベルの設定です。今回の例では a: のNetBSDパーティションを設定します(fdiskのパーティションと紛らわしいので、以降は「NetBSDパーティション」と表記します)。

$ sudo disklabel -i sd0
Enter '?' for help
partition>P
4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  31367168         0     4.2BSD      0     0     0  # (Cyl.      0 -  15315)
 d:  31367168         0     unused      0     0        # (Cyl.      0 -  15315)

編集したいNetBSDパーティション名を指定します。 Filesysytem type には MSDOS を指定します。 startoffset はデフォルトでディスク全体を指定した状態になっているので、そのままデフォルト値を使用します。

$ sudo disklabel -i sd0
...中略...
partition>a
Filesystem type [4.2BSD]: MSDOS # ← ファイルシステムタイプ(後述)を指定する
Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: # ←そのままリターンキーを入力
Partition size ('$' for all remaining) [15316c, 31367168s, 15316M]: # ←そのままリターンキーを入力
 a:  31367168         0      MSDOS                     # (Cyl.      0 -  15315)

P コマンドでNetBSDパーティションの状態を確認できます。ちゃんと設定が反映されていますね。

partition>P
4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  31367168         0      MSDOS                     # (Cyl.      0 -  15315)
 d:  31367168         0     unused      0     0        # (Cyl.      0 -  15315)

あとはNetBSDパーティション情報を W コマンドで書き込みます。
Q コマンドでdisklabelコマンドを終了させ、準備は完了となります。

partition>W
Label disk [n]?y
Label written
partition>Q

あとは先ほどの例と同じく、 newfs_msdos コマンドでフォーマットします。

$ sudo disklabel sd0
# /dev/rsd0d:
...中略...
4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  31367168         0      MSDOS                     # (Cyl.      0 -  15315)
 d:  31367168         0     unused      0     0        # (Cyl.      0 -  15315)
$
$ sudo newfs_msdos /dev/rsd0d

MSDOS領域がマウントできることが確認できました。

$ sudo mount /dev/sd0a /mnt
$ mount | grep \/mnt
/dev/sd0a on /mnt type msdos (local)
$ df -h | grep \/mnt
/dev/sd0a           15G        32K        15G   0% /mnt

まとめ

NetBSDでUSBメモリをフォーマットする方法を紹介しました。
通常は newfs_msdos でフォーマットするだけで良いのですが、USBメモリにOSイメージ等を書き込んだものを再利用する場合には、 fdiskdisklabel によるMSDOS/NetBSDパーティションの設定を行う必要があるため、その手順も併せて紹介しました。

明日の記事ではNetBSDのカーネルモジュールについて紹介できればと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした