リモートマシンのファイルをrsyncでバックアップする例

前提

  • リモートマシン名: remote
  • ユーザ名:foo(リモート、ロカールとも)
  • ローカルでssh-agentを使用。リモートマシンにはパスフレーズ入力なしでsshログイン可能にしておく(rsyncはデフォルトでリモート接続にsshを使用するため)
  • リモートもローカルも、rsyncをパスワードなしでsudo可能にしておく (ローカル側はパスワードの手入力可能かもしれないが未検証)

リモートマシンで自分が所有するホームディレクトリ上のworkディレクトリ以下をローカルのwork.backupにバックアップ

rsync -avzPi remote:work/ work.backup
引数の概要
  • a: パーミッション、所有者、タイムスタンプなどの属性を維持
  • v: 詳細メッセージ表示
  • z: データを圧縮(ネットワークが広帯域の場合、付与しないほうが良いケースあり)
  • P: 進捗を表示
  • i: 更新されている属性を表示

リモートのroot権限でのみ読み取り可能な/eggplantディレクトリ以下をローカルの/eggplant.backupにバックアップ

sudo -E rsync --rsync-path="sudo rsync" -avzPi foo@remote:/eggplant/ /eggplant.backup
  • 最初のsudoは、ローカルでrootのみが書き込み可能なディレクトリ/eggplant.backup以下にバックアップするため。またファイルの所有者が自ユーザ以外の場合、そのユーザに変更するためにも必要
  • sudoの引数-Eは、ssh-agentをsudoしたあとも有効にする(sshコマンドは、通信すべきssh-agentプロセスを環境変数から知るため)
  • --rsync-path="sudo rsync"は、リモート側のrsyncをroot権限で起動する。リモート側で所有者がrootであっても、fooユーザで読み取り可能な場合は不要

Linux版のDaVinci Resolveでfcitxにより日本語を入力する

動作確認環境
  • Debian12
  • fcitx5-frontend-qt5:5.0.16-1+b3
  • DaVinci Resolve 19.3
DaVinciが保持しているQtのライブラリディレクトリへホストのライブラリをリンク
sudo mkdir /opt/resolve/libs/plugins/platforminputcontexts
sudo ln -s /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so /opt/resolve/libs/plugins/platforminputcontexts

マウントされたディレクトリのEFIパーティションにGrub2をインストールする方法

USBドライブ起動のLinuxなどから、Grub2をインストールする方法を以下に説明する。 これは、EFIパーティションが壊れた時などに役立つ。

手順は以下のとおり
  • rootfsをマウントしておく。以下の例では/mnt/rootfs
  • 上記rootfsの/boot/efiにESP (EFI System Partition)をマウントしておく
  • 次のコマンドを実行
ROOTDIR=/mnt/rootfs
mount --rbind /dev  ${ROOT_DIR}/dev
mount --rbind /proc ${ROOT_DIR}/proc
mount --rbind /sys  ${ROOT_DIR}/sys
chroot ${ROOT_DIR} grub-install --target=x86_64-efi
インストール完了後、上記でマウントした/dev、/proc, /sysとrootfs, ESPをumountする

QtアプリをHiDPIに対応させる設定

export QT_AUTO_SCREEN_SCALE_FACTOR=1
export QT_ENABLE_HIGHDPI_SCALING=1
参考: https://wiki.archlinux.org/title/HiDPI

X11サーバを共有する特権dockerコンテナの作成例

docker run -it --network=host --env DISPLAY=$DISPLAY -v ${HOME}/.Xauthority:/root/.Xauthority -v /store:/store -v /tmp/.X11-unix:/tmp/.X11-unix --privileged debian:12 bash

LXCコンテナの中からKVMを使用する設定

ホストOSの/var/lib/lxc/[CONTAINER NAME]/configに以下を追加して再起動。(ホストOSがcgroup v1を使っている場合、cgroup2をcgroupに変更する)
# /dev/kvm
lxc.cgroup2.devices.allow = c 10:232 rwm
lxc.mount.entry = /dev/kvm dev/kvm none bind,optional,create=file

