Manabii について

無気力です。

421 Misdirected Request errors ではまる

macOS の Safari で、https://www.manabii.info/ のリンクから、https://ipv6.manabii.info/ へ遷移した時に「421 Misdirected Request errors」が表示されて、散々悩んだのだけれど、解決したメモ。

原因は、サーバ側で Apache において SNI と HTTP/2 とワイルドカード TLS 証明書の条件が重なっていたからのようだ。

具体的には、以下のような構成を取っていた。

  • サーバ側では HTTP/2 と HTTP/1.1 を利用可能としていた。
  • TLS パラメータは下記証明書を除き、全てのバーチャルホストで同じとしていた。
  • https://www.manabii.info/ ではコモンネーム「*.manabii.info」というワイルドカード証明書を利用。
  • https://ipv6.manabii.info/ では、https://6.ipv6.manabii.info/ というホストもあるので、コモンネームが「ipv6.manabii.info」で、SANsに「6.ipv6.manabii.info」が入ったマルチドメイン証明書を利用。

ところが、macOS の Safari (HTTP/2 対応) において、https://www.manabii.info/ を表示した後に https://ipv6.manabii.info/ を表示するパターンで、表題のエラーが発生していた。

つまり、ブラウザで https://www.manabii.info/ を表示した後で、https://ipv6.manabii.info/ を表示するとき、HTTP/2 では www.manabii.info で使用した既に開いている通信を利用するので、*.manabii.info のワイルドカード証明書での TLS 接続状態で ipv6.manabii.info にアクセスしようとするための模様だ。

解決方法としては、以下の通り。

  • https://ipv6.manabii.info/ のバーチャルホストでは、*.manabii.info のワイルドカード証明書を使い、6.ipv6.manabii.info の ServerAlias は削除する。
  • https://6.ipv6.manabii.info/ を別のバーチャルとして設定し、コモンネームが「6.ipv6.manabii.info」の証明書を使用する。

HTTP/2 の SNI では、SSL パラメータは全てのバーチャルホストで同一とする必要があるのは知っていたのだけれど、まさか上記のような罠があるとは。

macOS Catalina で iOS デバイスの同期が出来ない現象の修復

macOS Catalina にアップグレードしてから、Mac と iPhone や iPad などの iOS デバイスとの同期が出来ない現象が発生していて困っていたのだけれど、原因を特定して修正が出来きました。

具体的には USB 接続で iOS デバイスを接続すると、Finder で認識されるものの、表示すると「iPhone を読み込み中」の表示のまま同期されない、同期設定画面も出ないという現象でした。

色々と原因を探って試行錯誤した結果、私の環境ではオーディオブックのファイルに何らかの影響があって、同期プロセスが止まってしまう模様。(macOS のブックアプリが、以前の iTunes ライブラリにあるオーディオブックをインポートできず、起動できないことで気付きました)

修正方法としては、macOS 上で、ミュージックフォルダ内のオーディオブックのファイルである拡張子 .m4b と Audible 形式である拡張子 .aa のファイルを検索し、別の場所に移動してから、ブックアプリを起動して終了とするだけで OK 。

これで、macOS Catalina にアップグレードして 1 ヶ月ちょっとぶりに iOS デバイスの同期が出来るようになりました。嬉しい !!

