それマグで!

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

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

Goole App Script ( GAS ) の基本的な操作方法。03.ダイアログでハローワールド

前回の続き

前回までで、コンソールにログをとして出力する。

今回は、スプレッドシートと連携する。

スプレッドシートと連携してハローワールドをスプレッドシート側に出す。

スプレッド・シートに出力ーダイアログ

スプレッド・シートにハローワールドをダイアログとして表示する。

スクリプトエディタで、Browser.msgBox関数を書き込んでいく。
このとき、補完を体験しておく。

Broと打てば補完が効く。

f:id:takuya_1st:20210604031659p:plain

続けて msgBox で補完が効く。

f:id:takuya_1st:20210604031716p:plain

ダイアログを表示する関数を作った

f:id:takuya_1st:20210604031623p:plain

実行する

f:id:takuya_1st:20210604051146p:plain

実行ボタンを押して権限を承認。

実行すると、権限チェックを求められます。

スクリプトGoogle Spreadsheetにアクセスする権限が必要になります。

権限はそのまま許可してあげればオッケです

f:id:takuya_1st:20210604031413p:plain

ダイアログが表示される。

権限の画面遷移が終われば、ダイアログが表示される。

権限は、初回起動時のみで、次回以降は権限があるので確認されない。f:id:takuya_1st:20210604031415p:plain

実行者ごとに権限。

自分のアクセスに関するアクセス権限なので、別人物(別アカウント)が実行するときにはまた別に権限が必要になる。

スクリプトはローカル

スクリプトはあくまでJSなので、ローカルのブラウザ内部で実行され。そのために、リモートにあるGoogle Spreadsheetへアクセス権を要求する。などと考えたら理解しやすいと思う。

続く

長いので分割しました。次に続く→ 04

     

   

Goole App Script ( GAS ) の基本的な操作方法。02.関数の追加

前回の続き

前回はハローワールドを実行した。

今回は関数を追加する。

関数を追加して、実行する。

関数を追加する。

2つ目の関数を作って使う。関数を作って使うために、サクッと関数を作る。

f:id:takuya_1st:20210604031135p:plain

実行する関数を選ぶ

関数は実行時に選択する必要があるので、作った関数を選択する。

f:id:takuya_1st:20210604031240p:plain

関数を選んでから実行する

関数を選んでから実行ボタンを押す。

f:id:takuya_1st:20210604031247p:plain

実行ログ。

結果が出てくる。

f:id:takuya_1st:20210604031322p:plain

console.log は実行ログ。

console.log は、実行ログとしてスクリプト・エディタに表示される。スクリプト・エディタでの実行ログは初期ロード時に非表示なので、画面構成が変化 するのですぐ気づけると思う。

続く

長いので分割しました。次回に続く→ 次 03

     

 

  

Goole App Script ( GAS ) の基本的な操作方法。01.コンソールでハローワールド

GAS を始める。

GAS を始めるときに、最初に手順を覚える。

最初の流れ。

  1. Google Driveで新規スプレッドシートを作る
  2. スプレッドシートを開ける。
  3. ツールからスクリプト・エディタを開く
  4. ツールから実行する

この記事で取り扱うこと

  • スクリプトエディタの起動
  • ハローワールドの実行(コンソール)
  • 関数の追加と実行
  • スプレッドシートにハローワールド(ダイアログ)
  • スプレッドシートにハローワールド(セルに記入)
  • 複数ファイル分割
  • ファイルのロード順
  • 最初に実行される関数
  • メニューで実行
  • ボタンで実行
  • ショートカット

準備 / Google Driveで新規作成する

Google Driveで新規スプレッド・シートを作って、そのファイルを開く。

スプレッドシートを作り開く

右クリックメニューから新規、スプレッドシートを選んで、新規作成

f:id:takuya_1st:20210604025908p:plain

スクリプトエディタを開く

スプレッドシートが開いたら、メニューからスクリプトエディタを選択する

f:id:takuya_1st:20210604025922p:plain

スクリプト・エディタを別のウインドウにする

スクリプトエディタが別タブで開く。スクリプトエディタとスプレッドシートはペアで使う。

別ウインドウにしておいたほうが、動作チェックが楽。たくさん試すときは、別ウインドウにしておくほうがいい。

f:id:takuya_1st:20210604025932p:plain

別ウインドウで開いておけば、スクリプトを実行したときにすぐに結果がわかる。視覚的にわかるので便利。

f:id:takuya_1st:20210604025935p:plain

GAS でハローワールド

console.log でハローワールドを書く。

