0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qemuイメージのオーバーレイ(差分)機能を利用した、多数同時アクセス可能な、iSCSIターゲットのホスティングの覚え書き

Last updated at Posted at 2025-05-16

はじめに、どういったケースに役立つのか?

この記事は多数のPCを管理するケースで、
「同じ内容のドライブを多数PCで使用する」
「簡単にドライブの変更を一括適応したい」
場合に

「単純な共有ドライブでは、同時アクセスにより、ログイン情報や一時データなどの読み書きに、競合等の問題が起こる」
「共有ドライブへのインストールは、インストーラがコケる、ディレクトリの選択が出来ない」
等の問題も解決し

「複数PCへ差分を一括適応したいが、同期処理がネック」
「同じデータを複数PCに持たせるのは無駄なのでまとめたい」
ニーズも満たします

例としては、ゲーミングPCを多数稼働させたいケースにて、
「ゲームの更新にに大容量のダウンロードが発生する」
「複数台同時に更新なんぞすれば回線がパンクしかねない」
「同じ内容の更新なのに台数分のダウンロードは無駄」
「一度の操作でアップデートを一括適応したい」
場合に、一括で更新を適応できます

一括管理の際は、マスターのQemuイメージをiSCSI経由で更新します
(Windows機でマウントして更新を掛ける)

とりあえず参考URLとその抜粋

iSCSIターゲットを作成する

ファイルをiSCSIターゲットとして使用

sudo mkdir /var/lib/iscsi
sudo dd if=/dev/zero of=/var/lib/iscsi/disk bs=1M count=1K

Target ID 1のiSCSIターゲットを作成

sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2018-05.com.hiroom2:disk

Target ID 1のiSCSIターゲットにLogical unit 1のロジカルユニットを追加

ロジカルユニットはブロックデバイスでも可

sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /var/lib/iscsi/>disk

Target ID 1のiSCSIターゲットをすべてのIPアドレスに対して公開

ALLの他に192.168.11.1や192.168.11.0/24等が指定可

sudo tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

iSCSIターゲットの設定を保存

保存しない場合はtgtd再起動時に設定が破棄される

tgtadm --mode target --op show 

オーバーレイストレージイメージ

一度ストレージメディアを作成してから ('backing'イメージ)、QEMUにイメージへの変更をoverlayイメージとして維持させる事が可能
これによりストレージメディアを前の状態に戻せる
戻りたい時点で、オリジナルのbackingイメージを元に新しいoverlayイメージを作成する事で戻す事が出来る

overlayイメージを作成

qemu-img create -o backing_file=img1.raw,backing_fmt=raw -f qcow2 img1.cow

backingイメージには変更が加えられずストレージへの追記はoverlayイメージファイルに保存される様になる
backingイメージのパスが変更された場合修正が必要になる

qcow2オーバーレイイメージからパーティションをマウント

NBD(NetworkBlockDevice)プロトコルを使いディスクイメージを共有する事が可能

qemu-nbd を使用する為にnbdモジュールをロード

modprobe nbd nbds_max=20

ディスクを共有してデバイスエントリを作成

qemu-nbd -c /dev/nbd0 /path/to/image.qcow2

パーティションを検出

partprobe /dev/nbd0

fdiskを使用してnbd0内のさまざまなパーティションに関する情報を取得

fdisk -l /dev/nbd0
Disk /dev/nbd0: 25.2 GiB, 27074281472 bytes, 52879456 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
Disklabel type: dos
Disk identifier: 0xa6a4d542
Device      Boot   Start      End  Sectors  Size Id Type
/dev/nbd0p1 *       2048  1026047  1024000  500M  7 HPFS/NTFS/exFAT
/dev/nbd0p2      1026048 52877311 51851264 24.7G  7 HPFS/NTFS/exFAT

ドライブイメージの任意のパーティションをマウント

例えばパーティション2をマウントする

mount /dev/nbd0p2 mountpoint

オーバーレイイメージを無効化

使用後はイメージをアンマウントし前の手順を逆にする事が重要
つまりパーティションをアンマウントしnbdデバイスを切断する

umount mountpoint
qemu-nbd -d /dev/nbd0

RAMディスク参考URL

手順のメモ(おそらく、信用出来ない、頼りにならない)

大まかな流れ(申し訳程度)

・マスターRAWイメージ(ブロックデバイス直でも可)を用意
・クライアント台数分の差分(オーバレイストレージ)イメージ生成
・各イメージの仮想パーティションデバイスエントリ作成→マウント
・iSCSIブロックデバイスのロジカルユニット追加→公開
・iSCSIクライアント接続→切断時に報告(仕組み要検討←Python+Flask+ShellScriptで実装可能?)
・該当iSCSIドライブ公開停止→ロジカルユニット削除
https://linux.die.net/man/8/tgtadm
・該当仮想パーティションアンマウント→nbdデバイス切断
・該当イメージ再生成
(イニシエータ切断後に、差分イメージを再作成←RAMディスク化も要検討)
(オーバーレイストレージはqcow2形式←仮想デバイス化必要?)