cdebootstrap で Raspberry Pi 4 用 Debian Buster arm64 環境を作る

  1. あらかじめ microSD を初期化します。
    この例では、/dev/sdd1 は /boot (vfat) 、/dev/sdd2 は / (ext4) で作成したものとなります。

  2. ファイルシステムをマウントして、cdebootstrap で OS をインストールします。
    # apt-get install qemu-arm-static cdebootstrap
    # mount /dev/sdd2 /mnt
    # mkdir /mnt/boot
    # mount /dev/sdd1 /mnt/boot
    # cdebootstrap --arch=arm64 -f standard --foreign buster --include=ntp,lvm2,openssh-server,net-tools -v /mnt
  3. 作成した環境に chroot します。
    # chroot /mnt
  4. root のパスワード設定し一般ユーザを作成します。
    # passwd
    # useradd -d /home/username -s /bin/bash -m username
    # passwd username
  5. /etc/fstab を以下の内容で作成します。
    proc            /proc	proc    defaults		0	0
    /dev/mmcblk0p1	/boot	vfat    defaults		0	2
    /dev/mmcblk0p2	/       ext4    errors=remount-ro	0	1
  6. 以下のファイルを作成します。
    /etc/network/interfaces
    /etc/networks
    /etc/hosts
    /etc/hostname
    /etc/mailname
    /etc/resolve.conf

  7. /etc/apt/sources.list を以下の内容で作成します。
    deb http://deb.debian.org/debian/ buster main contrib non-free
    deb-src http://deb.debian.org/debian/ buster main contrib non-free
    
    deb http://security.debian.org/debian-security buster/updates main contrib non-free
    deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
    
    # buster-updates, previously known as 'volatile'
    deb http://deb.debian.org/debian/ buster-updates main contrib non-free
    deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free
  8. archive.raspberrypi.org の公開鍵を設定します。
    # apt-get update
    # apt-get install gpg wget
    # wget -O - http://archive.raspberrypi.org/debian/raspberrypi.gpg.key | apt-key add -
  9. apt に archive.raspberrypi.org の設定を行います。/etc/apt/sources.list.d/archive.raspberrypi.org.list を以下の内容で作成する。
    deb [ arch=armhf ] http://archive.raspberrypi.org/debian/ buster main
    # Uncomment line below then 'apt-get update' to enable 'apt-get source'
    #deb-src http://archive.raspberrypi.org/debian/ buster main
  10. archive.raspberrypi.org の公開鍵をパッケージで設定します。
    # apt-get update
    # apt-get install raspberrypi-archive-keyring
    # rm /etc/apt/trusted.gpg
  11. /etc/apt/preferences を以下の内容で作成します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  12. raspi-config パッケージをインストールします。
    # apt-get install raspi-config
  13. ロケールやタイムゾーンを設定します。
    # apt-get install locales
    # dpkg-reconfigure locales
    # dpkg-reconfigure tzdata
    # apt-get install fake-hwclock
  14. ブートローダーとカーネルをインストールします。
    # apt-get -d install raspberrypi-bootloader:armhf raspberrypi-kernel:armhf
    # cd /var/cache/apt/archives/
    # dpkg -i --force-architecture raspberrypi-bootloader_1.20200212-1_armhf.deb raspberrypi-kernel_1.20200212-1_armhf.deb
  15. ※もしかすると「dpkg –add-architecture armhf」してあげればそのまま apt-get で入るかもしれない。

  16. initrd を作成します。
    # apt-get install dosfstools e2fsck-static
    # update-initramfs -c -k 4.19.97-v8+
  17. /boot/cmdline.txt を以下の内容で作成します。
    console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet splash plymouth.ignore-serial-consoles
  18. /boot/config.txt を以下の内容で作成します。
    arm_64bit=1
    initramfs initrd.img-4.19.97-v8+ followkernel
  19. microSD カードをアンマウントします。
    # umount /mnt/boot
    # umount /mnt
  20. 出来上がった microSD カードを Raspberry Pi に挿入し起動し、sshd を有効とします。
    # systemctl enable ssh.service

NextCloud で Office ファイルをオンライン編集

NextCloud が凄い。オンプレミスの NextCloud 上で、Office ファイル形式をオンライン編集出来る様にするためには、たった 2 個アプリをインストールするだけでした。

AMD64 アーキテクチャのサーバに限るが、自分が管理している NextCloud 上の管理者で「Community Document Server」と「ONLYOFFICE」の 2 アプリを導入するだけ。

これで、Excel ドキュメントなども、Google ドキュメントのようにオンライン編集が出来てしまう。