f:id:takuya_1st:20210604030401p:plain

実行ボタンを押す。

上部メニューから、実行を押す。

f:id:takuya_1st:20210604030403p:plain

下部に実行結果が出てくる

下部の実行ログの部分に、実行結果が表示される。

f:id:takuya_1st:20210604030550p:plain

続き

長いので、分割しました。

次に続く→02 

  

  

potainer でユーザとチーム毎に管理できるホスト(endpoint)を設定する。

ユーザ毎にアクセス権(利用可不可)設定する。

Portainer は「Role単位の詳細権限」については、Bussiness版が必要なのだが、

チーム(グループ)とユーザ毎に、このDockerホストを許可する許可しないと設定できる。

少しわかりにくかったのでメモ。

f:id:takuya_1st:20210531153354p:plain

Endpoints の右カラムから行う。

Portainerに登録された、エンドポイント(サーバー)を1単位として、ユーザにアクセス権を設定できる。 これで、複数のPotainerを起動しなくて済ませられるのは熱い。

f:id:takuya_1st:20210531153813p:plain

アクセス権とユーザー単位で分けておけば、不意に他の人のインスタンスやサーバーをダウンさせてしまうことが減るので便利ですね。

事前にエンドポイントを設定する必要がありますけど。エンドポイントはdocker in docker は docker in lxc などで増やしてしまえばいいので。

docker別ホストから接続、管理SockをTCP経由許可して利用する。

docker の管理を別ホストから行いたい

ほとんどの人はDockerが動いているマシンへ SSHで接続してるともう。

ssh 経由で docker を使う場合

作業用PC ----<SSH>---- docker-host

リモートのDockerがインストールされたマシン中でdocker コマンドを叩いている場合

接続の詳細。

実際には接続がUNIX のソケット経由になっている。

作業用PC ----<SSH>---- docker-host----<unix:/socket>----/var/run/docker.sock

ん?unix/socket?そうですね。ソケットファイル経由です。
「だったら、ファイルじゃなくポートをリッスンすれば直接つながるのでは?」と思った貴方は大正解です。

tcp 接続でダイレクトに接続できる。

docker は TCPリッスンできるので、socket を経由しなくてもダイレクトに接続ができる。

作業用PC --------------- tcp ----------------- docker-host

SSH経由に比べると、ポートは開きっぱなしだし、認証関係もすっ飛ばすし、危険性が高いように思えるかもしれないが 仮想マシン間、開発マシンと仮想マシン、ローカル内部でこれを使うとサクッと接続できるので、便利です。

Docker のTCP接続を有効にする

-H を使って tcp へのリッスンを追加する。

/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

ただしfd を消しちゃうと socket ファイル経由で接続ができなくなる。

ubuntu の docker にTCPをリッスンさせる

ubuntu で apt install docker.io でインストールした apt のdocker の場合、起動管理をsystemd が行っているのでsystemd のサービスファイルを書き換える。

sudo vim /lib/systemd/system/docker.service

該当サービスの ExecStartに -H tcp://0.0.0.0:2375 を追記する。

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

systemd をリロードして docker を再起動する

sudo systemctl daemon-reload
sudo systemctl restart docker

これでTCP経由で接続ができる。

クライアント側から docker接続する

docker コマンドは、DOCKER_HOST 変数で接続先を任意に指定することができる。

DOCKER_HOST=tcp://192.168.100.100:2375 docker ps

または、継続的に変数に入れてあげる。

export DOCKER_HOST=tcp://192.168.100.100:2375
docker ps 

これで、docker を任意のマシンからSSHすることなく操作ができる。

2375 はデフォルトのポートでWindowsのDockerが初期インストール時にデフォルトに設定されていたので。同じものにしました。

portainer / windows docker で使われています。

この機能、portainer や docker windowsで公式に使われています。注意深く見ていると気づいたと思います。

この公式機能であるポートリッスンを使えば、いちいちSSHしなくていんですよね。

portainer などと組み合わせる。

portainer など docker 管理のシステムと組み合わせるときにどうしてもこれらの設定が必要になってくる。

ポート管理に注意

ローカル中のdocker であれば、権限は ユーザーごとに決めることができるが、TCPをリッスンしてしまうと制御不能なので、取り扱い注意ですね。*1

参考資料

How do I expose the docker API over TCP? - Server Fault

*1:前時代のtcpwrapperやxinetd的な systemd.socketを間に挟んでゴニョゴニョすればできるんだろうけど

docker で systemdが動く ubuntu イメージを作って遊ぶ-その2

