それマグで!

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

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

macOSのFinderからクイックアクション(回転・マークアップ)のパネル(ペイン)を永久追放で削除する。

macOS Mojave から搭載された画像のクイックアクション

クイックアクション、正直言って邪魔ですね。Finderのプレビューペインが、スクロール化してしまい「プレビュ」が隠れるというトンデモ仕様。

プレビューを機能を覆い隠すとかちょっと信じられないんですよね。クイックアクションより、プレビューのほうが利用頻度が高いのに。プレビューがスクロールして隠れてしまう上に、ひどいときには横スクロールまで表示されしまう。耐えられない。消す方法を調べた

表示からプレビューオプションを選択。

手順としては、次の通り。

  1. クイックアクションが表示された状態で
  2. Finderの表示メニューを開く
  3. プレビューオプションを開く
  4. クイックアクションをオフにする。
  5. これをすべての拡張子で繰り返す。

この手順で、クイックアクションを削除することができて、プレビューペインで情報をスクロールすることなく確認することができる。 スクロールがおかしくなる違和感も解消される。

実際の設定

f:id:takuya_1st:20210523123840p:plain:w300

f:id:takuya_1st:20210523123218p:plain

f:id:takuya_1st:20210523123201p:plain:w300

すべての拡張子で繰り返す

ここが、まじ「頭おかしい」とおもってmacOSを窓から投げ捨てたくなり、頭を抱えたところだ。

クイックアクションが表示されるものについて、すべて繰り返す必要がある。PDF / MP4 / JPG / PNG / HEIF .... など全部です。

defaults 設定も探したのだけど、見つからなかった。もうむちゃくちゃ・・・なんだこのmacOSとかいうOSのアップデートは・・・

ファイル更新日時などの重要情報を見られない。

これ、まじどうなってるんだ。

これが、プレビューペインでクイックアクションが表示された状態。

f:id:takuya_1st:20210523124932p:plain:w240

これが、プレビューペインで、クイックアクションを消した状態。

f:id:takuya_1st:20210523124940p:plain:w240

ファイル情報がスクロールに隠れる。

ファイルの作成日や更新日が完全に隠れてしまう。画像の場合はExifなども隠れてしまう。Finderを再設計(キリッ)って、Appleのソフトウェア開発担当は何考えてんだろう。意味不明すぎて頭を抱える。

そろそろ、macOSをまどから投げ捨ててもいいかもしれません。

GMailのメール保護機能を使う。(有効期限・パスコードをつけて誤送信や情報漏洩防止)

GMailにはしばらく前から保護機能がついてます。

メールの時限機能をつけたり、送信後にアクセスを取り消したり、SMSコードがないと開けない(別経路送信)が使えます

保護機能では、「メールに有効期限」「SMSパスコード」が主に利用できますね。

利用は新規メール作成画面から行える。

f:id:takuya_1st:20210523120431p:plain:w300 f:id:takuya_1st:20210523120444p:plain:w300

f:id:takuya_1st:20210523120505p:plain:w400

ポイント

Gmail同士の場合と、外部のメールサーバーで取り扱いが異なります。

Gmail 同士の場合

保護モードのフラグ付きメールが送信されて、受信者のGmailから自動的に削除されるようです。

保護モードと表示されるメールが届きました。

通常のメールの場合

通常のメールの場合では、メールへのリンクが届きます。

リンク先を開いてメールを閲覧するようです。

f:id:takuya_1st:20210523120412p:plain:w400

動作が異なる注意点

Gmailと通常メアドで、メールの取り扱いが異なるので注意。

リンクを使うことですこしはリスクが軽減されるのであるが。受信者側のメールフィルタがうまく動作しないので、受信者に負担を強いることになると思う。

api から使えたらいいのだが・・・

自動でメール送信するソフトウェアやパスワードリマインドで使えれば良いな。と思って調べるが、今の所GmailのWEB以外に使う方法が見えたらない。自分のメール・ソフトウェアでも使えないと思われる。所詮はGoogleの独自仕様。

仮に使えたとしてもGoogleが気分一つでサービスを停止する可能性もあるし。知ってたら便利だけど仕組みやワークフローに組み込むほどの依存をする信頼性に至らない気はした。

workspace ( google apps ) の組織設定で一括できないのか

Workspace のGmail設定を見た限り、組織の全員にデフォルト設定するようなことはできなさそう。SMTPの経路設定で追加するしかなさそうですね。

メールのセキュリティ的な意味で

メールのセキュリティではまっさきにやることは暗号化と、大事なことは添付ファイルではなくリンクで送るようにすることですかね。

どうしても平文で贈りたいときに「選択肢」として知っておくのはいいですね。

参考資料

https://support.google.com/mail/answer/7674059?co=GENIE.Platform%3DDesktop&hl=ja