特にデフォルトでも日本語は化けなかったが、フォントメニューで日本語フォントを選択させる場合、Debian の場合だったら、

# apt-get install fonts-ipafont-gothic fonts-ipafont-mincho
$ occ documentserver:fonts --add /usr/share/fonts/opentype/ipafont-mincho/ipam.ttf
$ occ documentserver:fonts --add /usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf
$ occ documentserver:fonts --add /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf
$ occ documentserver:fonts --add /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf

としてあげるだけ。こんなに簡単で良いのだろうか・・・。

・追記

そんなに簡単にいくはずは無かった。確かにオンラインで編集は出来るけれど、NextCloud から該当ファイルをダウンロードすると、編集分が反映されていない事がある・・・。

cdebootstrap で Raspberry Pi 用 Debian buster 環境を作る

Raspberry Pi で Debian 10 buster を使うために、amd64 アーキテクチャのマシン上で armhf の環境を構築したメモです。

以前、「Raspberry Pi 2 Model B に Debian Jessie / armhf をインストールする」を参考に Debian 8 を構築したときとだいぶん変わっていました。

PC 上でのこれから Raspberry Pi 用に Debian 10 をインストールする領域は以下のようになります。

/dev/sdb1 (MicroSD カード) -> /boot
/dev/sdc1 (USB-HDD) -> /
/dev/vg01/home (USB-HDD /dev/sdc2 内 LVM) -> /home
/dev/vg01/var (USB-HDD /dev/sdc2 内 LVM) -> /var
/dev/vg01/swap (USB-HDD /dev/sdc2 内 LVM) -> /swap
  1. fdisk 等で、MicroSD カードと USB-HDD にパーティションを切ります。
  2. LVM 上にボリュームを作成して初期化します。
    # pvcreate /dev/sdc2
    # vgcreate vg01 /dev/sdc2
    # lvcreate --name home --size 512GB vg01
    # lvcreate --name var --size 256GB vg01
    # lvcreate --name swap --size 2GB vg01
    # mkswap /dev/vg01/swap
    # mkfs.vfat /dev/sdb1
    # mkfs.ext4 /dev/sdc1
    # mkfs.ext4 /dev/vg01/home
    # mkfs.ext4 /dev/vg01/var
    # mkswap /dev/vg01/swap
  3. ファイルシステムをマウントします。
    # mount /dev/sdc1 /mnt/rootfs
    # mkdir /mnt/rootfs/boot
    # mkdir /mnt/rootfs/home
    # mkdir /mnt/rootfs/var
    # mount /dev/vg01/home /mnt/rootfs/home
    # mount /dev/vg01/var /mnt/rootfs/var
    # mount /dev/sdb1 /mnt/rootfs/boot
  4. cdebootstrap で環境を構築します。
    # cdebootstrap --arch=armhf -f standard --foreign buster --include=ntp,lvm2,openssh-server,net-tools -v /mnt/rootfs
  5. rpi-update コマンドをインストールします。
    # wget http://goo.gl/1BOfJ -O /mnt/rootfs/usr/bin/rpi-update && chmod 755 /mnt/rootfs/usr/bin/rpi-update
  6. Raspberry Pi 用の Linux カーネルとファームウェアをインストールします。
    # mkdir /mnt/rootfs/lib/modules
    # ROOT_PATH=/mnt/rootfs BOOT_PATH=/mnt/rootfs/boot /mnt/rootfs/usr/bin/rpi-update
  7. /boot/cmdline.txt を作成します。
    # echo 'dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait' > /mnt/rootfs/boot/cmdline.txt
  8. /mnt/rootfs/etc/fstab を作成します。
    proc		/proc	proc	defaults		0	0
    /dev/mmcblk0p1	/boot	vfat	defaults		0	2
    /dev/sda1	/	ext4	errors=remount-ro	0	1
    /dev/vg01/home	/home	ext4	defaults		0	2
    /dev/vg01/var	/var	ext4	defaults		0	2
    /dev/vg01/swap	none	swap	sw			0	0
  9. /mnt/rootfs/etc/network/interfaces を適当に編集します。
    source-directory /etc/network/interfaces.d
    
    auto lo
    iface lo inet loopback
    
    auto enxXXXXXXXXXXXX
    iface enxXXXXXXXXXXXX inet static
    	address xxx.xxx.xxx.xxx/24
    	gateway xxx.xxx.xxx.xxx
    	dns-nameservers xxx.xxx.xxx.xxx
  10. chroot して root のパスワードを設定します。
    # chroot /mnt/rootfs
    # passwd root
    # exit
  11. アンマウントします。
    # umount /mnt/rootfs/boot 
    # umount /mnt/rootfs/home 
    # umount /mnt/rootfs/var
    # umount /mnt/rootfs