USBストレージから起動するテキストベースLinuxイメージ

標記のひとつにDebian Liveイメージがある。

配布サイト


上記のサイトには各種Linuxディストリビューションのイメージがある。特に好みがなければ、以下のようなstandard版を使う。
  • debian-live-12.5.0-amd64-standard.iso

USBストレージへの書き込み

以下の例では、青色の/dev/sdxがUSBストレージのデバイス。/proc/partitionsやdmsgの出力などから実際に接続しているデバイスを特定してそれに変更する
dd if=debian-live-12.5.0-amd64-standard.iso of=/dev/sdx bs=1M
上記のbs=1Mは、ブロックサイズを1MiBにするオプション。昔、特定の環境でブロックサイズを一定サイズ以上に設定しないと極端に遅いことがあったので習慣として付与している。最近のほとんどのLinux環境では、なくても問題ないと思われる。

おまけ:QEMUの実行例

#!/bin/sh

QEMU=qemu-system-x86_64
IMAGE=debian-live-12.5.0-amd64-standard.iso
MEMORY=2048

${QEMU} \
-cpu host \
-enable-kvm \
-m ${MEMORY} \
-device nec-usb-xhci,id=xhci \
-drive id=DRIVE_ID,format=raw,file=${IMAGE},if=none \
-device usb-storage,bus=xhci.0,drive=DRIVE_ID
上記スクリプトを実行する次のような画面が表示される。
上の画面でLive system (amd64)を選択する(ENTERキーを押す)と、次のようにコンソール画面が表示される。

参考

QEMUでドライブを追加するオプション例

X11でのWindowsのスクリーンショットの撮り方

対象WindowのIDを取得

xwininfoを使用

wxdコマンド実行

下記では青字部分がWindow ID。適宜変更。
wxd -id 0x1000011 | convert xwd:- screenshot.png
上記のパイプの右側は、ImageMagickを使って画像をpngに変換する。

Linuxのコンソールのディスプレイをオフする

kernelのコマンドラインにconsoleblank=[N] (Nはオフまでの秒数)を追加する。

DebianやUbuntuでは、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに以下のようにconsoleblankオプションを追加する。

GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=60"
その後、grub.confを更新して再起動する。
update-grub2
reboot

VIMでWindowの幅を設定する例

:vert resize 80
もちろん、複数のwindowが縦に分割されてないと意味がない

LXCコンテナにログインできない、または、時間がかかる時の対処

ホストOSのログに次のメッセージがある場合、AppArmorによってコンテナ内の動作 (この場合mount) がブロックされている。 このログは、ホストOSがUbuntu 20.04、コンテナがDebian 12のケース。
kernel: audit: type=1400 audit(1705193372.029:49): apparmor="DENIED" operation="mount" info="failed perms check" error=-13 profile="lxc-sakura_</var/lib/lxc>" name="/run/systemd/unit-root/" pid=4456 comm="(d-logind)" srcname="/" flags="rw, rbind"
ホストOSの/var/lib/lxc/[Container名]/configに次の2行を加えて、LXCコンテナを起動
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1

参考

LXCコンテナの中でDockerを使用するための設定

gradleでのテスト関係のオプション例

ビルドのみ(テストしない)

./gradlew build -x test

指定のテストを実行

./gradlew test --tests "SomeTest.*"

gitで特定の行範囲の変更を追跡する

-L開始行,終了行:ファイル名オプションを使えばよい 例
git log -L 4,11:.screenrc

シリアルコンソールで、ターミナルサイズを変更する方法

シリアルコンソールを使うとデフォルトでは、ターミナルサイズが80x25になっていることが多い。
# stty size
25 80
これを実際の仮想端末のサイズにフィットするには以下のコマンドを実行する
# setterm --resize
すると、ターミナルサイズが変更される
# stty size
51 204

Ubuntu上で新しいバージョンのDebianのLXCコンテナを作る方法