raspi ubuntu に docker をインストール

raspi 8GB でdocker を入れて遊ぶ

raspi 8GB が手元にあるので、docker とか snap とか lxc とか動かして遊ぶ。

raspbian で動かすとレポジトリで手こずるので、最初から aarch64 用にコンパイルされた ubuntu をインストールした.

インストール後のraspberry pi ubuntu の状態はこんな感じだった。

ubuntu のバージョンを見てみる。 aarch64 で64bit版だとわかる。

# cat /etc/os-release  && uname -a
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
Linux ubuntu 5.4.0-1035-raspi #38-Ubuntu SMP PREEMPT Tue Apr 20 21:37:03 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

raspi ubuntu に docker をインストール

通常の ubuntu と同じ。docker のインストールに特に手順はなく通常のubuntuですね。

sudo snap install docker 
sudo groupadd docker
sudo usermod -aG docker $USER
sudo chown root:docker /var/run/docker.sock
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
# sudo reboot 
systemctl restart docker.service

動作チェック

docker run で hello-world を動かしてみる。

takuya@raspi-ubuntu:~$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
256ab8fe8778: Pull complete
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

動きますね。

ubuntu on docker raspi

raspi4 上の ubuntu で docker ubuntu も動かしておく

takuya@raspi-ubuntu:~$ docker run --rm ubuntu cat /etc/os-release
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
80bc30679ac1: Pull complete
c937c19c2d76: Pull complete
ba4ad2754376: Pull complete
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:latest
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

快適だった

マジ快適に、サクッとインストール終わりますね。

raspi4 8GB + ubuntu は、メモリが多いので、あれこれにめっちゃ使いやすい。

aarch64 の docker ubuntu 速い。これクラスタリングしたくなる。

参考資料

https://linuxhandbook.com/docker-permission-denied/

raspi4 に入れた ubuntu でvcgencmd や rpi-eeprom をインストールしてraspi 管理コマンドを使えるようにする

libraspberrypi-bin をインストールしたらコマンドが入ってくる

sudo apt install libraspberrypi-bin 

インストールしてしまえば、通常通り

takuya@ubuntu:~$ sudo vcgencmd bootloader_version
Dec 11 2020 11:15:17
version c3f26b6070054bca030366de2550d79ddae1207a (release)
timestamp 1607685317
update-time 1615925391
capabilities 0x0000001f

rpi-eepromで状況を把握

rpi-eepromコマンドで、現況をみる

sudo apt install rpi-eeprom 

EEPROMについての情報を見ることができる。

takuya@ubuntu:~$ sudo rpi-eeprom-update
BCM2711 detected
VL805 firmware in bootloader EEPROM
BOOTLOADER: up-to-date
CURRENT: 2020年 12月 11日 金曜日 11:15:17 UTC (1607685317)
 LATEST: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/default
VL805: up-to-date
CURRENT: 000138a1
 LATEST: 000138a1

ブートローダーについては、/lib/firmware/raspberrypi/bootloader/beta/ ディレクトリにあった。

takuya@ubuntu:~$ ls /lib/firmware/raspberrypi/bootloader/beta/ -la
total 4820
drwxr-xr-x 2 root root   4096  5月 30 03:04 .
drwxr-xr-x 5 root root   4096  5月 30 03:04 ..
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-07-16.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-07-31.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-09-03.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-10-02.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-10-28.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-11-24.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2020-12-11.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2021-01-05.bin
-rw-r--r-- 1 root root 524288  1月 13 01:44 pieeprom-2021-01-11.bin
-rw-r--r-- 1 root root 106396  1月 13 01:44 recovery.bin
-rw-r--r-- 1 root root  99224  1月 13 01:44 vl805-000138a1.bin

フルアップグレード

ubuntu をいれた raspi4 をフルアップグレードするには、次のようにする

sudo apt update 
sudo apt full-upgrade

eeprom をアップデート

sudo rpi-eeprom-update -a

もっと最新版がほしいときは

初期設定では、default=critical になっておりとても保守的です。epprom 壊れたら再起不能ですからね。仕方ないすよね。

せめてstable くらいにする

sudo sed -i 's/default/stable/' /etc/default/rpi-eeprom-update
sudo rpi-eeprom-update

編集をせずに一時的にbeta でアップデートする

sudo rpi-eeprom-update -a  -f beta
sudo reboot 

USBブートを有効にする。

参考資料によると、0x1 がSDカードを示し、0x41 がSDCard,then,USBらしい。右から順に読まれるそうだ、0xf14 なら、USB,SDCard,Reboot になるのですね。

Take note of the BOOT_ORDER code. The defualt code is 0xf41 and is read right to left to determine the boot order.

  • 1 = Check SD card
  • 4 = Check USB drive
  • f = Start again

