それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ext4 → btrfs にファイルシステムを変換する。

ext4 → btrfs に変更

gitlabストレージに使ってるHDDが、よく考えたら大量のwordpressだらけで、はっきり言って容量の無駄使いなので、btrfs に変えて重複ファイルの排除機能を使えば節約になりそうな気がした。

手順1

fsck でエラーを修正しておく

fsck /dev/mapper/storage-root

手順2変換する

使うコマンドはbtrfs-convert である。進捗をだすために -p を見ている

btrfs-convert -p /dev/mapper/vgubuntu-root

create btrfs filesystem:
        blocksize: 4096
        nodesize:  16384
        features:  extref, skinny-metadata (default)
        checksum:  crc32c
creating ext2 image file
creating btrfs metadata
copy inodes [O] [    698961/    313176]
conversion complete

ただし、一時ファイルが必要みたい 進捗を見る限り直接ファイルシステムを変更するわけではなく、一時ファイルを経由するみたいだから、多少の空き容量が必要であると予想される。

creating ext2 image file

変換結果の確認

変換された結果を閲覧する。btrfs はマウントしてデータを見る。

sudo mount /dev/mapper/vgubuntu-root ./disk
sudo btrfs filesystem show ./disk

実際の動作例。

sudo btrfs filesystem show disk
[sudo] password for takuya:
Label: none  uuid: 7f7eb691-81a0-4184-89cb-a8d3b67c8672
        Total devices 1 FS bytes used 90.58GiB
        devid    1 size 498.54GiB used 117.37GiB path /dev/mapper/vgubuntu-root

btrfs の機能である重複排除や透過圧縮が聞いてるとディスクサイズがガラッと変わってくる。

df を見る

btrfsdf がつかえなくなる(あてにならない)ので、btrfs df コマンドを代わりに使う。

sudo btrfs filesystem df ./disk

実際の例。

sudo btrfs filesystem df ./disk
Data, single: total=115.22GiB, used=90.81GiB
System, single: total=4.00MiB, used=112.00KiB
Metadata, single: total=1.45GiB, used=450.69MiB
GlobalReserve, single: total=110.61MiB, used=0.00B

df よりusage のほうが見やすいので私はこっちが好き

sudo btrfs filesystem usage ./disk
Overall:
    Device size:                 498.54GiB
    Device allocated:            115.60GiB
    Device unallocated:          382.94GiB
    Device missing:                  0.00B
    Used:                         90.65GiB
    Free (estimated):            406.87GiB      (min: 406.87GiB)
    Data ratio:                       1.00
    Metadata ratio:                   1.00
    Global reserve:              110.33MiB      (used: 16.00KiB)

Data,single: Size:114.14GiB, Used:90.21GiB (79.03%)
   /dev/mapper/vgubuntu-root     114.14GiB

Metadata,single: Size:1.45GiB, Used:450.42MiB (30.27%)
   /dev/mapper/vgubuntu-root       1.45GiB

System,single: Size:4.00MiB, Used:112.00KiB (2.73%)
   /dev/mapper/vgubuntu-root       4.00MiB

Unallocated:
   /dev/mapper/vgubuntu-root     382.94GiB

マウントを変更する ext4 → btrfs

btrfs に変更されると、ディスクのUUIDが変わるので、マウントを変えてあげないとだめなことがある。

私の場合は、/dev/mapperで指定してたので、UUIDは使ってないので特にUUID変更の必要はなかった。

ただし、ファイルシステムについては、fstabext4 を記載部分を btrfs に変更する必要があった。

before

# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

# /dev/mapper/vgubuntu-root /               ext4    errors=remount-ro 0       1
/dev/mapper/vgubuntu-root /               btrfs   errors=remount-ro 0       1

UUIDでマウントをしている場合は、uuidも手動で変更してあげる。

mount /dev/mapper/xxx-root disk
blkid 
vim disk/etc/fstab

マウントオプション

btrfs にはいくつかオプションがあるので、マウントオプションを検討する。(後述)

