redis に接続するクライアントだけインストールしたい
redis のクライアント redis-cli は次のコマンドでインストールする。
sudo apt install redis-tools
これで redisに接続して、データのやり取りをモニタリング出来る。
redis のクライアント redis-cli は次のコマンドでインストールする。
sudo apt install redis-tools
これで redisに接続して、データのやり取りをモニタリング出来る。
qemu で使える raw image なnon sparseな hdd イメージを qcow2 形式の sparse なファイルにする。
生イメージだとどうしてもディスク容量が節約できないので動的にディスク容量を確保するほうが良いよね。
直接イメージをマウントしてコピーすると手順が大変なことになってしまいます。そこで 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
virt-sparsifyはいくつオプションがあり、便利に使える。
virt-sparsify --check-tmpdir=fail $SRC $DST virt-sparsify --in-place $SRC $DST virt-sparsify $SRC--compress $DST
--check-tmpdir=fail
は /tmp
を使う前に残容量を確認し、容量不足になりそうならエラーとする。
--compress
は出来上がりのファイルを圧縮形式にする。使ってみた感じだとシングルスレッドで実行は遅いので時間がかかる。非圧縮に比べ容量は確実に減る。
--in-place
は、一時ファイルを作成せずに直接ファイルを書き換えに行く。容量不足になりそうならこれも選択肢である。ただし、sparsify 中に電源断などプロセスが止まったらファイルは壊れる。
状況に応じて使い分けるのがいい。
takuya@host:~$ 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です。
virt-manager で作ったqcow2のディスクで、特に設定しないとsparseにならないので注意が必要でした。
virt-manager ってsparseにしないんですね。いまはSSDだし?メモリもいっぱいあるから再配置オーバーヘッドよりもSSDのディスク容量のほうが貴重だしなぁ。
libvirt と qcow2 で使ったっ場合、virt-spasify は内部的に qemu-img が使われていて、/tmp に書き出されるので作業用の容量はある程度確保する必要がある。
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/resize-kvm-image-sparse-file/
http://libguestfs.org/virt-sparsify.1.html
追記
オプションについて追記。
iOS のSafariで JS / CSS の動作を確認しながら、shortcut.app の ページ内javascript 実行を書いてたのですが。
どうも謎のjavascript エラーが出るので Macに接続して iPhone Safari を Web Inspector ( 開発ツール)で覗こうとしたのですが 出来ない。
MacでSafariを開いても「開発」に、自分のiOSデバイスが出現しない、空っぽで iphoneが表示されない。なんどもUSB抜き差ししても現れない。本来なら WiFi/Bluetooth でつないでさえあれば、近くのiOSデバイスのSafariのデバッグツールはUSB接続していなくてもネットワーク経由で見えるはずなのだ。
→ iOS 側でセキュリティ設定をリセット掛けると治る
iOS 一般 → リセット → 位置情報とプライバシー
→ iOS とUSB 接続
信頼済みのコンピュータ登録し直し
その後 iphone をUSB接続し、iOSの信頼済みのコンピュータを再設定する。
私の場合はこれで解決しました。
信頼済みのコンピュータがおかしなことになってたと思われる。
リセット掛けるしか無いですね。
iOS/iphone のプライバシー設定がリセットされるんので、アプリ毎にGPS利用許可、カメラ利用許可など、アプリを起動するたびに再度利用許可が求められることになった。
LXC のコンテナ間の通信で、IPアドレスをいちいち調べるのがめんどくさい。
docker-compose に記載したホスト間なら、ホスト名でアクセスできるので、おなじことをLXCでやりたいなと思ったら。
出来るじゃん!!!
ping my-container-01.lxc
これで出来ることがわかる。
コンテナ間で、役割分担をするとき、とてもべんりである。
例えば、次のようなlxc コンテナが立ち上がっているときに
takuya@:~$ lxc list +---------------+---------+----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------------+---------+----------------------+------+-----------+-----------+ | mycontainer | RUNNING | 10.185.93.111 (eth0) | | CONTAINER | 0 | +---------------+---------+----------------------+------+-----------+-----------+ | nginx | RUNNING | 10.185.93.112 (eth0) | | CONTAINER | 0 | +---------------+---------+----------------------+------+-----------+-----------+
ping nginx.lxc ping mycontainer.lxc
と指定できるわけです。
とりあえず、ffmpeg でぱぱっと変換してみる。
ffmpeg -y -i ../video/sample.mp4 -vcodec libx265 -vf scale=720:-1 -acodec copy libx265.mp4
これだけでは、再生ができない。
x265 で変換した動画に tag:v hvc1 を付加すると iOS Safari で再生できる動画になる。
ffmpeg -i libx265.mp4 -c:v copy -c:a copy -tag:v hvc1 libx265-tag.mp4
おおお、再生できるじゃん。高圧縮使えるじゃん!
ffmpeg -y -i ../video/sample.mp4 -vcodec libx265 -vf scale=720:-1 -acodec copy -tag:v hvc1 libx265.mp4
これで、iOS Safariで再生できる動画ができあがる。TSの変換で活躍しそうですね。
iOS Safariで再生するなら、保存しているmp4 を変換するならタグだけでいいっぽい
必ずしもHLSにしてストリーミングにする必要はなさそう。
mac のgoogle chrome だと再生できませんでした。調査が必要かと思われる。chrome は webm使ってことかねぇ。
google chrome 見れる→ 見れない
VLC では見れる? → 見れる
omxplayer で再生できるのだろうか → raspi で再生できるのかな?→ 未チェック
ともちゃ先輩が面白そうなことをやっていたので、ちょっと真似てみる。
とも ちゃ日記(Tomo cha) - 元大学生のOL日記-
ちまたで、kawangoが暴れているDNSブロッキングというネタがあり、元々実装を検討していたものについて、便乗してみました。 (略) 糞みたいな広告で通信料および、お金が擦り落とされるのが非常に腹正しく、何かする方法がないか考えていた。もちろん、部屋でゴロゴロとしてPCでネットを見ていても、広告があまりにもうざく、嫌気を指していたので、対処するべく実装に至った。 そのほか、 @kawango2525の頭の悪さに、こいつの関係するサイトもブロッキングする実装とした。
つまり、広告で余計なパケットを浪費させられるのは「意図しないプログラムの実行」なので止めていいよね。カワンゴもdnsで都合の悪いものは止めろと公言してるわけで、kawangoさんの会社のサービスもDNSで止めちゃえってこと。前からやってみようと思ってたけど、unbound入れるまともなOpenWRTルーターがなかったので延期にしていた。VPSでDNSサービス立ち上げ選択肢もあったが、この場合一歩間違うとDNS amp の攻撃に使われちゃうし。x86 OpenWrt が無事に稼働しているし 設定をぶっ飛ばして初期化したのでついでに実装しておくことにした。*1
unboundの場合、次のようなホスト名の名前解決のルールを記入してあげると、該当のドメイン名は、ローカルに対する問合わせと処理され、「そのドメイン名にIPはなにもないぜ」という応答がクライアントに返されるようになる。
local-zone: "trafficgate.net." static
これは書式として次のようになっている。
# ゾーン=ローカル " ドメイン名 + . " static なにもなし local-zone: "${domain_name}." static
この書式に従っってドメイン名を追記していけば、「なにもない」という応答を返せる。
書式が通りに実際に記入してためしてみて、実際に問い合わせた結果が空になることが確認できたら、ドメイン名を追加していけばいい。 ブロックしたいドメイン名の一覧をどこからか取得すればいいわけです。
ドメインリストがあれば、dns blocking をローカルでやることができる。
今回は、私は、openwrt に入れたルーターのunbound dnsを使って 実験することにしました。
opkg install unbound
apt install unbound*
わたしは、OpenWrt のunboundなので、次のようになっています。
私の環境では、次のような include 関係になっています。include を重ねて管理していくのはどなたでも同じだと思います。
## ## 略 # include: /var/lib/unbound/unbound_srv.conf
include: /etc/unbound/280blocker-list.conf
## 適当なドメイン名で実在するものをテストで入れておく local-zone: "trafficgate.net." static
再起動
/etc/init.d/unbound restart /etc/init.d/dnsmasq restart
わたしは、dnsmasq がフロント(0.0.0.0:53)で、実際に問い合わせる先にunbound(0.0.0.0:5300)を指定してるので両方を再起動しています。両方のキャッシュを削除し設定を反映させています。
確認
dig trafficgate.net @192.168.1.1 dig trafficgate.net @1.1.1.1
unbound(+dnsmasq)に問い合わせた結果と、public dns に問い合わせた結果が異なることを確認します。
無事にDNS問い合わせが、マスキングされて空っぽになっていたら、これでブロッキングに使えますね。
https://280blocker.net/files/280blocker_domain.txt
これを借りてきます。
curl -L https://280blocker.net/files/280blocker_domain.txt \ | sed -e "s/\r//" \ | grep -E '^[a-z0-9]' \ | awk '{print "local-zone: \""$1".\" static"}' \ | sort | uniq
sed / awk / grep / sort /uniq をつかって整形します。
これで完成です。
スクリプトに更新して再起動する手順を手っ取り早くまとめておいて、あとはcron に登録しておきました。280blockerさんによると、毎月1度の取得で十分だそうです。
unboundのdnsブロッキングリストを更新する。 · GitHub
#!/usr/bin/env sh ## @since 2020-05-15 ## @last 2021-01-05 ## @author takuya ## unbound にブロッキング ## ブロッキングするURLを定期的に更新する function update_domain_lists(){ update280blocker updateYoutubeAdblocker } function geneate_conf(){ URL=$1 OUTPUT=$2 curl -sL $URL \ | sed -e "s/\r//" \ | grep -E '^[a-z0-9]' \ | awk '{print "local-zone: \""$1".\" static"}' \ | sort \ | uniq \ > $OUTPUT } function checkHTTPStatusIs200(){ URL=$1 RET=$(curl -IL -s -o /dev/null -w '%{http_code}' $URL) [[ $RET == 200 ]]; } function update280blocker () { URL=https://280blocker.net/files/280blocker_domain_$(date +%Y%m).txt ## mirror ## URL=https://raw.githubusercontent.com/junkurihara/280blocker_domain-mirror/master/280blocker_domain.txt OUTPUT=/etc/unbound/280blocker-list.conf if ! checkHTTPStatusIs200 $URL ; then echo failed; return 1 fi ## geneate_conf $URL $OUTPUT } function updateYoutubeAdblocker () { URL=https://raw.githubusercontent.com/anudeepND/youtubeadsblacklist/master/domainlist.txt OUTPUT=/etc/unbound/youtube-ad.conf ## if ! checkHTTPStatusIs200 $URL ; then echo failed; return 1 fi ## geneate_conf $URL $OUTPUT } function restart_unbund(){ [ -e /etc/init.d/unbound ] && /etc/init.d/unbound restart } function restart_dnsmasq(){ [ -e /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart 2>&1 > /dev/null } function main(){ update_domain_lists && restart_unbund && restart_dnsmasq } main
ためしてみてわかったのですが、DNSブロッキングは強烈に強力です。
DNSをTLS化したりHTTPS化してコンテンツの書き換えを防止したいというセキュリティ上の欲求の要請がよくわかります。
強烈に強力なので、これを監視に使いたいという欲求もよくわかります。
インターネット・イコール・DNSと言っても過言ではないので、こんな強力すぎるものをkawango と政府に握られるのはとても恐ろしやと思いますね。中国怖いです。はい。
DNSだけは死守しないと死にますね。8.8.8.8 / google public dnsや 1.1.1.1 / cloudflare dns がコンテンツフィルタリングしないとも限らないので、ちゃんとroot . から問い合わせる unboundを自宅に一つ持っておくべきだと思います。安易な8.8.8.8、ダメゼッタイ。
unboundでrootから引くdnsサーバを作り、DNSフィルタリングに備える - それマグで!
ついに牙を向いたPublic DNS - それマグで!
我々のDNS問い合わせは監視されている。 - それマグで!
Adguard HomeでVPSに広告ブロックDNSを立てました | 280blocker
とも ちゃ日記(Tomo cha) - 元大学生のOL日記-
https://blog.unko.pro/adblock-by-resolver/
280blocker さんに迷惑をかけないように書き直し。
まぁそのままでも動くんだけど、管理を統一したいので qcow2 にする。 パフォーマンス云々はあるだろうけど。そこま気にしないことにする。
次のコマンドを使う。
qemu-img convert
qemu-img convert -O qcow2 input.raw output.qcow2
拡張子は任意である。
マイクロソフトが配布する MSEged 用のova イメージをqcow2 に変換しています。
takuya@:~$ qemu-img convert MSEdge\ -\ Win10.ova -O qcow2 MSEdge\ -\ Win10.qcow2
出来上がりを確認する。
takuya@:~$ qemu-img info MSEdge\ -\ Win10.qcow2 image: MSEdge - Win10.qcow2 file format: qcow2 virtual size: 6.8G (7255876608 bytes) disk size: 6.8G cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false takuya@m75q-1:~$ qemu-img info MSEdge\ -\ Win10.ova image: MSEdge - Win10.ova file format: raw virtual size: 6.8G (7255876608 bytes) disk size: 6.8G
https://www.randomhacks.co.uk/how-to-convert-virtualbox-vdi-to-kvm-qcow2/ https://medium.com/@lonardogio/convert-vdi-virtualbox-to-raw-in-windows-c96bded29640
Ubuntu デスクトップを使っていと、なんとなく、reboot だとか shutdown コマンドを打ち込んでるんですよね。
shutdown -h now
強制シャットダウンをわりと気軽に打ち込んでるんだけど、shutdown コマンドってたしかスケジュールできたよな。と思って調べました
shutdown now
shutdown -r now
showdown +15
shutdown -r +60
shutdown -r 13:33
さっき再起動って言ったな、やっぱりなし
shutdown -c
シャットダウンのコマンドの他に似たような物がある。
halt reboot
などコマンドは多数あります。好きなのを使えばいいんだけど、じつは微妙に違うんだけど再起動・シャットダウンする目的であれば、あまり気にせず使える。
uptime を見ればわかるのですが、uptimeの基準になる起動時間最後のshutdown -r を見ることが出来る。
takuya@~$ who -b system boot 2020-04-28 18:30
最近の再起動の履歴を見ることが出来ます。
takuya@:~$ last -x reboot reboot system boot 4.19.0-8-amd64 Fri Apr 24 05:13 still running reboot system boot 4.19.0-8-amd64 Wed Apr 8 03:15 - 05:12 (16+01:57) reboot system boot 4.19.0-8-amd64 Sat Apr 4 18:20 - 03:14 (3+08:54) reboot system boot 4.19.0-8-amd64 Thu Mar 26 16:22 - 18:20 (9+01:57) reboot system boot 4.19.0-8-amd64 Fri Feb 28 17:38 - 16:22 (26+22:43) reboot system boot 4.19.0-8-amd64 Fri Feb 28 17:30 - 17:37 (00:07) reboot system boot 4.9.0-11-amd64 Sun Feb 9 06:50 - 17:37 (19+10:46) reboot system boot 4.9.0-11-amd64 Sat Feb 8 23:22 - 17:37 (19+18:15) reboot system boot 4.9.0-11-amd64 Sat Feb 8 20:33 - 17:37 (19+21:04) reboot system boot 4.9.0-11-amd64 Sat Feb 8 18:35 - 17:37 (19+23:02) reboot system boot 4.9.0-11-amd64 Sat Feb 8 12:00 - 17:37 (20+05:37) reboot system boot 4.9.0-11-amd64 Sat Feb 8 07:22 - 17:37 (20+10:15) reboot system boot 4.9.0-11-amd64 Fri Feb 7 21:18 - 17:37 (20+20:19) reboot system boot 4.9.0-11-amd64 Fri Feb 7 18:55 - 17:37 (20+22:41) reboot system boot 4.9.0-11-amd64 Fri Feb 7 11:41 - 17:37 (21+05:56)
NTTの壊れたv6を使っていると、IPoEを設定しない限り、外向きの通信ができない。
v6の設定をあれこれ触っていたりすると、v6 で apt 出来たり出来なかったりするので、とたんに不便になる。 まじ困る。
ubuntu の apt だとIPv6 で通信できないときに自動的にv4 に切り替わる。でも遅いよね。何が起きてるんだってパニクるので、つながらんときははっきりつながらんほうが良い。
sysctl で ipv6 全般を禁止するのは流石に不便なので、それはしたくない。でもapt とかはv4 に限定して安心したい。
apt の設定に、v4 強制の設定が追加されています。これを使うと解決します。
ipv4-only な apt にする。
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4
メールを送ろうとすると、SMTPをつかって、MIMEでエンコードして SMTP over TLSで接続してとあれこれ手順が必要。
その手順をrubygemでインストールして使い方を調べるのも面倒。
ubuntu とかサーバーで使ってるとローカルホストに exim4 や postfix くらいは用意していると思うんですよ。するとsendmail コマンドが使えるじゃないですか。
$ sendmail takuya@example.com Subject: Hi Hi hello from test .
ruby はIO周りと列挙周りだけは、本当にガチで便利ですよね。
シンプルなExim4と、シンプルなsendmail、そしてシンプルな ruby open。単純なものを組み合わせてしまう。
#!/usr/bin/env ruby # open("|sendmail -i -t > /dev/null",'w'){|f| f.puts 'To:takuya@example.com' f.puts 'Subject: Hello from ruby ' f.puts ' ' f.puts ' ' f.puts 'this is sample from ruby stdin' f.puts ' ' f.puts '' }
gem のインストールの管理が面倒だったり、 bundler といえども、どこにgemを導入しているか GEM_HOMEのLOAD_PATHであれこれ考える必要もない。gem を外すと楽だった。
単純なことは単純にやるのが一番ですよね。
KISS / Keep it simple stupid が大事ですよ。ほんと。凝りだすときりがない。
ついつい、癖で ip route show
って打ち込んでしまうんですよ。
旧き良きBSDなんだし ifconfig / netstat を使えばいいんだけど、 netstat -nr
って覚えにくいじゃないですか。
ip コマンドを出来る限り、 mac 用コマンドにWrappingした代替用の関数群が用意されてる。
これをいれれば、MacOSでも Linux / Ubuntu の ip コマンドが使える。完璧に一致することは不可能だけど、よく使うシンプルなものであれば問題なく使えそう。
takuya@Desktop$ uname Darwin # ⇐ mac です takuya@Desktop$ brew reinstall iproute2mac ==> Reinstalling iproute2mac ==> Downloading https://github.com/brona/iproute2mac/releases/download/v1.2.3/iproute2mac-1.2.3.tar.gz Already downloaded: /Users/takuya/Library/Caches/Homebrew/downloads/fdb133eaa8f1346a259295ba9aa22ab568e0dd6b6506cafab6891ae6e31fcf84--iproute2mac-1.2.3.tar.gz 🍺 /usr/local/Cellar/iproute2mac/1.2.3: 6 files, 22.5KB, built in 3 seconds
takuya@Desktop$ ip a en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether f0:18: inet 169.254.146.78/16 brd 169.254.255.255 en0
takuya@Desktop$ ip route show default via 192.168.1.1 dev en0 127.0.0.0/8 via 127.0.0.1 dev lo0 255.255.255.255/32 dev en0 scope link
ip route add も使えるので、ルーティングテーブルについては覚えることが減って楽になる。
ただし、所詮は糖衣錠です。子供用のシロップ風邪薬です。なので、BSDのネットワークコマンドと、mac の networksetup コマンド、これらをちゃんと覚えたほうがいいことは間違いない。
For advanced usage use netstat, ifconfig, ndp, arp, route and networksetup directly.
デリケートでデディケートな詳細な操作は、 netstat / ifconfig / ndp / arp / route / networksetup の各種コマンドを使う。
ルートを追加したり削除する。ip を追加したり削除する程度なら 十分に動いていました。
" program files " のような空白を含むパス名を持ったコマンド全体を、変数に保持しててそれを実行したい時
## これが実行できない。 cmd='ls ~/Library/Application\ Support/' $cmd
空白を含むパス名を入れたコマンドを文字列として、それを実行しようとするとエスケープの処理で頭を悩ますことになる。
cmd='ls ~/Library/Application\ Support/' eval $cmd
cmd='ls ~/Library/Application\ Support/' sh -c "$cmd":
https://stackoverflow.com/questions/836334/executing-commands-containing-space-in-bash
通常のディスクであれば、ddしたイメージファイルのサイズを変えてあげれば済むのだけれど、qcow2 のイメージファイルはsparse ファイルになっています。
なので、仮想マシンから見えるディスクサイズと、実際のディスクサイズが異なります。
qcow のファイルが実ファイルサイズと、仮想マシンからみたファイルサイズが異なるSPARSEファイルかどうか、それを確認するには次のようにします。
sudo qemu-img info test.qcow
可変サイズのファイルを増やしていく時は、次のように、resize と増分を指定します。
qemu-img resize -f qcow2 test.qcow +10G
コマンドは次の通り
qemu-img resize -f タイプ ファイル名 +増分サイズ
タイプは殆どの場合 qocw2 ですね。
逆に縮小するときは、--shrink オプションを付与します。
qemu-img resize --shrink -f qcow2 test.qcow -1G
ただし、--shrink
は削除していくので、データが有るとロストします。ディスクパーティションの後方から削除していくので、後方が空き領域になっている必要があります。gdisk / resize2fs や gpt GPated などで後方を開けてとかないと怖いですね。
試しに、QCOW2 のファイルを作成してみます。
$ qemu-img create -f qcow2 test.qcow 1G Formatting 'test.qcow', fmt=qcow2 size=1073741824 cluster_size=65536 lazy_refcounts=off refcount_bits=16
作成された仮想マシン用イメージのファイルの情報を確認します。
ホスト上の実ファイルのサイズは196Kで、仮想マシンのディスクとしてのサイズは1.0Gです。スパースファイルです。
$ sudo qemu-img info test.qcow image: test.qcow file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 196K cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false
リサイズしてみます。+1Gしてサイズを増大させます。
$ qemu-img resize -f qcow2 test.qcow +1G Image resized.
確認します。 ちゃんと、2GBになっていて、ホストから見たサイズは200Kになっていることがわかります。
$ qemu-img info test.qcow image: test.qcow file format: qcow2 virtual size: 2.0G (2147483648 bytes) disk size: 200K cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false
最近は、仮想マシンのサイズ変更については、いちいち仮想マシン内部で resize2fs や gdisk をしなくてもいいように virt-resize
というツールが用意されていて、容易に仮想マシンのディスクイメージを操作できるようになっています。仮想マシン内部でパーティションがどう使われていようとも、ホスト側から操作することができます。LVM化されてても。
リサイズをしたあとに、resize2fs を掛けると思う。resize2fs を掛けるために仮想マシンを起動するのはナンセンスなので、nbd 経由でQcowを直接マウントしてresize2fsすると楽
リサイズをするときは、殆どの場合で容量不足や無駄容量の節約である。
スパース(sprase file ) に変換して無駄容量を削減するのも一つの選択肢である
man qemu-img
sparse / resize /nbd はペアになってないと意味がないので記述とリンクを追加
PostgreSQLの基本的な管理を見ていきます。
基本的な管理はSQLとして psql のプロンプトで行うものを取り扱います。
initdb や createdb dropuser のようなシェルコマンドは今回扱いません。
インストール前に、日本語を扱う場合のポイント。
日本語環境が設定されて無いときは、日本語環境を作っておく。 時刻も日本JSTにしておく。
dpkg-reconfigure locales dpkg-reconfigure tzdata
日本語環境の設定してからインストールするのが無難。
sudo apt install postgersql sudo
postgres ユーザーが作成されるので、最初の処理は postgresql ユーザーで行う。
root@:~# sudo -u postgres psql
ユーザーの管理を psql コマンドで行うことができます。postgresql user と role がありますが、歴史的経緯みたいなものだと思っていればいいです。
ユーザーは login role のエイリアスだったはず。
ユーザーの一覧は psql で \du
を使います。 du は display user とでも覚えときましょう。
postgres ユーザー1つだけが存在します。
postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
ユーザーの追加は、 SQL で CREATE USER
を使えば可能です。
CREATE USER "takuya_1st" PASSWORD 'j0qViQjCzQMFfqH7';
シングルクォーテーション`ダブルクォーテーションに注意する!!PSQLは厳密に区別してる。
ユーザーを追加して、結果を確認。一つ増えるのがわかります。
postgres=# CREATE USER "takuya_1st" PASSWORD 'j0qViQjCzQMFfqH7'; postgres=# \du takuya_1st | | {} postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
ユーザーの削除は、 SQLのDROP USER
文でできます。
DROP USER "takuya_1st" ;
ユーザーを削除して、ユーザー一覧から消えたことがわかります。
postgres=# DROP USER "takuya_1st" ; postgres=# \du postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
パスワードの変更もSQLを使って可能です。
postgres=# ALTER USER postgres WITH PASSWORD 'rHBrECDNjbWax1IZ'; ALTER ROLE
初期ユーザーの postgres のパスワードを変えてみるなど。
postgresql では ユーザのことを role と呼びます。 LOGIN できるロールのことをユーザーと呼ぶ。と覚えてください。 歴史的経緯によるとでも思っておけばいいと思います。UNIXのユーザーようにPostgreSQLのユーザーはグループをもっていて、グループにロールで管理されています。1つのデータベースのインスタンスを多数のクライアントで共有していた名残りでしょう。個人でデータベースを作る、個人でプログラムから使うときなど、はあまり気にしなくていいと思います。
これは、create user と同じ
CREATE ROLE "outline_Admin" PASSWORD '01UNeD86gwVmRDRG';
日本語UTF-8に対応したテンプレートを作る。
シェル環境変数が LANG=ja_JP.UTF-8なら自動で作られるのだけど。作られていないとUTF-8でも行けそうなん。 気持ち悪いなら、日本語対応したテンプレートを作っておくといいかもしれない。
CREATE DATABASE template1 LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' TEMPLATE template0; CREATE DATABASE template2 LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' TEMPLATE template0; UPDATE pg_database SET datistemplate = true where datname = 'template2';
対話プロンプト psql のコマンドで \l
でデータベースの一覧を見れます。 List database の L(エル)と覚えておけばいいでしょう。
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
ここで出てくる template は言語ごとのCollationが設定されたテンプレートです。debian/ubuntu の場合 LANG=ja_JP.UTF-8のbashから apt install postgres
すると postgres のaptインストールスクリプトで自動生成されます。
データベースを切り替えるにはつぎのように psql コマンド \c
で可能です。
\c databae_name
これは、mysql の use DATABASENAME に相当する。
切り替えたときのサンプル。プロンプトが変わるのでわかる。
postgres=# \c outline You are now connected to database "outline" as user "postgres". outline=# \q
SQLでデータベースを作成することができます。
CREATE DATABASE my_database;
outline という名前でデータベースを作って一覧を見てみます。
postgres=# create database outline; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- outline | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
SQL 構文でデータベースを削除することができます。
DROP DATABASE my_database;
outline という名前のデータベースを削除し、一覧を見てみます。
postgres=# drop database outline; DROP DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
SQLでデータベースを作るときに所有者(オーナー)を指定して作ることができます。
CREATE DATABASE takuya_database OWNER "takuya";
これは非常によく使います。
ユーザーを作成し、続けてそのユーザーのデータベースを作成します。
postgres=# CREATE USER "outline_Admin" PASSWORD 'kj4zzkvVXuU7MlSL'; CREATE ROLE postgres=# create database outline owner "outline_Admin"; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+------------------------+----------+-------------+-------------+----------------------- outline | outline_Admin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
文字コードを指定してつくると便利です。 テンプレートを使って作る事が多いです。
CREATE DATABASE outline LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' CREATE DATABASE outline LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' TEMPLATE template0;
template が en_US だし困ったなぁってときに、日本語でDBを作成しておくとトラブルが減る*1
オーナー指定とテンプレート指定、文字コード指定を「全部合わせ」てデータベースを作成している例です。
CREATE DATABASE outline owner "outline_Admin" LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' TEMPLATE template0; postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+------------------------+----------+-------------+-------------+----------------------- outline | outline_Admin | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | repost | repost | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
postgres=# \c outline ### データベースの一覧 postgres=# \l ### ユーザー一覧 postgres=# \du
# ユーザー作成 CREATE USER "takuya_1st" PASSWORD 'j0qViQjCzQMFfqH7'; ## パスワード変更 ALTER USER postgres WITH PASSWORD 'rHBrECDNjbWax1IZ'; # データベース作成 CREATE DATABASE takuya_database ; CREATE DATABASE takuya_database OWNER "takuya"; CREATE DATABASE outline owner "takuya" LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8'
更新
*1: 個人の感想です。
ls -t | head -n1
ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。
takuya@Gitlab:~$ sudo ls -lt /var/opt/gitlab/backups/ total 92268132 -rw------- 1 git git 43629199360 Apr 25 02:20 1587748340_2020_04_25_12.9.2_gitlab_backup.tar drwx------ 7 git git 4096 Apr 4 03:40 tmp -rw-r--r-- 1 takuya takuya 47202314240 Apr 4 02:17 1585836147_2020_04_02_12.9.2_gitlab_backup.tar -rw------- 1 git git 3651025200 Apr 3 22:25 registry.tar.gz
ただし、取り出せるのは「basename」のファイル名です。
takuya@Gitlab:~$ sudo ls -t /var/opt/gitlab/backups/ | head -n 1 1587748340_2020_04_25_12.9.2_gitlab_backup.tar
find コマンドでもできます。
最新の1件だけを取り出すには、head と組み合わせれば大丈夫かな。
find /var/opt/gitlab/backups/ -type f -printf "%T@ %p\n" | sort -nr| head -n 1
find コマンドには printf のオプションがあって、これを使ってsort してあげれば、カンタンに実現できます。
takuya@Gitlab:~$ sudo find /var/opt/gitlab/backups/ -type f -printf "%T@ %Tc %p\n" | sort -nr [sudo] password for takuya: 1587748816.6963751750 Sat Apr 25 02:20:16 2020 /var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar 1585934261.3147121750 Sat Apr 4 02:17:41 2020 /var/opt/gitlab/backups/1585836147_2020_04_02_12.9.2_gitlab_backup.tar 1585920302.0000000000 Fri Apr 3 22:25:02 2020 /var/opt/gitlab/backups/registry.tar.gz
find の場合は、パス名で返ってくる。 パスで取れるのは、ls に比べて便利かもしれない。
最新ファイルのフルパスがほしいときは、 find の引数にフルパスを入れてあげればいいのだから。
takuya@Gitlab:~$ sudo find /var/opt/gitlab/backups/ -type f -printf "%T@ %p\n" | sort -nr| head -n 1 | cut -d' ' -f2 /var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar
https://superuser.com/questions/294161/unix-linux-find-and-sort-by-date-modified