This boot order is exactly what we want. If the boot order code is anything other than 0xf41, you can change the boot configuration using this command.

export EDITOR=vim 
sudo -E rpi-eeprom-config --edit

これで、USBメモリ、USBHDDからのブートを使えるようになる。Ubuntuだけで完結するので良い。

BOOT_ORDERの詳細設定は、Raspiの公式ページに記載があり

値と意味は次のようになっている。(2023-02-07確認)

Value Mode Description
0x0 SD CARD DETECT Try SD then wait for card-detect to indicate that the card has changed - deprecated now that 0xf (RESTART) is available.
0x1 SD CARD SD card (or eMMC on Compute Module 4).
0x2 NETWORK Network boot - See Network boot server tutorial
0x3 RPIBOOT RPIBOOT - See usbboot
0x4 USB-MSD USB mass storage boot - See USB mass storage boot
0x5 BCM-USB-MSD USB 2.0 boot from USB Type C socket (CM4: USB type A socket on CM4IO board).
0x6 NVME CM4 only: boot from an NVMe SSD connected to the PCIe interface. See NVMe boot for more details.
0x7 HTTP HTTP boot over ethernet. See HTTP boot for more details.
0xe STOP Stop and display error pattern. A power cycle is required to exit this state.
0xf RESTART Restart from the first boot-mode in the BOOT_ORDER field i.e. loop

よく見ると,HTTPブートやPXEブートも可能になってる。もうSDカードいらんじゃん。

ちなみに、USBブートを無効にすると・・・

USBを挿してもSDカードなしなら起動しなくなる。

ubuntu-server raspi いいね。

raspbian 使ってたけど、64bit 周りや仮想マシン・LXCコンテナ・Dockerやsnap を扱えるのと GUIがないので、ubuntu-serverのほうが、私の好みの動作をしてくれるので気に入ったかもしれない。

参考資料

https://raspberrystreet.com/learn/how-to-boot-raspberrypi-from-usb-ssd

Chromeに保存されたパスワードと同期パスワードを全部消す。

chrome に保存されたパスワードを全部消したい。

Google ChromeGoogleアカウント同期をオフにしても、ローカルに保存されたパスワードは残ります。

全部消すのに、いちいち削除ボタンを押すしかないのは不便すぎませんか。

履歴機能から消すと全部削除できる。

Chrome の履歴タブを選んで削除します。

f:id:takuya_1st:20210521165701p:plain

履歴を選択して、パスワードを消す。ついついパスワードの管理から消そうとして、管理画面から1個ずつ消す必要があって大変になる。

f:id:takuya_1st:20210521165114p:plain

保存されたパスワードを全部削除するには、「パスワード」

保存されたIDも削除するには「自動入力データ」も削除するほうがいいでしょう。

全部削除された。

f:id:takuya_1st:20210521165136p:plain

パスワードの管理は別アプリへ

Chromeのパスワード同期はあまりにも便利すぎるが、パスワード生成などで不便など。かゆいところに手が届かない。

そのへんが気に入らないので、Bitwardenに移行したが、パスワード自動入力・保存が、Chromeと管理ツールの双方で行われるので不便になる。

Chromeのパスワード入力は、ドメインで検索して条件でまるっと削除とか細かい部分に手が届かないので本当に不便。

unbound で指定ドメインを上書きして応答する。

unbound で指定したドメインの名前解決を上書きする

unbound では、指定したドメインの応答結果を本来の結果とは違う応答を返却することができる。

ドメインの一種の偽装である。グローバルに偽装応答すると犯罪だがローカルで書き換えるのであれば問題ない。

local-data を記述する。

local-data で直接上書きし、その結果を問い合わせ結果として返すことができる。

/etc/unbound/unbound.conf.d/my.conf

local-data: "nextcloud.example.com A 192.168.1.100 "
local-data: "gitlab.example.com A 192.168.1.100 "
local-data: "bk.example.com A 192.168.1.100 "
local-data: "bit.example.com A 192.168.1.100 "

my.conf を読み込むには

/etc/unbound/unbound.conf のファイルを読み込むように、設定をしておく。

unbound.conf の内部で include *して於けば十分である。

/etc/unbound/unbound.conf

# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
include: "/etc/unbound/unbound.conf.d/*.conf"

あとは好きなように書き換えることができる。

local-data と local-zone

local-data が最優先で、 local-data になければ、local-zone を閲覧に行く。

local-zone は zone の名前の通り、zone まるごと書き換える。

local-zone: "mylocal." static

と書いておけば、.mylocal. に関する問い合わせは設定した unbound 内部で完結するようになる。

この状態で、 *.mylocal. への問い合わせはNXDOMAINが応答されてくるようになる。

次のように追記すれば