通常は変換後は、ただ何も考えずに使えばいい。

サイズを調整する。

任意。btrfs でディスクサイズがいい感じに節約されたときは、リサイズを掛けたくなるとおもう。

縮小

btrfs filesystem resize -100GB ./disk

拡大

btrfs filesystem resize +10GB ./disk

指定サイズへ

btrfs filesystem resize 300GB ./disk

パーティション最大へ

btrfs filesystem resize  max ./disk

マウントオプションによるチューニング

CoW の有効無効に注意する

CoWを有効化するかどうか。Raspberry Pi のようなSDカードメインだとCoWは著しく寿命を縮める可能性があるが、ログファイルなどは、journalctl で volalite(揮発性)にしてしまえばCoWがenabledでも問題なさそうだ。DBストレージの場合は、DBが入ってるディレクトリだけchattr してあげたほうが良さそう。

圧縮の有効無効

圧縮を透過圧縮にするかどうか、これも検討した方がいい。テキストファイルを扱うことが多いなら透過圧縮はストレージ容量を大幅に節約することができると思う。とくにgitlab のようなテキストファイルを大量に扱うストレージなら、btrfs で重複排除されるうえに、文字列が多いので圧縮が非常に効くと思う。ただし物理的破損がおきたらデータ喪失量も膨大になりそうだ。ちょっと諸刃の剣。CPU負荷も少し上がりそうだよね。書き込み総量が少なくなるので、SSDの寿命に優しくなるので、電気代・書き込み量・扱うデータを考えて、こちらも少し思案したほうが良さそう。設計に困ったら、特定のディレクトリだけを圧縮するchattr が使えるのでbtrfs は強い。

ext4→btrfs変換後に再圧縮(初期圧縮)をかける

btrfs filesystem defragment -r -v -c XXX /

trim で SSD TRIM
マウントオプション discard=asyncで、自動的にtrim が実行される。コミット待ちが発生するので、メモリ量と書き込み頻度と相談。

その他のマウントオプション

  • ssdSSD最適化された動作の一部をオンにします
  • ssd_spread: 大きな空き領域を一括で割り当てることでパフォーマンスの向上を図るらしい。
  • inode_cache: 空きinode番号のキャッシュを有効にします。

メンテナンス

最低限のメンテナンス手順だけ覚えておく

btrfs filesystem defragment -r ./disk
btrfs scrub ./disk
#  btrfs check ./disk # 普通はやらない

参考資料

UbuntuのUSBメモリの作り方と起動

UbuntuUSBメモリの作り方

unetbootinを使う場合

unetbootin を起動します。

ディストリビューション選択し、インストールするUSBメモリを選びます。

リブート後の保存領域のサイズを決めます。

UbuntuのISOファイルが自動的にダウンローされます。

Ubuntuのダウンロードが遅い場合は、自分で最速ミラーを探せば問題ないでしょう。

Rufus を使う場合

他のソフトウェアとしてRufusをインストールします。

ISOファイルの準備

Rufusを使う場合。さきに、UbuntuのISOファイルを入手しておきます。

Windows コマンドプロンプトを起動します。

ダウンロードコマンドは次のとおりです。

curl -LJO http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/22.04/ubuntu-22.04-live-server-amd64.iso

ダウンロードが終わるのを待ちます。

Rufusを起動します。

ISOファイルを選び、Persistentサイズ(永続化サイズ)を数GB確保しておきます。

USBメモリをパソコンに差し込みます。

電源をいれ、F12連打します。

F12は、起動するHDD/SSD選択画面を表示するキーです。機種によってはF1/F2/F8であることもあります。

最上位のもの選んでEnter

最初に表示されるのは、USBメモリ内部にあるOS選択画面です。

特に選択は必要ありませんが、一番上を選びます。

Ubuntuが起動します。

以上

Ubuntu が起動するUSBメモリは、15分ほどで作ることができます。

サイズは8GB程度あれば十分です。32GBは多いくらいですが、500円-1000円までで購入可能であれば問題ないと思います。

