KVM関連の操作色々 その1

ディスクの操作がメイン(rawファイル)。

オフセット指定の操作を色々と書いているが、危険な上面倒なので使わないほうが無難。

ディスクイメージの用意

複雑なパーティションは切らない。

空ディスク作成

8Gのディスクを作成。

$ dd if=/dev/zero of=gentoo.img bs=1G count=8 # 8GBのディスク作成
8+0 records in
8+0 records out
8589934592 bytes (8.6 GB) copied, 48.4792 s, 177 MB/s

ちなみに 8589934592 = 8 * 1024 * 1024 * 1024 となる。

fdiskでパーティションを切る

単一パーティションを切る。

ほぼデフォルトでOK。

ブートフラグを立てることを忘れないこと。

$ fdisk gentoo.img
Welcome to fdisk (util-linux 2.22.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xffe6a335.

Command (m for help): p

Disk gentoo.img: 8589 MB, 8589934592 bytes, 16777216 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: 0xffe6a335

     Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
Using default value 1
First sector (2048-16777215, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): 
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set

Command (m for help): p

Disk gentoo.img: 8589 MB, 8589934592 bytes, 16777216 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: 0xffe6a335

     Device Boot      Start         End      Blocks   Id  System
gentoo.img1            2048    16777215     8387584   83  Linux


Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

Disk gentoo.img: 8589 MB, 8589934592 bytes, 16777216 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: 0xffe6a335

     Device Boot      Start         End      Blocks   Id  System
gentoo.img1    *       2048    16777215     8387584   83  Linux

Command (m for help): w
The partition table has been altered!

Syncing disks.

このSector sizeとStart sectorの値が下に出てくるOffsetに関わってくる。

rawイメージファイルをループバックとして設定

空いてるループバックデバイスを探す。

$ losetup -f
/dev/loop0

オフセットを指定(Sector size * Start sector)してループバック設定する。

$ losetup -o $(( 512 * 2048 )) /dev/loop0 gentoo.img

今回はext4でフォーマットする。

$ mkfs.ext4 /dev/loop0

ループバックを解除する。

$ losetup -d /dev/loop0

フォーマット済みのrawディスクのマウント

オフセットを指定(Sector size * Start sector)してマウントする。

$ mount -o loop,offset=$(( 512 * 2048 )) gentoo.img /mnt/gentoo

これで仮想マシンを立ちあげなくとも、Gentooのインストールが可能。

中のファイル救出等にも使える。

rawディスクのコピー

Sparseファイルにせずにコピーする。

$ cp --sparse=never src.img dst.img

ディスクの容量拡張

※無保証。

ディスクファイルの末尾に空白領域の追加

追加したいサイズを指定する。

$ dd if=/dev/zero bs=1G count=2 >> gentoo.img # 2GB追加

パーティションの切り直し

fdiskで一旦パーティション削除後、大きいサイズで取り直す。

開始位置は合わせる必要あり。

$ fdisk gentoo.img

Welcome to fdisk (util-linux 2.22.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk gentoo.img: 10.7 GB, 10737418240 bytes, 20971520 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: 0xdd555529

    Device Boot       Start         End      Blocks   Id  System
gentoo.img    *        2048    16777215     8387584   83  Linux

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
Using default value 1
First sector (2048-20971519, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): 
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): p

Disk gentoo.img: 10.7 GB, 10737418240 bytes, 20971520 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: 0xdd555529

    Device Boot      Start         End      Blocks   Id  System
gentoo.img            2048    20971519    10484736   83  Linux

Command (m for help): a
Partition number (1-4): 1

Command (m for help): w
The partition table has been altered!

Syncing disks.

空いてるループバックデバイスを探す。

$ losetup -f
/dev/loop0

オフセットを指定(Sector size * Start sector)してループバック設定する。

$ losetup /dev/loop0 -o $(( 512 * 2048 )) gentoo.img 

ファイルシステムのチェックを走らせる。

$ e2fsck -f /dev/loop0
e2fsck 1.42.7 (21-Jan-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 267397/524288 files (0.1% non-contiguous), 685111/2096896 blocks

ファイルシステムの拡張を行う。

$ resize2fs /dev/loop0
resize2fs 1.42.7 (21-Jan-2013)
Resizing the filesystem on /dev/loop0 to 2621184 (4k) blocks.
The filesystem on /dev/loop0 is now 2621184 blocks long.

ループバックを解除する。

$ losetup -d /dev/loop0

マウントしてサイズを確認する。

$ mount -o loop,offset=$(( 512 * 2048 )) gentoo.img /mnt/gentoo
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/loop0      9.8G  2.4G  6.9G  26% /mnt/gentoo

アンマウントする。

$ umount /mnt/gentoo

ディスクの縮小

※無保証

オフセットを指定してループバックを設定するところまでは同じ。

ファイルシステムのチェックを行う。

$ e2fsck -f /dev/loop0 
e2fsck 1.42.7 (21-Jan-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 267387/524288 files (0.1% non-contiguous), 685085/2096896 blocks

縮小可能なサイズを知る。

$ resize2fs -P /dev/loop0
resize2fs 1.42.7 (21-Jan-2013)
Estimated minimum size of the filesystem: 1051235

実際に縮小する。今回は最小指定している。

$ resize2fs -M /dev/loop0
resize2fs 1.42.7 (21-Jan-2013)
Resizing the filesystem on /dev/loop0 to 1051235 (4k) blocks.
The filesystem on /dev/loop0 is now 1051235 blocks long.

今回は1051235ブロックに縮小された。1ブロック=4k=4096であるので、実際のサイズは

1051235 * 4096 = 4305858560

となる。(4G程度)

ループバックを解除する。

$ losetup -d /dev/loop0

まだファイルサイズが小さくなったわけではないので、切り詰める作業に入る。

fdiskでパーティションの切り直し。

Sector size = 512の為、現在のext4領域は 4305858560 / 512 = 8409880 Sector となる。

削除 -> 新規 -> End指定(+8409880) -> Bootフラグ立てる -> write

$ fdisk gentoo.img
Welcome to fdisk (util-linux 2.22.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk gentoo.img: 10.7 GB, 10737418240 bytes, 20971520 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: 0xdd555529

    Device Boot       Start         End      Blocks   Id  System
gentoo.img    *        2048    20971519    10484736   83  Linux

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):  
Using default value 1
First sector (2048-20971519, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +8409880
Partition 1 of type Linux and of size 4 GiB is set

Command (m for help): p

Disk gentoo.img: 10.7 GB, 10737418240 bytes, 20971520 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: 0xdd555529

    Device Boot      Start         End      Blocks   Id  System
gentoo.img            2048     8411928     4204940+  83  Linux

Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

Disk gentoo.img: 10.7 GB, 10737418240 bytes, 20971520 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: 0xdd555529

    Device Boot       Start         End      Blocks   Id  System
gentoo.img    *        2048     8411928     4204940+  83  Linux

Command (m for help): w   
The partition table has been altered!

Syncing disks.

ファイルの後ろの領域を削除する。

End Sectorは8411928なので、(8411928 + 1) * 512 = 4306907648 バイト必要となる。

$ truncate -s 4306907648 gentoo.img

念のため、一度ループバックを設定し、e2fsck -f でチェックする。

$ e2fsck -f /dev/loop0 
e2fsck 1.42.7 (21-Jan-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 267387/270336 files (0.1% non-contiguous), 668642/1051235 blocks

おまけ

縮小に関して

KNOWN BUGS The minimum size of the filesystem as estimated by resize2fs may be incorrect, especially for filesystems with 1k and 2k blocksizes.

と書いてあり、最小サイズの見積もりは余り信用出来ない模様。最小サイズから少し多めに取って縮小したほうが良いかもしれない。

comments powered by Disqus
カテゴリ
タグ
月別アーカイブ