local-zone: "mylocal." static
lodal-data: "example.mylocal A 192.168.1.1 " 

example に関しては応答が帰ってくる それ以外は NXDOMAIN になる。

参考資料

https://gihyo.jp/admin/feature/01/unbound/0004

lxc storage コマンドでストレージプールを指定したフォーマット(btrfs/zfs)で作る

lxc でストレージプールを作る

lxc storage create でストレージ・プールを増やせる。 ためしに、btrfs で増やしてみた。

lxc storage create bt02 btrfs

このコマンドは、オプションを指定しなければ、イメージファイルを作成しそこにプールを作ってくれる。

作成されたファイルを確認する

storage list をみれば、どこからストレージ・プールを持ってきてるかわかる。

lxc storage list

+---------+--------+--------------------------------------------+-------------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| bt01    | btrfs  | /var/snap/lxd/common/lxd/disks/bt01.img    |             | 9       |
+---------+--------+--------------------------------------------+-------------+---------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 0       |
+---------+--------+--------------------------------------------+-------------+---------+

作成されたイメージファイルの確認

lxc storage info で現在の容量を確認できる。

$ lxc storage info bt02
info:
  description: ""
  driver: btrfs
  name: bt02
  space used: 3.93MB
  total space: 30.00GB
used by: {}

作った容量を拡張する

わたしは、snapcraft された LXDで作ったので、/var/snap/lxd/common/lxd/disks にイメージファイルがある。

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

このファイルは、loop バックデバイスに接続してあるので、losetup でループ・デバイスを確認する

$ sudo losetup

NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                         DIO LOG-SEC
/dev/loop8         0      0         1  0 /var/snap/lxd/common/lxd/disks/bt02.img             0     512

今回は loop8 に接続されていた。

イメージファイルの容量を追加

truncate を使って、-s オプションで増分を指定し、容量を拡張する。

sudo trunacate -s +10G /var/snap/lxd/common/lxd/disks/bt02.img

losetup で容量変更を反映

losetup -c これを忘れたら永遠に反映されない。

sudo losetup -c /dev/loop8

-c は -c, --set-capacity <loopdev> resize the deviceで、ディスクイメージファイルに従ってループデバイス化したブロックデバイスの容量を反映してくれる。

btrfs で容量を最大にする。

最初にマウントしておく mount

sudo mount /dev/loop8 /mnt

つぎに、リサイズをかける。 brtfs filesystem resize で max を指定。

sudo btrfs filesystem resize max /mnt

最後にマウントを解除する

sudo umount /mnt

変更を確認

takuya@m75q-1:~$ lxc storage info bt02
info:
  description: ""
  driver: btrfs
  name: bt02
  space used: 3.93MB
  total space: 40.74GB
  

透過圧縮も用意しておくといいと思います。

zstd, lzo, zlib からアルゴリズムを選び指定します。

lxc storage set default btrfs.mount_options user_subvol_rm_allowed,compress=lzo
lxc storage set default btrfs.mount_options user_subvol_rm_allowed,compress=zstd
lxc storage set default btrfs.mount_options user_subvol_rm_allowed,compress=zlib

lxc のストレージ管理

lxc のストレージ管理は lxc storage コマンドで基本的に解決する。

LVMだとかブロックデバイスを直接だとか別の方法を組み合わせてやるとちょっとめんどくさいのことも起きるけど、truncate でファイルを作成しループバックで使ってる限り、そこまで面倒はお気なさそうだ。欲を言えば、ファイルが可変長なら良かったのに。

lxc で ストレージを変更する。(pool/volume間のlxcストレージを移動)

lxc で ストレージを変更する。(pool/volume間の移動)

lxd を使って、コンテナを起動しているときに、そのコンテナが乗っかってるストレージを切り替えたい。

今回は、起動しているコンテナのストレージを、ボリューム(プール)間で移動して、使ってるボリュームを移動させる

操作の概要

全体の操作の流れ

lxc stop NAME
lxc move NAME NAME-tmp --storage=st02
lxc move NAME-tmp NAME 

以下では、lxdMosaicのストレージを default から bt02 に切り替える。

現在のストレージを確認する。

現在のストレージは次のように確認できる。

$ lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| bt01    | btrfs  | /var/snap/lxd/common/lxd/disks/bt01.img    |             | 2       |
+---------+--------+--------------------------------------------+-------------+---------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 0       |
+---------+--------+--------------------------------------------+-------------+---------+
| default | zfs    | /var/snap/lxd/common/lxd/disks/default.img |             | 10      |
+---------+--------+--------------------------------------------+-------------+---------+

今回は、 zfs の default から btrfs で作った bt02 へコンテナを移動させる

default ストレージを使ってるコンテナを確認する。