UbuntuのUSBメモリ起動でHDDのクローンとバックアップを作る

UbuntuUSBメモリ起動でHDDのクローンとバックアップを作る

作業前の注意

練習すること。 実際にバックアップを取得する前に、練習すること。

練習は、データが消えてもいいUSB-HDDや安いUSBメモリを使う。SDカードでもいいので練習しておく。

ubuntu の起動

USBメモリを挿し込んでパソコンを起動します。 パソコンにUSBメモリを差し込み、USBメモリから起動を選びます。

起動するストレージを選択するキーを連打して電源を入れます。(F12など)

Ubuntu の起動を待つ

選択したら、起動を待ちます。 起動しました

gparted を使う場合

gparted は Linux で一般的に使われるHDD・SSDの管理ツールです。

ディスクのクローンやイメージ化吸い出し、コピー、初期化、サイズ変更などメンテナンスが行なえます。

gparted を起動します。

バックアップ(クローン)を作成ディスクを選びます。 どこのディスクをどこへクローンするか選びます。

ddrescue を使う場合

コマンドからやるほうが、作業が明確になりミスが減ると思います。

ddrescueの準備(インストール)

ddrescue は自分でインストールする必要があります。

Terminalを起動します。

すべてのプログラムから、ターミナルを起動します

universe レポジトリを追加します。

sudo add-apt-repository universe

ddrescue をインストールします。

sudo apt install gddrescue

ddrescue でバックアップ

ターミナルで次のコマンドを実行

lsblk で接続しているディスクの一覧を見れます。

lsblk 

ddrescue を実行します。

ddrescue /dev/sdX /dev/sdY

以上

バックアップは、UbuntuUSBメモリがあれば手軽に作ることができます。

緊急時に備えて、避難訓練をやっておいて損はないと思います。

lxc で hostnamectl が動かない。

lxc rename の問題。

lxc rename でインスタンス名を変更したが、ホストにログインしたときの名前が変わってない。

hostnamectl が動かない。

ホスト名を変えようと思ったけど動いてない。

root@lxc-instance01:~# hostnamectl set-hostname myserver01
Could not set property: Connection timed out

hostnamectl は systemd なので、そっちを見に行く。

root@lxc-instance01:~# systemctl status systemd-hostnamed
● systemd-hostnamed.service - Hostname Service
     Loaded: loaded (/lib/systemd/system/systemd-hostnamed.service; static)
     Active: failed (Result: exit-code) since Tue 2022-05-17 22:33:53 JST; 49s ago
       Docs: man:systemd-hostnamed.service(8)
             man:hostname(5)
             man:machine-info(5)
             man:org.freedesktop.resolve1(5)
    Process: 902 ExecStart=/lib/systemd/systemd-hostnamed (code=exited, status=226/NAMESPACE)
   Main PID: 902 (code=exited, status=226/NAMESPACE)

May 17 22:33:52 lxc-instance01 systemd[1]: Starting Hostname Service...
May 17 22:33:53 lxc-instance01 systemd[902]: systemd-hostnamed.service: Failed to set up mount namespacing: /run/systemd/unit-root/proc: Permission denied
May 17 22:33:53 lxc-instance01 systemd[902]: systemd-hostnamed.service: Failed at step NAMESPACE spawning /lib/systemd/systemd-hostnamed: Permission denied
May 17 22:33:53 lxc-instance01 systemd[1]: systemd-hostnamed.service: Main process exited, code=exited, status=226/NAMESPACE
May 17 22:33:53 lxc-instance01 systemd[1]: systemd-hostnamed.service: Failed with result 'exit-code'.
May 17 22:33:53 lxc-instance01 systemd[1]: Failed to start Hostname Service.

だめっぽい。

非特権コンテナなので、ファイルにアクセスできないので、変えられない。LXCの設計上の問題っぽいですね。ファイルを編集するかホスト側から制御しなくちゃだめなのかも。