例えば、Ubuntu 20.04上でDebian12のLXCコンテナを作成すると、'signed by unknown key'(知らない鍵で署名されている)と表示されエラーとなる。
# lxc-create -t debian -n deb12 -- -r bookworm
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-bookworm-amd64 ...
gpg: key 7638D0442B90D010: 4 signatures not checked due to missing keys
gpg: key 7638D0442B90D010: "Debian Archive Automatic Signing Key (8/jessie) " not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
Downloading debian minimal ...
I: Retrieving InRelease
I: Checking Release signature
E: Release signed by unknown key (key id F8D2585B8783D481)
   The specified keyring /var/cache/lxc/debian/archive-key.gpg may be incorrect or out of date.
   You can find the latest Debian release key at https://ftp-master.debian.org/keys.html
Failed to download the rootfs, aborting.
Failed to download 'debian base'
failed to install debian
lxc-create: deb12: lxccontainer.c: create_run_template: 1627 Failed to create container from template
lxc-create: deb12: tools/lxc_create.c: main: 317 Failed to create container deb12
次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。
wget https://ftp-master.debian.org/keys/archive-key-12.asc -O - --quiet \
| gpg --import --no-default-keyring --keyring=/usr/share/keyrings/debian-archive-keyring.gpg
青字の部分は使用するDebianのバージョンに適宜変更する。鍵の一覧は以下のサイトにある。 https://ftp-master.debian.org/keys.html

Xvfbにxrandrで解像度を追加する

追加したい解像度を引数にして、cvtコマンドを実行する。
$ cvt 1280 800
# 1280x800 59.81 Hz (CVT 1.02MA) hsync: 49.70 kHz; pclk: 83.50 MHz
Modeline "1280x800_60.00"   83.50  1280 1352 1480 1680  800 803 809 831 -hsync +vsync
上記の出力を引数にxrandr --newmode、--admode、-sを実行する。
xrandr --newmode 1280x800 83.50  1280 1352 1480 1680  800 803 809 831 -hsync +vsync
xrandr --addmode screen 1280x800
xrandr -s 1280x800

LXCコンテナの中でDockerを使用するための設定

/var/lib/lxc/[container名]/configに以下の設定を追加し、コンテナを(再)起動する。

なるべく安全な方法

lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1

とにかく権限を与える方法

上記で駄目な場合、以下ならほとんどのケースで起動可能。上記にlxc.cap.drop =を加えて、Dockerを起動できる場合もあり。
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =

Ethernet、UDP、TCPパケットの構造

Ethernetパケット

ヘッダサイズ: 14B (802.1Q VLANタグがある場合18B)、チェックサムサイズ: 4B
サイズ (B)説明
6送信先MAC
6送信元MAC
[4]802.1Qタグ (VLANタグ)
2Ethernet type/size. IPv4:0x0800, IPv6:0x86dd
-ペイロード(IPなど)
4FCS (Frame Check Sequence; CRC)
参考: Wikipedia: イーサーネットフレーム

IPv4

ヘッダサイズ: 20B (拡張情報を除く)
サイズ (B)説明
1バージョン(MSB 4bit)、ヘッダ長(LSB 4bit) 4オクテット単位
1サービス種別
2全長(IPヘッダを含む)
2識別子
2フラグ(MSB 3bit)、フラグメントオフセット(LSB 13bit)
1TTL (Time to Live)
1上位プロトコル. ICMP: 0x01, TCP:0x06, UDP:0x11
2IPヘッダのチェックサム
4送信元アドレス
4送信先アドレス
[2]拡張情報
-データ
参考: Wikipedia: IPv4

UDP

ヘッダサイズ: 8B
サイズ (B)説明
2送信元ポート
2送信先ポート
2データ長
2チェックサム
-ペイロード(IPなど)
参考: Wikipedia: UDP

TCP

ヘッダサイズ: 20B >
サイズ (B)説明
2送信元ポート
2送信先ポート
4シーケンス番号
4確認応答番号
2ヘッダ長(MSB 4bit)[32bit単位]、予約(3bit)、フラグ(9bit)
2Windowサイズ
2チェックサム
2緊急ポインタ
[4-40]オプション
-ペイロード
参考: Wikipedia: TCP