出来上がった、Raspberry Pi に出来上がった MicroSD カードを挿し、USB-HDD を接続して起動します。
起動したら、以下を設定していきます。

  1. /etc/apt/sources.list を編集します。
    deb http://deb.debian.org/debian/ buster main contrib non-free
    deb-src http://deb.debian.org/debian/ buster main contrib non-free
    
    deb http://security.debian.org/debian-security buster/updates main contrib non-free
    deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
    
    # buster-updates, previously known as 'volatile'
    deb http://deb.debian.org/debian/ buster-updates main contrib non-free
    deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free
  2. /etc/apt/sources.list.d/raspi.list を作成します。
    deb http://archive.raspberrypi.org/debian/ buster main
    deb-src http://archive.raspberrypi.org/debian/ buster main
  3. archive.rasberrypi.org 用の gpg.key をインポートします。
    # wget http://archive.raspberrypi.org/debian/raspberrypi.gpg.key -O - | apt-key add -
    # apt-get update
    # apt-get install raspberrypi-archive-keyring 
    # rm /etc/apt/trusted.gpg
  4. /etc/apt/preferences ファイルを作成します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  5. raspi-config コマンドをインストールします。
    # apt-get update
    # apt-get install raspi-config
  6. ロケールとタイムゾーンを設定し、fake-hwclock をインストールします。
    # apt-get install locales
    # dpkg-reconfigure locales
    # dpkg-reconfigure tzdata
    # apt-get install fake-hwclock
  7. あとは、hostname を設定したり、mailname を設定したり、hosts を設定したりいつもの作業です。

食わず嫌いしていた LVM (やってみたら凄い簡単だった) と、amd64 上であったとしても qemu-arm-static があれば cdebootstrap で armhf の環境に chroot 出来ると言うことが一番の収穫だったと思います。

Raspberry Pi 4: eeprom アップデータと wifi ファームウェアをインストールする

Raspberry Pi 4 で以前利用していた Raspberry Pi 2 の環境をそのまま使う」の続きです。

上記の設定では、内蔵 wi-fi が OS から認識されず、また eeprom のアップデータもインストールされない状態でしたので、それを修正します。

  1. /etc/apt/sources.list.d/raspi.list を以下の内容で作成します。
    deb http://archive.raspberrypi.org/debian/ buster main
    deb-src http://archive.raspberrypi.org/debian/ buster main
  2. Raspberry Pi 固有のリポリトジを追加して、eeprom アップデータ、Raspberry Pi 設定ツール、Wi-Fi のファームウェアをインストールします。
    # wget http://raspbian.raspberrypi.org/raspbian.public.key -O - | sudo apt-key add -
    # apt-get update
    # apt-get install rpi-eeprom raspi-config firmware-brcm80211
  3. /etc/apt/preferences を以下の内容に編集します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  4. 再起動します。

上記を実行すると、Linux カーネルは Raspberry Pi のリポリトジから提供されるものに置換されました。
また、Wi-Fi インタフェースについては、再起動後に ifconfig -a とすると wlan0 が見えるようになりました。