前回、systemd を動かした。

前回の続き

docker の起動コマンドを /sbin/init にすれば、 docker の ubuntu でも systemdを使って遊べることがわかった。

単純な作業だったので、dockerfile でイメージ化して遊ぶ

dockerfileを作って遊ぶ

FROM ubuntu:20.04
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends init

ENTRYPOINT ["/sbin/init"]

ビルド

dockerfileをビルドしてイメージにする。

docker image build -f Dockerfile -t ubuntu-systemd .

イメージを起動

コンテナは特権コンテナのほうが楽だけど、他に同じようなことをやってるひとを github見つけた。 その人の使ってるセキュリティ起動オプションを使う。

docker run -d   \
  --security-opt seccomp=unconfined \
  --tmpfs /tmp \
  --tmpfs /run \
  --tmpfs /run/lock \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  -t ubuntu-systemd:latest

無事に起動することがわかる。

確認

nginx をインストールして systemd 経由でちゃんと起動するか確かめてみる。

docker exec -it 56e -- apt-get install nginx  --no-install-recommends
docker exec -it 56e systemctl status nginx
docker restart 56e systemctl status nginx
docker exec -it 56e systemctl status nginx

nginx が再起動後に起動することがわかる。

takuya@ubuntu:~/ubuntu-systemd$ docker exec -it 56e systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:nginx(8)
takuya@ubuntu:~/ubuntu-systemd$ docker exec -it 56e systemctl start nginx
takuya@ubuntu:~/ubuntu-systemd$ docker exec -it 56e systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-05-25 17:16:51 JST; 1s ago
       Docs: man:nginx(8)
    Process: 611 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 612 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 613 (nginx)
      Tasks: 5 (limit: 1388)
     CGroup: /system.slice/snap.docker.dockerd.service/system.slice/nginx.service
             ├─613 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─614 nginx: worker process
             ├─615 nginx: worker process
             ├─616 nginx: worker process
             └─617 nginx: worker process

May 25 17:16:51 56e5331be46b systemd[1]: Starting A high performance web server and a reverse proxy server...
May 25 17:16:51 56e5331be46b systemd[1]: Started A high performance web server and a reverse proxy server.
takuya@ubuntu:~/ubuntu-systemd$

まとめ

/sbin/init もちょっとしたことで動くんだね。

でも公式でやってないということは・・・

遊べることがわかったけど、公式でやってないということは。何らかの問題があるのでサポートしてないんだろう。

また、先人がやってないということは、この手法を突き詰めることは徒労に終わる可能性が高いので、遊ぶのはここまで。

systemd は本当に多機能なので、直接使うと無駄が多いとか、そういう理由で supervisord を使ったりするかも。

docker の設計思想がシングルプロセスなのでdocker-composeを使うんですよ。きっと

例えば systemd-multiuser.target

マルチユースなマルチユーザーを前提にした multiuser や logind はいらないよね。

そう考えるとやっぱり無駄が多そう。

例えばシャットダウン

シャットダウンはできない。

root@db1ccf6f38c6:/# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         678  1.0  0.0   4108  2540 pts/1    Ss   18:30   0:00 bash
root         686  0.0  0.0   5896  2140 pts/1    R+   18:30   0:00  \_ ps auxf
root           1  0.5  0.0  16308  5020 ?        Ss   18:27   0:01 /lib/systemd/systemd-shutdown reboot --timeout 90000000us --log-level 6 --log-target kmsg --log-color

シャットダウンできるわけでもない。

次のようなsystemctl が使いたいだけにはヘビィすぎる。

systemctl restart nginx 

systemd は本当に巨大なので、必要な部分だけ取り出して使おうとすると、ちょっとめんどくさいですよね。

追記 Windows Dockerで動かした場合

WSL2のWindowsなDockerで動かした場合、特権なしで動きました。

もしかして世間にあふれるブログ情報でsystemd / init を動かしたと書かれていたらWindowsでの話かもしれません。

WindowsのDocker (WSL2・Hyper-V)で動かした場合に特権なしで動いている例。 特権なしの代わりに sys_admin のCapabilityをADDしています。

参考資料

GitHub - bdellegrazie/docker-ubuntu-systemd: systemd-enabled versions of Docker base images

https://stackoverflow.com/questions/39169403/not-able-to-use-systemd-on-ubuntu-docker-container

dockerで systemd が動く ubuntu を作って遊ぶ - それマグで!

dockerで systemd が動く ubuntu を作って遊ぶ

はじめに