lxc の storage コマンドで 、show のサブコマンドを利用して、default の状況を見る、

lxc storage show  default
config:
  size: 100GB
  source: /var/snap/lxd/common/lxd/disks/default.img
  zfs.pool_name: default
description: ""
name: default
driver: zfs
used_by:
- /1.0/images/27438783f0b038d0a49ec19c8360903d785c3585654dee8959e9295c5c7615a2
- /1.0/instances/apache-php72
- /1.0/instances/lxdMosaic
- /1.0/instances/nextcloud
- /1.0/instances/ubuntu1804
- /1.0/profiles/default
status: Created
locations:
- none

いくつもの、コンテナがこのストレージ上に展開されていることがわかる。

images はコンテナイメージの格納場所だと思う。

ストレージを動かす方法

起動中のコンテナは、最初に停止しておく。

lxc の stop コマンドに、コンテナ名を指定して停止する。

lxc stop lxdMosaic

lxc の info コマンドで、停止を確認

lxc info lxdMosaic
Name: lxdMosaic
Location: none
Remote: unix://
Architecture: x86_64
Created: 2021/03/24 07:34 UTC
Status: Stopped
Type: container
Profiles: default

ストレージ移動は lxd の移動と同様

ストレージの移動は、lxd の通常移動と同じ様になる。

通常では、サーバー間のコンテナ移動と同様のコマンドになるのだが。 今回は、同一サーバー内での移動になる。

そのため、一時的に別名に移動させ、その際にストレージを指定する

lxc コンテナを一時的な名前で移動(ストレージ変更)

lxc move lxdMosaic lxdMosaic-tmp --storage=bt02

移動は、そこそこ時間かかる。nvme のSSDなのだが、ちょっと時間が必要だったね。

時間がかかるので --verbose を使ったほうがいいかもしれない。と思って --verbose してみたが、進捗は表示されませんでした。経過を見る方法はなさそう。

元の名前に戻す。

lxc move  lxdMosaic-tmp lxdMosaic

zfs→btrfs / btrfs → btrfs の場合、内部的に rsync で移動している模様。

rsync か、そりゃ時間かかるわ

zfs → zfs の場合、zfs send を使って移動してた

どっちにしても、時間はかかる。

lxc move の使い方は次の通り。

lxc move はヘルプを見れば、その使い方としてremote への移動が想定されているようだ。

しかし、今回は、ストレージを移動させたいので、別名として移動させたわけですね。

takuya@m75q-1:~$ lxc help move
Description:
  Move instances within or in between LXD servers

Usage:
  lxc move [<remote>:]<instance>[/<snapshot>] [<remote>:][<instance>[/<snapshot>]] [flags]

Aliases:
  move, mv

Examples:
  lxc move [<remote>:]<source instance> [<remote>:][<destination instance>] [--instance-only]
      Move an instance between two hosts, renaming it if destination name differs.

  lxc move <old name> <new name> [--instance-only]
      Rename a local instance.

  lxc move <instance>/<old snapshot name> <instance>/<new snapshot name>
      Rename a snapshot.

Flags:
  -c, --config           Config key/value to apply to the target instance
  -d, --device           New key/value to apply to a specific device
      --instance-only    Move the instance without its snapshots
      --mode             Transfer mode. One of pull (default), push or relay. (default "pull")
      --no-profiles      Unset all profiles on the target instance
  -p, --profile          Profile to apply to the target instance
      --stateless        Copy a stateful instance stateless
  -s, --storage          Storage pool name
      --target           Cluster member name
      --target-project   Copy to a project different from the source

lxc で消せないコンテナができる

lxc move で移動をしていたら、削除も移動も出来ないコンテナが出来た。再現方法は次の通り

  • lxc move を途中で強制終了する。
  • lxc move でbtrfs を使っている。

こうなってしまうと、だいぶめんどくさい。

これらを消すには。

btrfsで管理しているので、btrfs のイメージを loop デバイスからマウントして、btrfs から削除してしまい、lxc から強引に消すことで解決した

LXC で不要になったストレージを取り外す

LXC で不要になったストレージを取り外す

LXC で不要になったストレージを取り外す

使用中のストレージを一覧する

lxc storage list を使って、いま、ストレージが使われているか確認する。

takuya@lxc-host:~$ lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| bt01    | btrfs  | /var/snap/lxd/common/lxd/disks/bt01.img    |             | 7       |
+---------+--------+--------------------------------------------+-------------+---------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 1       |
+---------+--------+--------------------------------------------+-------------+---------+

ストレージを使っているコンテナを探す

lxc storage info で ストレージ情報を確認して、ストレージを使ってるインストール(コンテナ)を表示する

takuya@lxc-host:~$ lxc storage info bt02
info:
  description: ""
  driver: btrfs
  name: bt01
  space used: 18.76GB
  total space: 100.0GB
