スキップしてメイン コンテンツに移動

投稿

6月, 2025の投稿を表示しています

kvm の virbr で public な IPv6 アドレスを使う

今回も表題の通りなのですが、下述する ndppd を使わない場合、前提条件があります。それは、ルータが kvmホスト下の IPv6 ネットワークへのルートを保持できることです。具体的には、IPv6 でスタティックルートを設定できること、 もしくは ルータが ripng などを喋り、kvm ホストが virbr0 下のネットワークを広報するなどです。また、ndpproxy (ndppd) を使う方法もあります。ndppdを使う場合は下述のように ndppd の設定だけで外部と接続できますので、IPv6 Router上での lan側インターフェースのアドレスを固定にしてスタティックルートを設定する必要もなく、また、kvm host の lan側アドレスを固定にする必要もなくなり設定としては一番簡単ですが、今回は動作について最も解りやすいスタティックルートの例で説明したいと思います。 まずはじめに、ネットワークの構成についてです。パブリックな IPv6 が使用できる環境ではルータ以下の端末に一般的には /64のアドレスが割り当てられているとおもいますが、/64のサブネットを別に用意することは通常はできませんので、/64 以上の小さなサブネットを用意します。今回は /80 を例にしてみました。図にすると以下のようになります。 IPv6-Internet | | IPv6 Router( lan eno2: 2001:db8:1:a::1/64 ) | | IPv6 kvm host(lan eno1: 2001:db8:1:a::117/64) | | virbr0 (2001:db8:1:a:117::1/80) | | kvm guest (2001:db8:1:a:117::xxxx/80 by dhcp6) この図だと IPv6 Router 上に virbr0 の 80 のサブネット (2001:db8:1:a:117::/80) へのルートを kvm host のアドレス (2001:db8:1:a::117/64) にする必要があります 。(厳密にはサブネットを予約するには、IPv6 Router が radvd で端末にアドレスを取得させるのではなく、dhcp6 でアドレスを配布させる必要がありますが、小規模な環境...

bash のヒアドキュメントで $ を展開させない方法

シェルスクリプトのパッチを作成する場合、diff では何もしなくても$は展開されないので問題はないのですが、diffで作成されたパッチ文をヒアドキュメントでファイルに落とす場合、$が展開されるので、エスケープ処理しない限り、一々コピペするしかないと思い込んでいました。 ですが、ふと"ヒアドキュメント $ そのままで"と検索したところ、cat > test.patch <<'EOF'と EOF をシングルクォート(')で括れば良いとのことでした。 早速試した所、$が確かに展開されず、パッチフィルとして機能しました。 cat > scs_cert_generator.sh.patch <<'EOF' --- scs_cert_generator.sh.orig 2024-07-10 22:03:58.000000000 +0900 +++ scs_cert_generator.sh 2025-05-23 16:26:34.516324152 +0900 @@ -628,8 +628,8 @@ print_msg "Create self-signed Remote Connector certificate." - _GENERATED_CERTIFICATE=$(openssl x509 -req -in <(echo "$_GENERATED_CSR") -sha256 -extfile "$SCS_OPENSSL_CONFIG_FILE" \ - -extensions v3_ca -signkey <(echo "$_PRIVATE_KEY") -out >(cat) -days ${SCS_OPENSSL_DAYS} 2>/dev/null) + _GENERATED_CERTIFICATE=$(openssl x509 -req -sha256 -days ${SCS_OPENSSL_DAYS} -in <(echo "$_GENERATED_CSR") \ + -sign...

既存の disk image をつかって kvm ゲストを virt-insall --import で復旧する

何らかの理由で kvm ゲストが立ち上がらない場合やマイグレーション機能をつかわずに kvm ゲストを移動させたいこともあると思います。 今回、Debian 12を Debian 13 にアップグレードしたところ、kvm ゲストが立ち上がらない状況に遭遇したのですが、一旦 destroy して disk image をバックアップし、guest を undefine --nvram として未定義の状態にしてから virsh-install --import で xml を再生成したところ、復旧できたのでメモ代わりに挙げておくことにしました。 具体的なコマンドは以下の通りです。 virt-install \ --virt-type kvm \ --name kvm92a \ --vcpus=8 \ --memory 4096 \ --disk /srv/images/kvm92a.img \ --import \ --graphics none \ --network=bridge:virbr0 \ --arch=x86_64 --os-variant=almalinux9 \ --boot loader=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS_4M.ms.fd \ --tpm emulator,model=tpm-crb,version=2.0 \ --console pty,target_type=serial 前述の様に --import を指定することで 新規インストールではなく、xml の再生成になるようです。なお、今回はセキュアブート かつ software tpm のゲストを復旧した所為だと思いますが、最初は mok のブルー画面がでましたので、reset したところ、後は通常通り起動できました。 ちなみに、Debian 13の場合は、 --boot loader=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share...

Debian の grub 経由で物理メディアを別途用意せずに Almalinux 10 をインストール

基本的には bootp で diskless インストールするのとあまり変わらないのですが、bootp でファイルを取得するかわりに、ローカルにコピーしたインストール用の vmlinuz と initrd.gzを Debian 側の grub.cfg に記載することで Debianから Almalinuxをインストールできたので備忘録として挙げておくことにしました。 まず、最初に bootp用の vmlinuz と initrd.img を取得し、/boot/以下にそれぞれ vmlinuz-install initrd.img-install として保存します。 wget https://ftp.riken.jp/Linux/almalinux/10/BaseOS/x86_64_v2/os/images/pxeboot/vmlinuz -O /boot/vmlinuz-install wget https://ftp.riken.jp/Linux/almalinux/10/BaseOS/x86_64_v2/os/images/pxeboot/initrd.img -O /boot/initrd.img-install 次に /boot/grub/grub.cfg を変更します。 ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry 'Almalinux 10 install' { linux /boot/vmlinuz-install console=tty0 console=ttyS0,115200n1 inst.repo=https://ftp.riken.jp/Linux/almalinux/10/BaseOS/x86_64_v2/os initrd /boot/initrd.img-install } ### ...

OpenSSLで代替名入りの自己証明書をコマンド一発で作成する

自己証明書を作成するスクリプトは探せばみつかるとはおもいますが、代替名入りの自己証明書をコマンド一発で作成する記事は見かけなかったので、備忘録として挙げておくことにしました。 以下のスクリプトを 例えば sv113-gen-cert.shとして保存し、実行するだけでOKです。 #!/bin/bash openssl req -x509 -days 3650 -nodes -newkey rsa:4096 -keyout server.key -out server.crt -extensions v3_req -config - 今回は決め打ちにしていますが、例えば commonNameやDNS.1などを変数にしたい場合は、コマンド一発ではありませんが、以下のようにすると良いと思います。 # 変数を環境変数として設定 DNS1=sv113.location00.xronos-msys.com IP1=172.16.113.113 # 環境変数を含むヒアドキュメントを標準入力で与える openssl req -x509 -days 3650 -nodes -newkey rsa:4096 -keyout server.key -out server.crt -extensions v3_req -config - なお、"-extenions v3_req" の記述がないと代替名が入りませんので注意してください。 今回は以上です。それでは。

mokutil, dkms, sign-file コマンド で 3rd party kernel module にサイン

セキュアブートすると当然ながらサインのないカーネルモジュールは読み込まれません。単純にはサインすればいいのですが、dkmsパッケージをつくるまでもないので直接サインできないものかと思い、mokutil と dkms、それと linux-kbuild に含まれる sign-file コマンドを使うと意外とあっさりモジュールにサインできたので、備忘録として挙げておくことにしました。 以下手順です。 sudo su KVER=$(uname -r | cut -d'-' -f1) apt-get install mokutil dkms linux-kbuild-${KVER} dkms generate_mok mokutil --import /var/lib/dkms/mok.pub input password: input password again: # 再起動 reboot enters MOK manager EFI utility: 1. press any key 2. enroll MOK, 3. continue 4. enroll the key(s)?: yes 5. enter password 6. reboot (再起動) mokutil --list-enrolled --snip X509v3 Subject Key Identifier: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:C3:96:14:01 --snip # verify your key is loaded sudo dmesg | grep cert | grep c3961401 [ 1.088300] integrity: Loaded X.509 cert 'DKMS module signing key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc3961401' # モジュールにサイン cd /lib/modules/${KEVER}-amd64/3rdPartyMods /usr/lib/linux-kbuild-${KEVER}/scripts/sign...

セキュアブート可能な Debian usb removable drive を作成する

USB ドライブにセキュアブート可能なインストールをすることは、通常のローカルドライブにインストールするのと同じ手順で行けるのですが、すくなくとも Debian 12 の場合だと、efiboot のエントリーがインストールしたマシンの NVRAM に登録されますが、リムーバブルのターゲットドライブを他のマシンで使おうとすると、セキュアブートバイオレーションエラーがでて起動できませんし、NVRAM に自動的にエントリが入っていしまいます。 しかし、インストーラの USB ドライブは当然ながらセキュアブートが有効になっているマシンならどれでも起動できる上、NVRAM にはエントリが残らないので、多分行けるだろうと思い、インストーラの EFI ディレクトリをターゲットにコピーし、debian/grub.cfg だけ USB ターゲットドライブのものに差し替えた所、うまく行ったので備忘録として挙げておくことにしました。 以下シリアル/テキストモードでの手順です。 ############ 1. 通常通りターゲットドライブにインストール (ここは、グラフィックインストールでもOK) ############ 2. インストーラをレスキューモードで再起動し、ターゲットの USB Drive に chroot して作業を行う cd /boot/efi/EFI mv debian /root/xx-debian mv BOOT /root/xx-BOOT cd /boot/efi/EFI mkdir debian cp -a /root/xx-debian/grub.cfg debian/ ## インストーラのシェルを切替: # シリアルの場合: press ctrl + a then press 2 # テキストの場合: press ctrl + alt + F2 mkdir -p /target/boot/efi/EFI/BOOT cp -a /cdrom/EFI/boot/bootx64.efi /target/boot/efi/EFI/BOOT/ cp -a /cdrom/EFI/boot/grubx64.efi /target/boot/efi/EFI/BOOT/ ############ 3. efi ブートエントリーを efibootmgrを使って...

GRUB2で gfxterm と serialの両方で色付きの日本語(UTF-8)表示を同時に行う

表題の通りですが、grubのマニュアルをみていると、serial コンソールは色付きで utf-8 が使えるようだったのでトライしてみたところ、同時に gfxterm と serialの両方で Debian にて 日本語(UTF-8)表示ができました。 前提として LANG=ja_JP.UTF-8 となっている環境が必要ですが、通常のインストールの場合、日本語を選択すると大抵は LANG=ja_JP.UTF-8 になっていると思いますのでこの設定方法は割愛します。 まず、はじめに /etc/default/grub の設定です。 GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Debian} ) 2>/dev/null || echo Debian` GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n1" GRUB_TERMINAL="serial gfxterm" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1" つづいて /etc/grub.d/00_header を編集します。 sudo su apt-get install patch cd ~ cp -a /etc/grub.d/00_header 00_header.orig cp -a /etc/grub.d/00_header 00_header #以下の内容でパッチ(grub.d-00_header-ja.patch)を作成 #----------------------------------------------------------------- --- 00_header.orig 2025-03-15 22:55:29.000000000 +0900 +++ 00_header 2025-06-02 02:51:00.000000000 +0900 @@ -274,6 +274,18 @@ ;; esac +ca...