それマグで!

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

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

ruby でGmail(smtp) 経由でメールを送信する。TLS有効化

ruby でメールを送信する

ruby からgmail を送信するには、 mail ライブラリだけでも出来るんだけど。

MIMEエンコードされたデータを受け取ってそのまま forward するには、もう少しいい方法がないかなと思って考えていた。

メールリレーの中間に入って、指定メールだけを転送したいとか、smtp-proxy を作っておきたいとかそういうときに活用できる。いちいちデコードして作り直しててめんどくさくてですね。

net/smtpgmail 送信。

require 'net/smtp'
require 'mail'
require_relative '../etc/gmail-passwd'



smtp = Net::SMTP.new("smtp.gmail.com", '587')
smtp.enable_starttls
smtp.start(
    'smtp.gmail.com',
    $gmail_account.username,
    $gmail_account.password,
    :login
)

mail = Mail.new
mail.from = "webmaster@example.com"
mail.to  = "takuya@example.com"
mail.subject = "test"
mail.body ="test test"
mail.attachments["photo.jpg"] = File.binread( File.expand_path( "./photo.jpg",  File.dirname($0) ) )


smtp.send_mail( mail.encoded , mail.from, mail.to )

Mailのみの場合

mail ライブラリで新規メール作成して、送信するにはMail だけでいける。

require 'mail'


mail = Mail.new

mail.delivery_method(:smtp,
                     address:        "smtp.gmail.com",
                     port:           587,
                     domain:         "smtp.gmail.com",
                     authentication: :login,
                     user_name:      $gmail_account.username,
                     password:       $gmail_account.password
)


mail.from = "webmaster@example.com"
mail.to  = "takuya@example.com"
mail.subject = "test"
mail.body ="test test"

mail.deliver

redis のクライアントだけをインストールする。

redis に接続するクライアントだけインストールしたい

redis のクライアント redis-cli は次のコマンドでインストールする。

sudo apt install redis-tools

これで redisに接続して、データのやり取りをモニタリング出来る。

qcow2へ raw(qcowのnon-sparse) イメージを変換して sparse にする

non-sparse から sparse なファイルにコピーする

qemu で使える raw image なnon sparseな hdd イメージを qcow2 形式の sparse なファイルにする。

生イメージだとどうしてもディスク容量が節約できないので動的にディスク容量を確保するほうが良いよね。

virt-sparsify

直接イメージをマウントしてコピーすると手順が大変なことになってしまいます。そこで virt-sparsify というコマンドが用意されています。

インストール

virt-sparsify は guestfs-tools に含まれて配布されるようです。

takuya@:~$ virt-sparsify

Command 'virt-sparsify' not found, but can be installed with:

sudo apt install libguestfs-tools

変換

変換は、直接ファイルを「書き換える」のではなく、コピーになります。

sudo virt-sparsify   FROM TO

実際に変換してみた

takuya@m75q-1:~$ sudo virt-sparsify   /var/lib/libvirt/images/ubuntu-1910.img  /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
[   0.0] Create overlay file in /tmp to protect source disk
[   0.0] Examine source disk
[  10.4] Fill free space in /dev/ubuntu-vg/root with zero
[ 477.6] Fill free space in volgroup ubuntu-vg with zero
[ 478.0] Copy to destination and make sparse
[ 922.2] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.

なるほど。これでsparse ファイルになるのか。

無事に sparse なファイルに変換されました。メッセージには「念の為、起動してチェックしろよ」と書いてあります。

出来上がりを見てみます。

こっちが元のファイル。

takuya@:~$ sudo qemu-img info  /var/lib/libvirt/images/ubuntu-1910.img
[sudo] password for takuya:
image: /var/lib/libvirt/images/ubuntu-1910.img
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 191G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
After

次に、スパースファイルになった側

takuya@:~$ sudo qemu-img info  /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
image: /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 71G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

実際に消費する実ディスク容量が 191GB→ 71GB と削減されていることがわかります。仮想サイズはどちらも200GBです。

なぜ最初から sparseにしてなかったのか。

virt-manager で作ったqcow2のディスクで、特に設定しないとsparseにならないので注意が必要でした。

virt-manager ってsparseにしないんですね。いまはSSDだし?メモリもいっぱいあるから再配置オーバーヘッドよりもSSDのディスク容量のほうが貴重だしなぁ。

参考資料

https://milestone-of-se.nesuke.com/sv-basic/linux-basic/resize-kvm-image-sparse-file/

http://libguestfs.org/virt-sparsify.1.html