LoginSignup
0
0

More than 3 years have passed since last update.

sshfsでマウントしたディレクトリの中でファイルをマウントしてLVMを構築して連結した話

Last updated at Posted at 2019-11-14

注意

あくまでも理論上できそうな事を実際にやってみただけなので、再現性の保証はありません。ご注意下さい。

はじめに

"sshfsでマウントしたディレクトリの中でファイルをマウントしてLVMを構築して連結"するというのは結構前から考えていたのですが、実際にやってみないと始まらないという訳でやってみました。

準備するもの

  • 安定した通信回線
    • 不安定なWi-Fiはやめたほうがいい
  • sshする(マウントする)Linuxマシン
    • Ubuntu 18.04
    • sshfsを入れておくこと
    • 以降Zと呼ぶ
    • /etc/fuse.confuser_allow_otherを有効にしておく
  • sshされる(ファイルを置く)Linuxマシン
    • 今回2台用意した
    • 2台ともUbuntu 18.04
    • それぞれの区別のため、一つのホスト名(と名前)をA、もう一つのホスト名はBとする

やるよ

AとBで下準備 (デバイスになるファイルの用意)

先にAとBで以下のようにファイルを作成します。(コマンドは例)

$ mkdir lvm_test
$ cd lvm_test
$ dd if=/dev/zero of=./lvmfile bs=1M count=1536
1536+0 records in
1536+0 records out
1610612736 bytes (1.6 GB, 1.5 GiB) copied, 4.25904 s, 378 MB/s

sshfsしてZにマウントする

次に、上記で作成したlvm_testをZにマウントします。

$ sshfs lesmi@A:/home/lesmi/lvm_test a/ -o allow_other
$ sshfs lesmi@B:/home/lesmi/lvm_test b/ -o allow_other

デバイスにするファイルをloopbackとしてマウント

ファイルのままだとこの後のpvcreateが出来ないので、loopbackデバイスに変換します。(snapがあるとloop0やloop1は使用済みだと思われます)

# losetup /dev/loop0 ./a/lvmfile
# losetup /dev/loop1 ./b/lvmfile

LVMにデバイスを登録する

上記で作成したloopbackデバイスに登録し、グループを作成します

# pvcreate /dev/loop0
  Physical volume "/dev/loop0" successfully created.
# pvcreate /dev/loop1
  Physical volume "/dev/loop1" successfully created.

# vgcreate overssh /dev/loop0
  Volume group "overssh" successfully created
# vgextend overssh /dev/loop1
  Volume group "overssh" successfully extended

作成したグループからvolumeを作成する

ここまで全く同じようにやると、多分766 extents、つまり3064MB使えると思いますので、フルサイズでvolumeを作成します。

# lvcreate -L3064 -n overssh_lv overssh
  Logical volume "overssh_lv" created.

ext4でフォーマット、ついでにマウント

ここまで来るともうすでにvolumeとして使用できるので、ext4としてフォーマットします。(実際には何でもいい)
ついでにマウントしてしまいます。

# mkfs.ext4 /dev/overssh/overssh_lv
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 784384 4k blocks and 196224 inodes
Filesystem UUID: 149068ec-d9f2-46d0-a5f1-9f626bd4327c
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
# mount /dev/overssh/overssh_lv $PWD/combined

試してみる

df -hしてみるとこんな感じ(元々あったデバイスは除外)

$ df -h
Filesystem                                     Size  Used Avail Use% Mounted on
lesmi@A:/home/lesmi/lvm_test                    55G   25G   27G  48% /home/lesmi/lvm_test/a
lesmi@B:/home/lesmi/lvm_test                    29G   13G   15G  46% /home/lesmi/lvm_test/b
/dev/mapper/overssh-overssh_lv                 2.9G  2.0G  797M  72% /home/lesmi/lvm_test/combined

できてますね

ddで容量一杯まで書き込むとこんな感じ

$ dd if=/dev/zero of=./test status=progress
2873205248 bytes (2.9 GB, 2.7 GiB) copied, 127 s, 22.6 MB/s
dd: writing to './test': No space left on device
5680497+0 records in
5680496+0 records out
2908413952 bytes (2.9 GB, 2.7 GiB) copied, 127.524 s, 22.8 MB/s
$ rm test

全部書き込めるみたいですね。 Seagateじゃないんだから

やりっぱなしはダメだよね

という訳で後片づけの時間です。使わないからね。
なおA、Bでやる作業は(ファイルの削除を除いて)特にありません。

Z上からvolumeをアンマウントする

まずは普通に./combinedをアンマウントします。

# umount -l ./combined

LVMからvolumeを削除する

sshfsを早速アンマウントするとおかしくなるので、LVMをなんとかします。

# lvchange -an /dev/overssh/overssh_lv
# lvremove /dev/overssh/overssh_lv
Do you really want to remove and DISCARD logical volume overssh/overssh_lv? [y/n]: y
  /dev/loop0: BLKDISCARD ioctl at offset 1048576 size 1606418432 failed: Input/output error.
  /dev/loop1: BLKDISCARD ioctl at offset 1048576 size 1606418432 failed: Input/output error.
  Logical volume "overssh_lv" successfully removed

エラーっぽいのが出ていますが、これはloopbackデバイスが特定のioctlに対応してないだけなので気にしなくても問題なさそうです。

vgchange -an oversshをする

よく分かりませんがやっておきます。

# vgchange -an overssh
  0 logical volume(s) in volume group "overssh" now active

Volume groupを削除する

Volume groupを削除し、関連付けられているデバイスを解放(?)します。

# vgremove overssh
  Volume group "overssh" successfully removed

LVMにさようならを告げる

最初に作ったloopbackデバイスを、LVMから完全に削除します。

# pvremove /dev/loop0 /dev/loop1
  Labels on physical volume "/dev/loop0" successfully wiped.
  Labels on physical volume "/dev/loop1" successfully wiped.

loopbackを解除する

loopbackデバイスを削除し、sshfs上のファイルを解放します。

# losetup -d /dev/loop0
# losetup -d /dev/loop1

sshfsをアンマウントしておしまい

最後に、sshfsをアンマウントして切断します。

# umount -l ./a ./b

お疲れさまでした。後片付けはこれで終わりです。

感想

実際にやってみたらすんなりできてしまったので面白かったです。
実用性は皆無ですが。

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