docker ではシングル・プロセスが前提なので、複数のプロセスを起動するべきではない。

それでも、ちょっと動かしてみたいと思うのが、遊びゴコロってやつ。docker で systemd を動かしてみたらどうなるのか。

今回は、Raspi4 の高速マシンがあるから遊んでみようと思います。

前提

docker がインストールされたホストOS。

完全仮想化か物理ホスト上で試す。

仮想化中のdockerなどは権限設定が大変なので考慮しない。 docker in docker だとか、 docker in lxd とかは動作がおかしくなる可能性があるんで、今回は考慮しない。

準備 raspi に docker インストール

素の ubuntu に、 docker をインストール。

最初に、ubuntu for raspberry pi 4 を持ってきて、raspiに ubuntuをしている。この素のubuntu に docker をインストール

snap 経由で docker をインストールする。

sudo snap install docker 

snap のdocker は一般ユーザからコマンドを使えないので、グループを追加して、パーミッションを変えて一般ユーザでもdocker コマンドを扱えるようにする。

自分自身のユーザをdocker グループに追加する。 groupadd と usermod でぱぱっと

sudo groupadd docker
sudo usermod -aG docker $USER

docker の socket ファイルの権限を chown で変えておく。

sudo chown root:docker /var/run/docker.sock
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

docker サービスを再起動。

sudo reboot 
## または
systemctl restart docker.service

これで準備が完了。

ubnutu(systemd)な-docker を作る 全体の流れ

全体の流れはざっくりいうと、systemd をインストールしてイメージ化、その後に起動コマンドをsystemdの /sbin/init にして作成したイメージを起動する

  • ubuntu を起動する
  • systemd をインストール
  • イメージとして保存
  • イメージを起動(起動コマンドは /sbin/init)

イメージを作成するのがちょっとしたポイントだと思う。

systemd をdockerで使うポイント

docker で ubuntu を systemd で起動する。これをするにはいくつかのポイントがある。

  • docker ubuntu では systemd が含まれてない。
  • systemd を起動するには権限が必要
  • systemd は /sbin/init で起動する
  • docker は起動するプロセスを指定する
  • docker run で起動するプロセスは /sbin/init にする

これらのポイントをちょっとだけ見ておく。

systemd は /sbin/init の代替として /etc/init.d から upstart から 置き換えられたプロセスで PID=1としてすべてのプロセスの祖先になる。

docker は 敢えて /sbin/init を外すことでシステム起動をプロセス単位に分離している。その代わりに docker run で起動するコマンドをしていて起動する。

これらを考慮すると、何らかの形で /sbin/init をインストールしたイメージを作り、docker run で /sbin/init を指定すれば起動するのではないかと思われた。

systemd で起動する ubuntu イメージを作る。

最初にすることは systemd init がインストールされたUbuntu を作りイメージとして保存し、イメージとして取り込む。

#

最初に、ubuntu をdocker で起動して、/sbin/init をインストールしてやる。

docker run --rm  -it  ubuntu:latest

ubuntu は起動コマンドを指定しないと bash が起動する。

起動した ubuntu で、systemd をインストールする

apt update 
apt install init 

この状態で、ログインしたまま起動状態を維持ておく。

別のターミナルを立ち上げて、起動中のdocker インスタンスをイメージとして取り出す。

別ターミナルからイメージ作成

docker 起動中のコンテナIDを調べて、tar ball ファイルとして取り出す。

docker container export bcdfc201cd09 > ubuntu-init-installed.tar

イメージが作成できたら、initをインストールしたインスタンスは不要なのでbashをCtrl-Dで終了しインスタンスを消しておく。

イメージを取り込む。

イメージが作成できたら、作成したファイルをdocker image として取り込む tar のファイルを イメージとしてインポートする。

docker image import ubuntu-init-installed.tar  takuya/ubuntu-init-installed:latest

takuya/ubuntu-init-installed:latest は イメージの名前とTAG を指定してる。イメージ名がtakuya/ubuntu-init-installedで、タグがlatest である。

systemd を指定して、docker イメージを起動

インポートしたイメージを起動する。

docker は指定したプロセスを起動するのので、systemd 経由で起動するように、/sbin/init を指定して起動する。

ただし、/sbin/init はインタラクティブシェルを提供しないので、 デタッチで起動する。

また、ここで 特権コンテナ--privilegedを指定する 。特権をコンテナでないとsystemd は動いてくれない。

docker run --privileged --rm -d takuya/ubuntu-init-installed /sbin/init

起動の確認