root@:~# ls -alt /run/systemd/unit-root/proc
ls: cannot access '/run/systemd/unit-root/proc': No such file or directory

対応、直接ファイルを編集

昔ながらの方法で、ファイルを編集して対応する。

vim /etc/hostname
vim /etc/hosts
shutdown -r 

debian で発生した。ubuntu の場合発生しなかった。

rclone の sftp で接続エラーになる

rclone の sftp が接続できない

rclone で sftp が接続エラーになる。

接続ログを見ながら接続

rclone -vvv lsd test:

接続エラー

2022/05/17 16:12:41 DEBUG : Using config file from "/root/.config/rclone/rclone.conf"
2022/05/17 16:12:41 DEBUG : pacer: low level retry 1/10 (error couldn't connect SSH: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain)

sftp コマンドではつながる

sftp test
sftp> ls /

接続できる。

サーバー側のエラーを見る

userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]

rclone はrsaの接続方式の一部をスキップしてる。SSHサーバ側ではRSA鍵をAccept出来ない。

サーバー側で設定を追加

/etc/ssh/sshd_config

#PubkeyAuthentication yes
PubkeyAcceptedKeyTypes=+ssh-rsa

再起動

systemctl reload sshd

よくわからない。。。

rclone の接続は通常のSFTPライブラリをどう使ってるんですかねぇ。

sftp のコマンドでつながるし、同じ鍵を使ってるんですけどねぇ。

vim 追加コピー

vim で追加コピーをやる方法

過去の調べているだが、すっかり忘れている。

以前のエントリ

vim で追加カット・追加コピー - それマグで!

vim で追加コピー

追加切り取り

:map dEd "edd
:map ded "Edd

追加コピー

:map yEe "eyy
:map yee "Eyy

ヤンクレジスタ に登録して、追加コピーする。

vimdiff と組み合わせると便利すぎてやばい。

map して使うのが一番いい。

lxc の btrfs ストレージがぶっ壊れたときの記録

lxc のインスタンスの動作が微妙におかしいので、停止してみみてみた。

srubでエラーになる。

there are uncorrectable errors

エラーを見てくる。、

dmesg| grep -e "BTRFS warning.*path:"
dmesg| grep -e "BTRFS warning.*path:" | sed -e 's/^.*path\: //'

LXCのログも見る。

lxc monitor --type=logging --pretty

ログを見ながらscrubする

btrfs scrub start /mnt
journalctl --dmesg -f --grep 'BTRFS'
-- Logs begin at Thu 2020-09-10 14:48:11 JST. --

