ブロックデバイス

May 05, 2018

ブロックデバイス

ブロックデバイスとは、単なるファイルの読み書き以外にランダムアクセスができるデバイスのことであり、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  

上記から、ちゃんとファイルの中身が更新されていることがわかる。


 © 2023, Dealing with Ambiguity