具体的なコマンド(動くとは言っていない)

必要なパッケージをインストール

sudo apt install -y python3 python-is-python3
sudo apt install -y qemu-utils tgt
sudo pip3 install flask flask_httpauth ipaddress

iSCSI用のベースイメージを作成

sudo mkdir /var/lib/image
sudo dd if=/dev/zero of=/var/lib/image/base.raw count=0 bs=1 seek=250G

ベースイメージでiSCSI起動

sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2023-02.com.base:base
sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /var/lib/image/base.raw
sudo tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

ベースイメージ用iSCSIアカウント作成

sudo tgtadm --lld iscsi --mode account --op new --user iqn.2023-02.com.base:base --password basepasswd
sudo tgtadm --lld iscsi --mode account --op bind --tid 19 --user iqn.2023-02.com.base:base

iscsiステータス表示

sudo tgtadm --lld iscsi --op show --mode target

iSCSIターゲット停止

sudo tgtadm --lld iscsi --op unbind --mode target --tid 19 -I ALL
sudo tgtadm --lld iscsi --op delete --mode logicalunit --tid 19 --lun 19
sudo tgtadm --lld iscsi --op delete --mode target --tid 19

ベースイメージ用iscsiアカウント削除

sudo tgtadm --lld iscsi --mode account --op delete --user iqn.2023-02.com.base:base
sudo tgtadm --lld iscsi --mode account --op unbind --tid 19 --user iqn.2023-02.com.base:base

オーバーレイ1デバイス作成

sudo qemu-img create -o backing_file=/var/lib/image/base.raw,backing_fmt=raw -f qcow2 /var/lib/image/over1.qcow2
sudo modprobe nbd max_part=8
sudo qemu-nbd -c /dev/nbd1 /var/lib/image/over1.qcow2
sudo partprobe /dev/nbd1
#sudo mkdir /media/nbd1
#sudo mount /dev/nbd1 /media/nbd1

オーバーレイ1 iSCSI 起動

sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2023-02.com.over1:overlay
sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/nbd1
sudo tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

オーバーレイ1 iSCSIアカウント作成

sudo tgtadm --lld iscsi --mode account --op new --user iqn.2023-02.com.over1:overlay --password overlay1passwd
sudo tgtadm --lld iscsi --mode account --op bind --tid 1 --user iqn.2023-02.com.over1:overlay

iSCSIステータス表示(再度確認)

sudo tgtadm --lld iscsi --op show --mode target

オーバーレイ1 iSCSI停止

sudo tgtadm --lld iscsi --op unbind --mode target --tid 1 -I ALL
sudo tgtadm --lld iscsi --op delete --mode logicalunit --tid 1 --lun 1
sudo tgtadm --lld iscsi --op delete --mode target --tid 1

オーバーレイ1 iSCSI アカウント削除

sudo tgtadm --lld iscsi --mode account --op delete --user iqn.2023-02.com.over1:overlay
sudo tgtadm --lld iscsi --mode account --op unbind --tid 1 --user iqn.2023-02.com.over1:overlay
sudo qemu-img create -o backing_file=/var/lib/image/base.raw,backing_fmt=raw -f qcow2 /var/lib/image/over1.qcow2

iSCSIターゲットを再起動

sudo systemctl restart tgt.service

WindowsのコマンドプロンプトからiSCSIドライブをアンマウント

https://seioe0world.hatenablog.com/entry/2017/09/19/023622
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/mountvol
https://qualitestgroup.com/insights/technical-hub/how-to-offlineonline-a-disk-using-diskpart/

mountvol i: /p
echo select disk 3 > temp.txt
echo offline disk >> temp.txt
diskpart -s temp.txt
powershell -Command "Disconnect-IscsiTarget -Confirm:$false"
set dir=path/to
powershell -Command "ls %dir%"

コマンドプロンプトからPowerShellを呼び出している
何かもっとスマートな方法があるはず

追記(2025/5/17)

Python+Flask(IP+Digest認証?)+Shell script(SUIDでRoot実行)をWebGUIやショートカットファイルでURLを叩く事で自動化しようとしていた
テスト環境(NVMe SSD+1Gb/s NIC) にて、WindowsからCrystalDiskMarkで書き込み速度のベンチマークを測定した所、使用したネットワークの実測値近くまで速度が出ていた為、概念実証レベルとしては大成功だった
10Gb/s NICとNVMe SSDのRaid1環境で遊んだら楽しそうですね
(10ギガなスイッチングハブはまだまだ高価で手が出せないけれどね)
iSCSIターゲットがUbuntu 22.04 Server、iSCSIイニシエータがWindows10の環境で動かしていましたが、再現性は保証出来ません
作業中に走り書きしたメモを、思い出しながら申し訳程度に再編集した文章ですので、あくまで参考程度でお願い致します

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?