May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): bdev /dev/loop1 errs: wr 704175, rd 69641, flush 0, corrupt 0, gen 0
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): bdev /dev/loop1 errs: wr 704175, rd 69642, flush 0, corrupt 0, gen 0
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): bdev /dev/loop1 errs: wr 704175, rd 69643, flush 0, corrupt 0, gen 0
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): unable to fixup (regular) error at logical 221216776192 on dev /dev/loop1
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): unable to fixup (regular) error at logical 221216247808 on dev /dev/loop1
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): unable to fixup (regular) error at logical 221216903168 on dev /dev/loop1
May 13 04:37:05 m75q-1 kernel: BTRFS error (device loop1): unable to fixup (regular) error at logical 221216780288 on dev /dev/loop1
May 13 04:37:05 m75q-1 kernel: BTRFS warning (device loop1): i/o error at logical 221216641024 on dev /dev/loop1, physical 193282576384, root 4115, inode 103249193, offset 76156928, length 4096, links 1 (path: rootfs/var/log/journal/67abe395f45b472>
May 13 04:37:05 m75q-1 kernel: BTRFS warning (device loop1): i/o error at logical 221215981568 on dev /dev/loop1, physical 193281916928, root 4115, inode 103249193, offset 75497472, length 4096, links 1 (path: rootfs/var/log/journal/67abe395f45b472>
May 13 04:37:05 m75q-1 kernel: BTRFS info (device loop1): scrub: finished on devid 1 with status: 0
May 13 04:49:16 m75q-1 kernel: BTRFS info (device loop1): scrub: started on devid 1

ハードウェアエラーだって・・・・

Ideally, a corrupt checksum only happens due to hardware issues (e.g., "bit rot" on disk). 

その状態でもbtrfs restore はできるので、btrfs のスナップショットとサブボリュームの管理がlxdからうまく行えてないんじゃないかと疑問を感じた。

btrfsの場合、マウントできるのでファイルを取り出した。

lxc storage list | grep default 
pv /var/snap/lxd/common/lxd/disks/default.img | pigz default.img.gz
losetup -f --show /var/snap/lxd/common/lxd/disks/default.img
mount /dev/loopX /mnt
snap stop lxd
btrfs scrub /mnt
btrfs restore /dev/loopX

gzip ファイルの圧縮率を変える。

圧縮率をbestに変えたい

圧縮率を変えるには、再圧縮が必要

gzip -cd old.gz | gzip > new.gz

伸長(展開)してからやるとストレージが無駄になる。

gzip -cd dump.gz 
gzip -best dump

そこで、直接パイプしてあげればいい

gzip -cd dump.gz  | gzip > dump.gz.2

巨大ファイルで時間のかかるとき

pv と組み合わせて、進捗を表示しつつ

pigz で CPUパワーをフルパワーで使ってやる。

pv -cN read dump.gz | pigz -d -p4 | pigz --best -p 4 | pv -cN compress >  dump.gz.2

インストール

sudo apt install pv pigz 

圧縮アルゴリズムを変更するときも同様

gzipからxz に変えたいときも同様にできる。

gzip -cd old.gz | xz > new.gz

圧縮アルゴリズムの選定基準

圧縮アルゴリズムを「圧縮時間」「圧縮率」だけで比較するのは、だめ。

xz は圧縮には時間が掛かるが、展開は速い。そのため。「XZは、誰か一人がCPU時間を提供して、多くの利用者が展開で使う」ようなときに大変メリットがある。だからリナックスカーネルとかに使われてたりする。

gzip は圧縮時間も圧縮率もそこそこで、使いやすい。「gzipはどこでも使えるオールラウンダ」ってことだし。

圧縮は、繰り返しデータの出現に対し行われるので、ディスクイメージに空き容量があればとても圧縮が効く。

だけど、CD-ROMやUbuntuのインストールUSBのような重複コンテンツは殆どなく容量いっぱいまで使われているストレージには、圧縮は殆ど効果を発揮しない。時間を掛けてXZで圧縮してもGzipでサクッと圧縮してもgzip/xzの結果で数MBも変わらない。

圧縮がどれくらい効くファイルなのか、ちゃんと予想くらいは立てて圧縮作業の展望を持っておかないと、圧縮率を変えても、圧縮アルゴリズムを変更しても電気の無駄遣いになるだけなので注意です。

「完全なランダムデータ」は圧縮が効かないってことをちゃんとわかった上で、ランダムデータに近いものほど圧縮効果が無いことを忘れないでほしいのです。

snap lxd のbtrfsストレージの中に入る

snap lxd の中に入りたい。

BTRFSの場合単純にマウントしてもいいんだけど。

lxc storage list | grep default
losetup -l | grep default.img
/dev/loop10         0      0         1  0 /var/snap/lxd/common/lxd/disks/default.img   1     512
mount /dev/loop10   /mnt

マウントもちょっと怖い。とかZFSの場合どうするんだろうか考えた。

本来lxd のストレージはそのままアクセスできるはずなんだけど、snap の場合はlxdはsnap内部に閉じ込められているんで外部からアクセスで規範い。

snap の中へ chroot してみる

snap の環境の中にlxd

root@#  chroot /var/snap/lxd/common/mntns  /bin/bash

これでsnapでもlxdで使ってるストレージを直接見ることができたわ

各種コマンドをPATH通す

sudo chroot /var/snap/lxd/common/mntns /bin/bash
export PATH=$PATH:/snap/lxd/current/bin
### インスタンスのなかを直接もみる。
cd /var/snap/lxd/common/lxd/containers/nginx/

btrfs を修正したり。

btrfs property set -ts /var/snap/lxd/common/mntns/var/snap/lxd/common/lxd/storage-pools/bt01/containers/nginx ro false

snap のlxdの問題

snap環境にセパレートされていて、管理も楽だし最新版が提供されるので便利だけど、トラブル時に通常LXD違うのでちょっとめんどくさかった。

lxc delete 時間かかりすぎるのでストレージまるごと消したい。

lxc delete 時間かかりすぎる

lxc ストレージのbtrfsのrestore(load)に失敗したので。強制的に消す方法を模索する

うっかり、コンテナに200GBも入れてしまったので、時間がかかって仕方ない。

いっそのこと先にストレージをけしたらどうなるのか。1Gのコンテナで試してみることにした。

ストレージとインスタンスを作成する

lxc storage create bt02 btrfs
lxc launch images:debian/11 d11 --storage=bt02

ストレージを消してやる

sudo rm   /var/snap/lxd/common/lxd/disks/bt02.img

ファイルはもうない

sudo ls -alt  /var/snap/lxd/common/lxd/disks/bt02.img
ls: cannot access '/var/snap/lxd/common/lxd/disks/bt02.img': No such file or directory

参照は残ってる。

losetup
NAME        SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                         DIO LOG-SEC
/dev/loop10         0      0         1  0 /var/snap/lxd/common/lxd/disks/bt02.img (deleted)   1     512
lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |  STATE  |
+---------+--------+--------------------------------------------+-------------+---------+---------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 2       | CREATED |
+---------+--------+--------------------------------------------+-------------+---------+---------+

ストレージは消したけど、新規起動できてしまう。

ある意味正しいけどある意味怖い。

lxc launch images:debian/11 d12 --storage=bt02
Creating d12
Starting d12

ストレージが消えたのを反映させる。

ストレージの存在と状態はSQLiteで管理しているらしく、起動にチェックするらしい。 SQLiteを操作して消す以外に方法が見当たらない、

lxd を再起動して、エラーにしてやる。

sudo snap restart lxd

再起動すると UNAVAILABLE にななる。.

 lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+-------------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |    STATE    |
+---------+--------+--------------------------------------------+-------------+---------+-------------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 3       | UNAVAILABLE |
+---------+--------+--------------------------------------------+-------------+---------+-------------+

インスタンスはストレージがないので起動していない。

lxc list
+------+---------+------+------+-----------+-----------+
| NAME |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------+------+-----------+-----------+
| d11  | STOPPED |      |      | CONTAINER | 0         |
+------+---------+------+------+-----------+-----------+
| d12  | STOPPED |      |      | CONTAINER | 0         |
+------+---------+------+------+-----------+-----------+

インスタンスを消してみる

lxc delete d12
lxc delete d11

特にエラーなく消せる。

ストレージを一覧から削除する

lxc storage delete bt02

無事消えました。

結論

ストレージ・ファイルを消しても、起動中なら参照は残ってるので、そのまま使える。

再起動すると、ストレージがが見つからいためUNAVAILABLEになる。インスタンスも起動しない。

その状態でインスタンスを消すことはできる。

この方法でbtrfsエラーが出て、消せなくなったコンテナを消すことができるようになった。

インスタンスを直接消す事ができるので、エラーがでたストレージは切り離せませすね。

複数のインスタンスでストレージを使ってる場合は、インスタンスlxc move で移動させておけば、影響なく消せますね。やったね。

btrfs 怖すぎるだろほんと。

lxc のインスタンスにコンソールを接続する

lxc で起動したらコンソールにつなぎたい

console は完全に virsh っぽい。

lxc stop vps
lxc start --console  vps

ちゃんと起動ログを確認できる、

takuya@raspi-ubuntu:~$ lxc start d12 --console
To detach from the console, press: <ctrl>+a q
Queued start job for default target Graphical Interface.
[  OK  ] Created slice system-getty.slice.
[  OK  ] Created slice system-modprobe.slice.
[  OK  ] Created slice User and Session Slice.
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Forward Password Requests to Wall Directory Watch.
[UNSUPP] Starting of Arbitrary Executable Fi…tem Automount Point not supported.
[  OK  ] Reached target Local Encrypted Volumes.
[  OK  ] Reached target Paths.
[  OK  ] Reached target Remote File Systems.
[  OK  ] Reached target Slices.
[  OK  ] Reached target Swap.
[  OK  ] Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket.
[  OK  ] Listening on Network Service Netlink Socket.
[  OK  ] Listening on udev Control Socket.
[  OK  ] Listening on udev Kernel Socket.

Debian GNU/Linux 11 d12 console

d12 login: takuya
Password:

切断

切断は、 ctrl a q です。

ctrl a は gnu screen とかぶるので注意が必要

コンソールにだけ接続する

コンソールにだけ接続する

lxc console d12 

注意。

私の環境ではmconsole 付きで起動した場合 lxc shell が壊れることがあったので注意

lxc のインスタンスのIPアドレスを固定する

staic に割り当てたい

lxbr0 でDHCPから割り当てられるが、固定したい時がある。 デバイスを割り当ててればい

lxbr0 の割当をして、固定する。

lxc config device remove eth1 nginx
lxc network attach lxdbr0 nginx eth1 eth1
lxc config device set nginx eth1 ipv4.address 10.185.93.4

内部だけどデバイスで割り当てるのは、完全な内部というより外部のブリッジにつなぐだけですね。

lxdbr0 以外にも接続できるなら、libvirt ネットワークやdocker ネットワークにも接続できたりできそうですね。

docker のボリュームのサーバー間移動

docker ボリュームをサーバ間で移動する

ただrsyncすれば問題なく動く。dockerコマンドは使いません。直接取り出せば大丈夫です。

ホスト側にログインする。docker の内部には一切ログインしない。

コマンド例

takuya$ ssh takuya@docker-host
takuya@docker-host$ sudo rsync -av /var/lib/docker/volumes server:/var/lib/docker/volumes

/var/lib/docker/volumes のバックアップ

繰り返しになるが、docker コマンドは使いません。

/var/lib/docker/volumes をホスト側でtgz で固めて移動させてもいい。

tar cvzf  volumes.tgz /var/lib/docker/volumes 
rsync -av volumes.tgz  server:~

コンテナごとに取り出したり、execしてもいいけど、ホスト側から読み出して、まとめて持っていけるんですよね。

コンテナは停止が無難。

コンテナを停止してファイルを書き出しさせてからバックアップを取る。

データベースなどは、稼働中の移動は少しだけリスキー。コンテナ起動中に exec で取り出したり、docker cp で取り出したりだと危険がある。execしてもダイレクトにボリュームをrsyncしても同じことだともう。

単なるファイルしかおいてないのであれば、稼働中に取り出しても大丈夫だと思う。

ただし、docker が起動してたら書き込みタイミングでファイルが変わるかもしれないですけど。ディスクIOはきれいに制御されているはずなので、「ファイル」に対するアクセスだけなら問題ないと思う。ファイルをループバックでマウントしてたり常時開いて書き込んでいる状態の場合は万が一のことはあると思うが。docker プロセス停止してたら問題ない。

LXCのbtfsストレージの中身を見る

LXCのbtfsストレージの中身を見る

LXCのストレージをマウントしてアクセスする。

btrfs は losetup 経由になっている。zfs の場合は違う。

lxc のストレージ情報を見る

lxc storage list 
LXCストレージをマウントしてデータを取り出す。
lxc storage list | grep default 
losetup -l | grep default 
mount /dev/loopX /mnt

lxd が未起動の場合には、losetup

lxdが起動中なら loseup されているのですが。lxdが未起動の場合は自分でlosetup してあげる必要がある。

lxc storage list | grep default 
losetup -f --show /var/snap/lxd/common/lxd/disks/default.img
mount /dev/loopX /mnt

btrfs の場合は、特に問題なくマウントができる。

サクッと調べたい
function lxc_show_storage(){
  name=$1
    losetup | grep $1
    loop_dev=$( losetup | grep $name | cut -d ' ' -f 1 )
    echo $loop_dev
    img_path=$(losetup | grep $name | awk '{print $6}')
    echo $img_path
}

マウントしたりメンテしたり

btrfs の場合は、scrub や resize max を実行しメンテナンスする必要がありlosetup 経由はめっちゃ使う。

自宅サバのpostfix のメール送信を外部サーバーに任せる(SSHでvpsから送信)

postfix via ssh でメール送信を安全にする

VPN経由でメール送信をすると大変。VPNの管理がめんどくさい。

だったらHTTPS/SSHで配送すればいい。

SSHpostfix配送する。

単純に、SSH起動して、SSH経由でsendmail を起動すればいい。

/etc/postfix/master.cf

master cf で sshを起動する設定を掛けばいい

master.cf にssh設定を書く

## ssh でVPSから送信する。
ssh-relay-hateml unix    -       n       n       -       -     pipe
  user=mail argv=/usr/bin/ssh -i /etc/mail/ssh-sendmail-key root@ssh.server.local -p 2222  /usr/sbin/sendmail -i $recipient

これは、次のコマンドをpostfixで呼び出すだけである。

cat sample-mail.txt | sudo -u mail  ssh -i /etc/mail/ssh-sendmail-key root@ssh.server.local -p 2222  /usr/sbin/sendmail 

master.cf に curl/phpスクリプトを指定する。

## https で送信する。
php-relay unix    -       n       n       -       -     pipe
  user=www-data argv=/usr/bin/php -f /takuya/stdin.php $recipient

これは、次のphpコマンドをpostfixで呼び出すだけである。

cat sample-mail.txt | sudo -u www-data  /usr/bin/php -f /home/takuya/https_sendmail.php takuya@example.com

https_sendmail.php の中で curlHTTPS経由でメールを送る。 サーバー側にphpファイルを設置しておく

https_sendmail.php は簡単にcurl を使えばいいだけですね。

<?php 
// 処理の概要
$ch = curl_init("https://www.example.com/index.php?key=$KEY");
curl_exec($ch);
curl_close($ch);

サーバー側で、受け取ってあげればいい。 /var/www/virtualhosts/sendmail.example.com/www-data/index.php

<?php 
## 処理の概要を抜粋
// 認証
if ( $key != $_POST['key] ){
   exit;
}
// メール送信
mail(
    $_POST['mail']['to'],
    $_POST['mail']['subject'],
    $_POST['mail']['message'],
    $_POST['mail']['additional_headers '],
    $_POST['mail']['additional_params'],
):

どの配送を使うか決める

master.cf に複数記述した配送方式から外部向けのデフォルト送信先を変えておけばいいわけである。

/etc/postfix/main.cf

main.cf で選ぶ

default_transport = ssh-relay-hateml

transport map で決めてあげればメアド毎に配送を決められる。

HTTPS/SSHで転送すれば確実。もう、ポートスキャンやセキュリティに悩まなくて済む。

まとめ

別サーバーにSMTPの配送を任せるが、OP25B で配送ができないので、困る。

だったらレンサバ・VPSAmazon AWS経由で送信すればいい。それだけ。

OB25Bがある?だったらレイヤを変えて送信すればいい。25を使わず、SSHHTTPSでメールを配送すればいいだけである。

VPN接続してレイヤを合わせるのは、維持管理がめんどくさいので、単純にコマンドをパイプで繋いだらUNIXらしくていいじゃないか。

GoogleGMAILがxoauth 対応しないとめんどくさいので、1台だけXOAUTHサーバーを作っておいて、そこへSSHでメール送信すればいいわけである。

関連資料