used by:
  instances:
  - ubuntu1804

削除する

削除できるものは削除する。

lxc stop /delete で削除する。

lxc stop ubuntu1804
lxc delete ubuntu1804

他のストレージへ移動させる。

lxc コマンドの stop / move を使い、利用中のインスタを移動する

lxc stop ubuntu1804
lxc move ubuntu1804 ubuntu1804-tmp --storage=bt01
lxc move ubuntu1804-tmp ubuntu1804

move の引数に --storage=NAME を使えば、ストレージ間での移動が可能。 ただし、移動は同名のインスタンスとして移動できないので、いったん別名に移動し、その後元の名前に戻す。

利用状況を再度確認する。

lxc storage list でストレージの利用状況を再度確認する。 どこからも使われてない、未利用のストレージになっていれば、安全に削除ができる。

USED BY が ゼロになったらストレージを取り外しできる。

takuya@lxc-host:~$ lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| bt01    | btrfs  | /var/snap/lxd/common/lxd/disks/bt01.img    |             | 8       |
+---------+--------+--------------------------------------------+-------------+---------+
| bt02    | btrfs  | /var/snap/lxd/common/lxd/disks/bt02.img    |             | 0       |
+---------+--------+--------------------------------------------+-------------+---------+

ストレージを削除する

lxc storage の delete サブコマンドを使えば、未使用のストレージを削除することができる。

lxc storage delete bt02

実際やってみて

実際に移動をつづけて減らしていったのですが。インスタンスによって移動にとても時間がかかるものや、移動が失敗するものが現れる。

悲劇が起きたのは、lxc のインスタンスをストレージ間で移動中に、PCがスリープし、SSHセッションが切れてしまい、中途半端で移動が停止したときに悲劇が起きた。tmux/screen でうまく回避してやらないとめんどくさい。

移動が途中でおわっても元のインスタンスは残ってるが、移動先のストレージは btrfs/ZFS でサブボリュームが壊れてしまい復旧が面倒だった。

lxc の zfs プールを追加する。

lxc の zfs プールを追加する。

zfs が default だけじゃ使いにくいので。zfs のプールを追加する。

現在のプールを確認

lxc は現在 default と名付けられたZFS プールに紐付いている。

zfs プールを確認

lxc に使ってるストレージとはいえ、zfs であるので zpool コマンドをで確認できる。

zpool で一覧

 zpool list
NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
default    93G  90.1G  2.94G        -         -    71%    96%  1.00x    ONLINE  -

zpool status で詳細

名前がわかれば、zpool status をすることで詳細を見ることができる。

zpool status
  pool: default
 state: ONLINE
  scan: scrub repaired 0B in 0 days 00:07:12 with 0 errors on Sun May  9 00:31:13 2021
config:

        NAME                                          STATE     READ WRITE CKSUM
        default                                       ONLINE       0     0     0
          /var/snap/lxd/common/lxd/disks/default.img  ONLINE       0     0     0

errors: No known data errors

ZFS プールを作成・削除

lxc といえど、zfs で管理されているものは zfs の方法で作成・削除ができる。

ZFS プールに使うファイルを作成するには、zpool で指定してファイルをzfs に追加できる。

sudo zpool zfs01 /var/snap/lxd/common/lxd/disks/zfs01.img

ZFSのプールを作成して、ファイルをzfs プールに追加する。

sudo zpool create  zfs01 /var/snap/lxd/common/lxd/disks/zfs01.img

作ったプールを消すには

sudo zpool destroy zfs01

lxc と紐付けたものを管理するには

もっとかんたんに lxc storage コマンドで処理できる

lxc のコマンドに、storage create があるので、一発でプールの名前とファイル名を指定したストレージの追加ができる。

lxc storage create zfs01 zfs source=/var/snap/lxd/common/lxd/disks/zfs01.img

windowsのdiskpart のコマンドは先頭数文字入れればいい。

windows の diskpart のコマンドは長すぎる

たとえば、パーティションを選択するときに、select に続いて partition と英文字で打ち込むのだが・・・・長いです。

select partition 2 

partition はついつい t / i /oタイプミスしがちです。

短縮形でOK。

パーティションを選ぶときの partition や、削除するときの delete などは、まぁ打ち間違いやすい傾向にあります。 これらの単語は、同じ文字が何度も出てくるわけですから。

これ短縮できるんです。知らなかったです。

part でいい

partitionpart でいいんです。

DISKPART> select part 4

Partition 4 is now the selected partition.

del でいい

deletedel まで短縮できるんですよ。

DISKPART> del part 
 Virtual Disk Service error:
 Cannot delete a protected partition without the force protected parameter set.
DISKPART> del part override
DiskPart successfully deleted the selected partition.