Raspberry Pi 4 で以前利用していた Raspberry Pi 2 の環境をそのまま使う

Raspberry Pi 2 Model B で、MicroSD カードのみ /boot パーティションとして設定、他パーティションは USB-HDD で運用していた環境を、ほぼそのまま、ちょこっと修正して Raspberry Pi 4 Model B で運用した際の備忘録です。
なお、OS は Debian GNU/Linux 10 buster です。

事前に最新の Raspbian を MicroSD にインストールし、一度 Raspberry Pi 4 Model B で起動して初期設定を完了しておきます。

以下、Raspberry Pi 2 Model B 上での作業です。

  1. /boot パーティションのファイルを、別マシンなどにバックアップしておきます。(最悪これさえあれば Raspberry Pi 2 Model B で起動することが出来るので)
  2. Kernel building – Raspberry Pi Documentation」の手順に従って、Raspberry Pi 4 Model B 用のカーネルをビルドし、インストールを実行します。
  3. Raspberry Pi 2 Model B をシャットダウンします。

以下、任意の作業マシン上で行います。

  1. Raspberry Pi 2 Model B で利用していた MicroSD カードの /boot/cmdline.txt を編集します。
    最新の Raspbian の Raspberry Pi 4 Model B 用の /boot/cmdline.txt を参考に以下のように設定しました。

    console=serial0,115200 console=tty1 root=PARTUUID=xxxxxxxx-xx rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles apparmor=1 security=apparmor

    ※カーネル再構築して、AppArmor を有効にしているのでその設定も行っています。
    なお、PARTUUID は、Raspberry Pi 2 Model B の電源を落とす前に blkid で調べることが出来ます。(今回は USB-HDD の /dev/sda1 に相当する PARTUUID を指定しました)

  2. 初期設定の完了した、最新の Raspbian の MicroSD カードから /boot の以下の全てのファイル・ディレクトリについて、cmdline.txt と kernel7l.img 以外を Raspberry Pi 2 Model B で利用していた MicroSD カードの /boot にコピーします。

あとは、Raspberry Pi 4 Model B に MicroSD カードを挿入、USB-HDD も接続して電源をオンすると、Raspberry Pi 4 Model B で今までの環境で起動が出来ました。

この方法、「Raspbian って、/boot にあるカーネル以外は共通のコードなので、/boot パーティションの内容を入れ替えて、カーネルバージョンとカーネルモジュールの整合性さえとれば起動できるのでは」と思いついたのですが、予想どおり上手くいきました。

余談ですが、使っている USB3.0 の HDD ケースと Raspberry Pi 4 との相性が悪いのか、上手く起動しないときがあります。そのような場合は、全ての電源を切って、USB-HDD だけを USB 接続して電源を入れると、上手く起動してくれるようです。
USB デバイスを抜き差したり、指すポートを変えてみたりすると起動するようです。

追記
Linux Kernel 4.19.97 を Raspberry Pi 2 Model B と、4 Model B でビルドしてみたところ、

Pi 2 Model B: 205m19.397s
Pi 4 Model B: 90m37.475s

と、圧倒的に Pi 4 Model B は早いです。

Raspberry Pi 4: eeprom アップデータと wifi ファームウェアをインストールする」に続きます。

「スター・トレック:ピカード」が配信に

スター・トレック:ピカードが配信開始になりました。

私がスター・トレックに初めて触れたのが、ピカード船長の The Next Generation なのですが、それゆえに私の中でスタートレックと言えば TNG が真っ先に思い出されるのですね。

そんな TNG から続くシリーズである「スター・トレック:ピカード」、冒頭 Blue Skies が流れたのは、おおっと思いましたよ。この物語は「ネメシス・STX」からなんやかんやあった後のお話なのだと。