特権をコンテナで無事に起動すると dbus などが使えるので通常通りのsystemdなubuntu とほぼ同じ状態で起動する。

ちゃんと/sbin/init がPID=1で起動しているのがわかる。

 docker exec -it 356f77ee1bb1 ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          51  0.0  0.0   5468  2452 pts/0    Rs+  03:29   0:00 ps auxf
root           1  3.6  0.1 165800  9244 ?        Ss   03:29   0:00 /sbin/init
root          21  1.4  0.1  34648 10488 ?        S<s  03:29   0:00 /lib/systemd/
systemd+      33  0.9  0.0  20964  6240 ?        Ss   03:29   0:00 /lib/systemd/
systemd+      34  0.9  0.0  89940  3704 ?        Ssl  03:29   0:00 /lib/systemd/
message+      37  0.1  0.0   7948  3596 ?        Ss   03:29   0:00 /usr/bin/dbus
root          39  1.6  0.2  26124 16820 ?        Ss   03:29   0:00 /usr/bin/pyth
root          41  0.6  0.0  16028  6124 ?        Ss   03:29   0:00 /lib/systemd/
root          45  0.0  0.0   2344  1484 ?        Ss   03:29   0:00 /sbin/agetty

あっさりと起動した。ずいぶんと拍子抜けである。 docker ではマルチなプロセスを管理するべきではないと言われて久しいが、動くものは動くのであるな。

nginx / ssh が有効になったイメージを作ってみる。

nginx や ssh が有効になったイメージを作ってみる。

systemd がインストールされた ubuntu を作れたので nginx / ssh をインストールして 起動と同時に ssh と nginx が起動するイメージの作成を試みる。

systemdなubuntuを起動して

docker run --rm --privileged -d takuya/ubuntu-init-installed  /sbin/init
docker exec -it 8f72eab2c5be  apt install openssh-server nginx

イメージとして取り出してインポート

docker export 8f72eab2c5be > ubuntu-init-installed-with-ssh-nginx.tar
docker image import ubuntu-init-installed-with-ssh-nginx.tar  takuya/ubuntu-init-installed:ssh
docker run --rm --privileged  -d takuya/ubuntu-init-installed:ssh  /sbin/init

チェックすると。問題なく動きますね。

 docker exec a2ef6147fdc systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-05-25 03:54:03 JST; 22s ago
       Docs: man:nginx(8)
    Process: 40 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 48 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 52 (nginx)
      Tasks: 5 (limit: 9257)
     CGroup: /docker/a2ef6147fdcc209a31cd1774234b461c20a85c9540e29b910089e5a44935fe20/system.slice/nginx.service
             ├─52 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─53 nginx: worker process
             ├─54 nginx: worker process
             ├─55 nginx: worker process
             └─56 nginx: worker process

May 25 03:54:03 a2ef6147fdcc systemd[1]: Starting A high performance web server and a reverse proxy server...
May 25 03:54:03 a2ef6147fdcc systemd[1]: Started A high performance web server and a reverse proxy server.

あっさり動いてしまうんですね。

特権コンテナに注意。

特権コンテナは docker in docker のような特殊な用途であったりする目的のためにある。

あれこれ細かいところは省きますが、特権コンテナを使うので公開サーバーに利用は控えること。

用途

docker で apt を試したいときや、仮想マシンを起動するほどもでもない開発環境で export してぱぱっと渡したいとき。 初心者が多い開発チームなど、トラブルを回避するために一時的に export して import させてぱぱっと開発環境を再現させたり。とか便利そう。

ちょっと開発環境でインストールを試したいときとかそういうときにも便利そうですね。

dockerfile

動作の仕組みさえわかれば、dockerfile で systemd を書くことも不可能ではなさそう。私は開発環境でちょっと試したいとかなのでdocker export で満足しているので試さなかった。

まとめ

/sbin/init をインストールした状態で privileged で起動すると動かせる。

raspi4 8GB はマジ高性能なので実験環境に最適だった。

ただし、arm(aarch64)なraspiからx86_64 なamdは相互にexport/import出来ないはずなのでそのへんはちょっと注意。

特権コンテナには十分に注意しないといけない。特権コンテナは通常の物理ホストと何ら変わりなくdocker の仕組み上プロセスやファイルが分離されているようなことはない わかりやすいトラブルとして、 このコンテナが乗っ取られたときに、 docker 内部 docker をインストールされてしまい、docker run -v /:/real-hostと内部でマウントされてしまうと目が当てられない。

参考資料

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 から強引に消すことで解決した