ある程度の音節で済ませられるのは便利ですね。

省略形のほうが打ちやすい

今まで、なんで気づかなかったのが自分でも不思議です。

先頭3文字で許される。

list は lis でいいし、disk は dis でいい。

 DISKPART> lis dis

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          476 GB   175 GB        *
  Disk 1    No Media           0 B      0 B

select も sel でいいんですね。

DISKPART> sel disk 0

Disk 0 is now the selected disk.

select のあとの partitionpar まで省略できるんですね。

WindowsというかDOS時代に拡張子を3文字に限定したMSらしいといえばMSらしいですね。

現実的な落とし所は4文字だと思うけど。

pyenv で一時的にバージョンを変える- pyenv shell

pyenv で一時的にバージョンを変える

pyenv には、そのシェル内部だけ、一時的にバージョンを変えることができるサブコマンド shell が存在する。

pyenv shell の例

pyenv shell 3.7.2

コマンド類

基本的なコマンド pip / python などは pyenv で指定した方に併せられます。 これは pyenv の shims で実現されています。

シェルの有効範囲

シェルから起動したシェルは基本的に設定を引き継ぐ。

たとえば、次のような起動は、設定を引き継ぐ。

  • pyenv shell から起動したシェル(bash)から起動した bash ( pyenv shell → bash )
  • pyenv shell から起動したシェル(bash)から起動した sh ( pyenv shell → sh )

pyenv のスコープ(有効範囲)

python の pyenv には、影響スコープの設定がいくつかあって

  • system
  • global
  • local
  • shell

の順にバージョン指定を変えることができる。

global / local は .python-version を使って実現するのだが、

shell は完全に現在のシェルだけに適用されるので便利です。

pyenv shell は virtualenv activate とほぼ同じですね。

GPTとMBRの相互変換をWindowsのdiskpartコマンドで。

MBRとGPTの変換 ( windows )

WindowsMBR と GPT を変換する。

すでにGPTが普通になっているが、ときどきMBRなディスクが必要になる。 その時のために、 MBR/GPT の相互変換をWindowsでもできるように調べておいた

DISKPART の起動

ディスクの変更は、 コントロール・パネルのディスクの管理からでもできるが、diskpart のほうが楽だと思う。

管理者のPowerShellかコマンド・プロンプトで diskpart を起動する

MBRからGPTへ

diskpart に、convert コマンドがあるので、それを使えばオッケ。

convert gpt

GPTからMBR

逆をするだけですね。

convert mbt

MBR から GPTへ

mbr から gpt へ変更したいと思います。

ディスクの一覧の確認

最初に、接続されているディスクを確認します。Disk2を変更します。

Diskには、GPT にフラグ * がついてないので、MBRであるとわかります。

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          476 GB   175 GB        *
  Disk 1    No Media           0 B      0 B
  Disk 2    Online           14 GB    14 GB

ここからディスクを選びます。

DISKPART> select disk 2

いったん、このディスクをclean にします。

DISKPART> clean
DiskPart succeeded in cleaning the disk.

clean で掃除したら、GPTに変更します。

DISKPART> convert gpt

DiskPart successfully converted the selected disk to GPT format.

変換できました。

結果を確認します。Gpt 列にフラグ * がついているので、変換できたことがわかります。

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          476 GB   175 GB        *
  Disk 1    No Media           0 B      0 B
* Disk 2    Online           14 GB    14 GB        *

macでwq-quick のDNS設定使うとDNS問い合わせがおかしくなる

mac で wireguardをコマンドから使うと・・・

wg-quick を使って設定からDNSを設定しているのですが、DNSがおかしくなるのです。

wireguard のコマンド wg-tools をhomebrew でインストールし、それを使ってWiregurard接続をした。

接続は問題なく稼働する。だが、接続切断後後にDNS設定が元に戻されない。

調査してみた。

up / down を繰り返して表示されるログを確認した。

wg-quick up wg0
wg-quick down wg0

接続に使った設定は次の通り。

[Interface]
PrivateKey = YE7mc**************
Address = 172.16.4.3
DNS= 192.168.1.1

[Peer]
PublicKey = Dgh8*********s=
EndPoint= mydns.example.com: 12345
PresharedKey= 9YnmaD4***********fPvY=
AllowedIPs = 0.0.0.0/0

wg-quick の設定に DNS を設定している。

接続コマンドの実行結果

上記設定で実行すると、接続とDNS設定はうまくいくのだが、、、、DNSの書き換えが乱暴