データは「ネメシス・STX」で亡くなってしまったけれど、今作ではデータの一部から双子の娘的存在が作られたようで、片方のダージがピカードに助けを求めるもロミュラン人の何者かに殺されてしまうし、もう片方のソージはなぜかボーグ・キューブでロミュランに協力をしているような描写がありました。

ここで思いつくのは、データとローアの関係だ。もしかしたら、タージとソージも同じような関係だったりするのかも・・・、と今の所は何も分からないので続きが気になって仕方がありません。

今回特に嬉しいのは、吹き替え版 (もちろん今までどおりのキャストで) も同時に配信であることです。普通、吹き替え版って相当遅れての公開になることが多いじゃないですか。それが、今回はいつものなじみの声で楽しめることが本当に嬉しいです。

macOS:「ERROR_7E7AEE96CA」でセキュリティアップデート等が出来ない

macOS を Catalina から Mojave に戻した環境で、Mojave 向けの macOS 追加アップデートを実行すると「ERROR_7E7AEE96CA」で失敗する現象が発生しました。

ネットを調べてみると、新 OS 上で旧 OS で使用していた Time Machine ボリュームに一度でもバックアップを行った状態で、復旧パーティションから起動し Time Machine からの復元で旧 OS 環境に戻したときに発生する模様です。

どうも、macOS の Time Machine は、復旧パーティションの情報もバックアップしている模様で、今回の場合だと、Mojave から利用していた Time Machine ボリュームを引き続き Catalina でも利用していた場合、Catalina の復旧パーティション情報もバックアップされてしまうようです。

こうなってしまうと例え USB メディアで Mojave のインストーラを起動して、内蔵 HDD を全初期化した上で、Mojave だった頃のシステムを指定して Time Machine から復元したとしても、復旧パーティションは Catalina ベース、起動 OS は Mojave という状態で復元されてしまいます。

※ちなみに、一度 Mojave をクリーンインストールした上で、復旧パーティション (Mojave ベース) から起動し、同様に復元を行うと、やはり復旧パーティションは Catalina ベース、起動 OS は Mojave になってしまいました。

と言うわけで、解決策としては、復旧パーティションのベース OS と、実行 OS を合わせる必要がありそうと言うことで、私の環境での本現象の解決方法は以下の通りです。

  1. 一旦 Time Machine にバックアップをします
    一旦、復旧パーティションは Catalina 、起動 OS は Mojave の環境で、新規に Time Machine にバックアップをとります。

  2. macOS Mojave を入手します
    App Store から macOS Mojave を入手します。
    このとき、Option キーを押しながら「入手」ボタンをクリックすることで、システム環境設定の「ソフトウェア・アップデート」が起動しますが、/Applications フォルダ内に「macOS Mojaveインストール.app」が作成されます。インストーラが起動したら終了します。

  3. USB インストールメディアを作成します
    macOS の起動可能なインストーラを作成する方法」の手順に従って、USB インストールメディアを作成します。

  4. インストール USB から起動してインストールと情報の転送を行います
    インストールメディアから起動して、ディスクユーティリティより内蔵 HDD を全初期化します。その後、通常どおり Mojave をインストールします。
    インストール後に、情報を転送するかどうか聞いてくるので、Time Machine から全てのデータを転送するようにして、データを移行します。

これで、何とか復旧パーティションは Mojave ベース、かつ起動 OS も Mojave という環境が戻り、もちろん、セキュリティアップデートも正常にあてることが出来ました。

自ドメインの DNSSEC 対応を終了

昨年の春前具合から自ドメインを DNSSEC 対応にしてきたのだけれど、もうやめます。

理由は、管理が手間過ぎるから。ZSK の運用も含めてスクリプトで自動化していたので、ずっと運用する分には問題はないのだけれど、いざ手動で何かを行う際にゾーン署名に用いている ZSK がどれなのか、自動化ゆえに余計にわけが分からなくなって管理がめんどい。

どうせ、DNSSEC の検証をしているフルリゾルバもあまりないような気もするし、それならやめちゃおう。

続きを読む