ブロックデバイス
ブロックデバイスとは、単なるファイルの読み書き以外にランダムアクセスができるデバイスのことであり、HDD や SSD などのストレージデバイスがそれにあたる。
ブロックデバイスは通常、直接アクセスするものではなく、そこにファイルシステムを作成し、それをマウントすることでファイルシステム経由で使用する。
ブロックデバイスを直接操作するのは以下のような場合となる。
- パーティションテーブルの更新 (parted コマンド等)
- ブロックデバイスレベルのデータのバックアップ/リストア
- ファイルシステムの作成
- ファイルシステムのマウント
- fsck
ブロックデバイスを直接操作する
通常は行わないが、今回は実験目的でブロックデバイスを直接操作してみる。
まずは、新規ブロックデバイス上に適当にパーティションを作成する。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvdc 202:32 0 300G 0 disk
xvda 202:0 0 300G 0 disk
└─xvda1 202:1 0 300G 0 part /
xvdb 202:16 0 300G 0 disk
$ sudo parted /dev/xvdb mklabel GPT
Information: You may need to update /etc/fstab.
$ sudo parted /dev/xvdb
GNU Parted 2.1
Using /dev/xvdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mkpart
Partition name? []? primary
File system type? [ext2]? ext4
Start? 0
End? 10485760
Warning: You requested a partition from 0.00kiB to 10485760kiB.
The closest location we can manage is 17.0kiB to 10485760kiB.
Is this still acceptable to you?
Yes/No? Yes
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
...
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdb: 314572800kiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.0kiB 10485760kiB 10485744kiB primary
2 10485761kiB 52428800kiB 41943040kiB extended
(parted) quit
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvdc 202:32 0 300G 0 disk
xvda 202:0 0 300G 0 disk
└─xvda1 202:1 0 300G 0 part /
xvdb 202:16 0 300G 0 disk
├─xvdb2 202:18 0 40G 0 part
└─xvdb1 202:17 0 10G 0 part
で、ファイルシステム作成、マウントし、適当なファイルを作成。
その後、アンマウントする。
$ sudo mkfs -t ext4 /dev/xvdb1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 2621435 4k blocks and 655360 inodes
Filesystem UUID: 2f2f230c-5d15-449e-b18f-065688aba7be
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
$ mkdir mnt
$ mount /dev/xvdb1 ./mnt/
$ echo "hello world" > ./mnt/testfile
$ umount ./mnt/
次にこのファイルシステムの生データを見てみる。
strings コマンドにより、ファイルシステムのデータが入っている /dev/xvdb1 の文字列情報を抽出する。
$ strings -t x /dev/xvdb1
488 /home/ec2-user/mnt
131d s"
22a1020 lost+found
22a1034 testfile
8281000 hello world
ここで、“hello world” という文字列のデータを dd コマンドにより、ブロックデバイスを直接操作することで変更してみる。
$ echo "HELLO WORLD" >testfile-overwrite
$ cat testfile-overwrite
HELLO WORLD
$ dd if=testfile-overwrite of=/dev/xvdb1 seek=$((0x8281000)) bs=1
12+0 records in
12+0 records out
12 bytes (12 B) copied, 0.00109801 s, 10.9 kB/s
$ strings -t x /dev/xvdb1
488 /home/ec2-user/mnt
131d s"
22a1020 lost+found
22a1034 testfile
8281000 HELLO WORLD
$ mount /dev/xvdb1 ./mnt/
$ cat ./mnt/testfile
HELLO WORLD
上記から、ちゃんとファイルの中身が更新されていることがわかる。