takuya@wireguard$ wg-quick up wg0
(略
[#] networksetup -setdnsservers Bluetooth PAN 192.168.2.1
[#] networksetup -setdnsservers Wi-Fi 192.168.2.1
[#] networksetup -setdnsservers USB 10/100/1000 LAN 192.168.2.1
[+] Backgrounding route monitor

すべてのネットワーク接続設定に対し、set DNSが発行されています。

この設定はあまりにも乱暴だと思うんです。

切断後も残る。

切断してみると。DNS設定を削除していないことがわかります。

takuya@wireguard$ wg-quick down wg0
Warning: `/usr/local/etc/wireguard/wg0.conf' is world accessible
[+] Interface for wg0 is utun2
[#] rm -f /var/run/wireguard/utun2.sock
[#] rm -f /var/run/wireguard/wg0.name

接続時にはDNSを設定して、切断後にはDNS設定を消してないんですね。

設定が残ってしまった。これを確認する。

本当に設定が残ってしまったのか、確認してみます。

IFS=$'\n'; for i in $( networksetup  -listallnetworkservices | \grep -v aster); do echo "networksetup -getdnsservers  $i";networksetup -getdnsservers  $i  ;done

networksetup -getdnsservers  Bluetooth PAN
192.168.1.1
networksetup -getdnsservers  Thunderbolt ブリッジ
192.168.1.1
networksetup -getdnsservers  PPPoE
192.168.1.1
networksetup -getdnsservers  mopera
192.168.1.1
networksetup -getdnsservers  USB 10/100/1000 LAN
192.168.1.1
networksetup -getdnsservers  iPhone USB 3
192.168.1.1

これは残ってますね。これではVPN(Wiregurard)を接続していないと何もできなくなります。というかWiregurardのPeer先をIPでなくホスト名(ドメイン名)で指定していると二度と接続できなくる。

未削除で残存するDNS

マジか。こりゃ大変だ。ローカルDNSを参照したら詰む。

これは wg-quick のバグですね。

設定を削除します。

これでは大変なので、設定を一旦リセットしました。

IFS=$'\n'; for i in $( networksetup  -listallnetworkservices | \grep -v aster);do ;networksetup -setdnsservers $i "Empty" ;done

wg0.conf からDNSの設定を削除します。

原因は、wg-quick の設定でDNSエントリでのネットワーク設定が、妙ちくりんなで、それを使ったためです。

ということは、DNS設定は、マニュアルで PostUp / PostDown で書くしかありません。

wg0.conf

[Interface]
PrivateKey = XXXXXXXYE7mc=
Address = 172.16.0.3
### !ここが今回のエラーの原因。
# DNS= 192.168.1.1

[Peer]
PublicKey = XXXXXXXXXXXjs=
EndPoint= mydns.example.com:12345
PresharedKey= XXXXXXXXXfPvY=
AllowedIPs = 0.0.0.0/0

PostUp/PostDownをDNSの代わりに使います。

networksetup  -listallnetworkservices | \grep -v as  |  xargs -d '\n' -n 1 echo networksetup -setdnsservers $i "Empty" 

私は、GNU Xargsを使っているので、 -d のデリミタオプションで解決している。しかし、BSDPOSIX xargs だともっと大変になるだろう

PostUp   = bash -sc 'networksetup  -listallnetworkservices | \grep -v as  |  /Users/takuya/.bin/xargs -d "\n" -n 1 -I@  networksetup -setdnsservers @ "192.168.1.1"'
PostDown = bash -sc 'networksetup  -listallnetworkservices | \grep -v as  |  /Users/takuya/.bin/xargs -d "\n" -n 1 -I@  networksetup -setdnsservers @ "Empty"'

wireguard のDNS設定は危ういですね。

sed で改行削除/sedで全文(複数行マッチ)

sed で改行を消してCSVにしたい。

コマンドの結果の改行を消してCSVのようなカンマ区切りに変換したい。

他の置換ツールや python / rubyワンライナーに回せばいいと思うけど、sedでできたほうが汎用性が高そう。そのためsedで改行を置換、改行を別の文字に変えてCSVのような文字区切りをやってみる。

sed は行ごとの処理

sed は、「行ごと」で処理するのが基本動作なので、改行にマッチとか、改行を削除することはできない。

grep でもそうなんだけど、行処理が暗黙の前提なものを全体マッチにするときは、ちょっとオプションを見てあげると解決。

全体にマッチする。

マッチする箇所を「全体」に設定してあげるといい。

networksetup  -listallnetworkservices | \grep -v as | sed -z 's/\n/,/g'

-z オプション

-z オプションを使って、複数行に亘るマッチングができる。z は「全文・全体」と覚えれば絶対に忘れない。

bsd sed / gnu sed

macos で試したが、 -z があるのは GNU sed のみ。

macos などのBSDななsedでは、次のように。

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

macの場合は、brewgnu sed ( gsed ) をインストールしてもいいですね。

参考資料

https://orebibou.com/ja/home/201607/20160714_003/