ConoHa VPS でルートパーティションを拡張したメモ

注意:
このエントリには、VPS のパーティションを編集したりファイルシステムを操作する内容が含まれています。これらの結果、最悪データを失うこともあるかもしれません。実際に実行された結果についての責任は負いかねます。

ConoHa VPS というサービスがありますが、2020 年 1 月にプランがリニューアルされています。

例えば、CPU 2 コア / メモリ 1GB では、

  • 旧プランは SSD 50GB で 990円 (税込) / 月
  • 新プランは SSD 100GB で 968円 (税込) / 月

と、SSD 容量が倍になっているにもかかわらず、若干月額が安くなるという、嬉しいことになっています。

しかし、旧プランを利用している ConoHa ユーザがこのプランの恩恵を受けるためには、「新しい VPS を起動しそちらに移行する必要がある」という、結構面倒くさい事になっています。

まぁ、IP アドレスが変わることは仕方ないとして、なんとかディスクイメージだけでもそのまま移行して、容量の拡張も出来ないだろうかと試してみました。

なお、対象のサーバは以下のような構成です。

  • OS: Debian 11 (AMD64)
  • ディスク構成: /dev/vda1 -> ルートパーティション、/dev/vda5 -> Swap パーティション
    # fdisk -l
    Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x9273b094
    
    Device     Boot     Start       End   Sectors  Size Id Type
    /dev/vda1  *         2048 102762495 102760448   49G 83 Linux
    /dev/vda2       102764542 104855551   2091010 1021M  5 Extended
    /dev/vda5       102764544 104855551   2091008 1021M 82 Linux swap / Solaris
  1. あらかじめディスク拡張用のユーティリティをインストールしておきます。
    # apt-get install cloud-guest-utils gdisk fdisk

  2. 移行するサーバを停止して、ConoHa のコントロールパネルよりスナップショットをとります。
    スナップショットの取得にはそこそこ時間がかかります。

  3. スナップショットがとれたら、ConoHa のコントロールパネルのサーバ追加よりサーバを追加します。
    「イメージタイプ」で「保存イメージ」をクリックし、復元に使用する保存イメージを選択し、root パスワードを入力 (ただここで root のパスワードを入力しても特に起動したサーバで反映されたりしなかったですが) して、サーバ追加で OK です。
    すると、やはりそこそこ時間がかかった後、スナップショットを元にしてサーバが起動します。

  4. 新しく起動したサーバのコンソールに入り、root 権限で以下を実行していきます。

    1. /dev/vda5 に swap パーティションがあるので削除します。
      # swapoff /dev/vda5
      # fdisk /dev/vda

      # swapoff /dev/vda5
      # fdisk /dev/vda
      
      Welcome to fdisk (util-linux 2.36.1).
      Changes will remain in memory only, until you decide to write them.
      Be careful before using the write command.
      
      
      Command (m for help): p
      Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0x9273b094
      
      Device     Boot     Start       End   Sectors  Size Id Type
      /dev/vda1  *         2048 102762495 102760448   49G 83 Linux
      /dev/vda2       102764542 104855551   2091010 1021M  5 Extended
      /dev/vda5       102764544 104855551   2091008 1021M 82 Linux swap / Solaris
      
      Command (m for help): d
      Partition number (1,2,5, default 5): 5
      
      Partition 5 has been deleted.
      
      Command (m for help): p
      Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0x9273b094
      
      Device     Boot     Start       End   Sectors  Size Id Type
      /dev/vda1  *         2048 102762495 102760448   49G 83 Linux
      /dev/vda2       102764542 104855551   2091010 1021M  5 Extended
      
      Command (m for help): d
      Partition number (1,2, default 2): 2
      
      Partition 2 has been deleted.
      
      Command (m for help): p
      Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0x9273b094
      
      Device     Boot Start       End   Sectors Size Id Type
      /dev/vda1  *     2048 102762495 102760448  49G 83 Linux
      
      Command (m for help): w
      The partition table has been altered.
      Calling ioctl() to re-read partition table.
      Syncing disks.
    2. /etc/fstab から Swap パーティションの指定を削除します。

    3. grub2 を再インストールします。
      # grub-install /dev/vda
      # update-grub

      # grub-install /dev/vda
      Installing for i386-pc platform.
      Installation finished. No error reported.
      # update-grub
      Generating grub configuration file ...
      Found linux image: /boot/vmlinuz-5.10.0-6-amd64
      Found initrd image: /boot/initrd.img-5.10.0-6-amd64
      Found linux image: /boot/vmlinuz-5.10.0-5-amd64
      Found initrd image: /boot/initrd.img-5.10.0-5-amd64
      done

      ※このプロセスは不要かもしれません。

    4. 一旦再起動し、起動後 /dev/vda1 のパーティションを拡張します。
      # growpart /dev/vda 1

      # growpart /dev/vda 1
      CHANGED: partition=1 start=2048 old: size=102760448 end=102762496 new: size=209713119 end=209715167
      # fdisk -l
      Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0x9273b094
      
      Device     Boot Start       End   Sectors  Size Id Type
      /dev/vda1  *     2048 209715166 209713119  100G 83 Linux

      パーティションのサイズが 100GB に拡張された。

    5. 再度再起動し、起動後 /dev/vda1 のファイルシステムを拡張します。
      # resize2fs /dev/vda1

      # resize2fs /dev/vda1
      resize2fs 1.46.2 (28-Feb-2021)
      Filesystem at /dev/vda1 is mounted on /; on-line resizing required
      old_desc_blocks = 7, new_desc_blocks = 13
      The filesystem on /dev/vda1 is now 26214139 (4k) blocks long.
      
      # df -h
      Filesystem      Size  Used Avail Use% Mounted on
      udev            470M     0  470M   0% /dev
      tmpfs            98M  504K   98M   1% /run
      /dev/vda1        99G  6.6G   88G   7% /
      tmpfs           489M     0  489M   0% /dev/shm
      tmpfs           5.0M     0  5.0M   0% /run/lock
      tmpfs            98M     0   98M   0% /run/user/1000

      ファイルシステムもほぼ 100GB に拡張された。

以上でディスクの拡張は完了します。あとは、IP アドレスを変更したり、ネームサーバ側のゾーンファイルを修正したりします。

■参考

boinc クライアントが駆動していなかった

Rosetta@home に参加しているのだけれど、なんだかマシンの負荷がほとんど無いなと思ったら、以下のようなメッセージが syslog に出ていた。

You are attached to this project twice. Please remove projects named Rosetta@home, then add https://boinc.bakerlab.org/rosetta/

今年の 3 月下旬頃からクライアント側の負荷が低い状態なので、もしかしたら 1 ヶ月ぐらい Rosetta@home の計算はしていなかったっぽい。

# systemctl stop boinc-client.service
# systemctl start boinc-client.service
# boinccmd --project https://boinc.bakerlab.org/rosetta/ detach
# boinccmd --project_attach https://boinc.bakerlab.org/rosetta/ [Account Key]

上記のようにしたら計算を再開しだした。すっかり、プロジェクトからのデタッチやアタッチの方法を忘れていた。

・追記

Rosetta needs 3814.70 MB RAM but only 3415.80 MB is available for use.

上記のようにログに出ていたので、Raspberry Pi 4 4GB ではもはや無理だな。

本サーバの OS を Debian 11 にアップグレード

去年の 11 月ぐらいにも別のサーバでテスト的に Debian 10 から Debian 11 にアップグレードしているけれど、Hard Freeze しているみたいなので、このサイトがホストされているサーバも Debian 10 から Debian 11 にアップグレードしました。

続きを読む

mrtg で「WARNING: Can not determine ifNumber」

mrtg が「WARNING: Can not determine ifNumber」と言うようになった。

この場合、/var/lig/mrtg/_etc_mrtg.cfg ファイルを削除してから mrtg を実行すれば良い。

ところで、/var/lig/mrtg/_etc_mrtg.cfg のファイル、パーミッションが 644 とかで作られるので、chown root:root と chmod 600 しておきましょう。さらに /var/lib/mrtg を root:root 700 とかにしておくと安心。

カーネルのケイパビリティ

自宅にある Linux マシンのうち一台で一般ユーザにおいて ping を実行すると「ping: socket: Operation not permitted」と表示され、ping が送信できない現象に気がついた。(root ユーザならちゃんと実行できる)

最初は setuid の問題かと思っていたのだけれど、一般ユーザで実行できる方のマシンの ping コマンドは

$ ls -la /bin/ping
-rwxr-xr-x 1 root root 65088 Jan 14  2020 /bin/ping

で、特に setuid されていないにもかかわらず ping が実行できる。

調べてみたところ、ケイパビリティという仕組みで制御されているらしく、先の一般ユーザで実行できるマシンの ping コマンドは

$ /sbin/getcap /bin/ping
/bin/ping = cap_net_raw+ep

となっていたが、実行できない方は設定が無かった。

と言うことで、実行できない方のマシンで、

# setcap cap_net_raw+ep /bin/ping

としたところ、一般ユーザでも実行できるようになった。

何で片方のマシンはケイパビリティが失われていたかと言うことなのだけれども、これはこのマシンで以前 root ファイルシステムを rsync でコピーしたことがあって、その時に -X オプションを設定しなかったので拡張属性が失われたためのようだ。(ケイパビリティは拡張属性で実装されている)

一つ賢くなったけれども、これは気がつかないわ・・・。安易に setuid しない方向なのだなぁ。

Debian 10 から 11 (Testing) へのアップグレード

現段階 (2020/11/07 現在) では、Testing の Debian 11 に Debian 10 からアップグレードしてみたテスト。

/etc/apt/sources.list を書き換え、apt-get update && apt-get upgrade を実行した。いくつか設定ファイルに変更が入るので、とりあえず今まで利用していた設定ファイルを残してアップグレードを続ける。

終わったら、変更が発生したファイルのデフォルトの設定ファイルと利用中の設定ファイルの差分を取って、適切に変更して再起動する。

起動したら、apt-get update && apt-get dist-upgrade をするのだが、libnss-nis の部分でなんかエラーが出ているようなので、エラーメッセージで検索し、まずは apt-get -o APT::Immediate-Configure=false install libnss-nis:amd64 の様にして libnss-nis と依存パッケージだけアップグレードした。

そのあと apt-get dist-upgrade して、やはりくつか設定ファイルに変更が入るので、こちらも今まで利用していた設定ファイルを残してアップグレードを続ける。

終わったら、変更が発生したファイルのデフォルトの設定ファイルと利用中の設定ファイルの差分を取って、適切に変更して再起動する。(php-fpm 構成だったのだが、なぜか Apache モジュール版 php が入ったりするので適当に設定変更をする。)

php は 7.4 になった。Debian 10 の php は 7.3 だったが、最近は WordPress とかで php 7.3 すら古いとか言われる始末でこれは嬉しい。まぁ、すぐに 7.4 でも古いとか言われてしまうのかもしれないけれど。

思いのほかスムーズに進んで、おおよそ 2 時間程度で作業が完了した。

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

AMD64 アーキテクチャ上のマシンで、Raspberry Pi 4 用の ARM64 な Debian Buster の環境を構築したメモです。

2020/09/13 補足: 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 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 install raspberrypi-bootloader raspberrypi-kernel
  15. initrd を作成します。
    # apt-get install dosfstools e2fsck-static
    # update-initramfs -c -k 5.4.51-v8+

    ※「5.4.51-v8+」の部分は、/lib/modules 以下の文字列に会わせる。

  16. /boot/cmdline.txt を以下の内容で作成します。
    console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet splash plymouth.ignore-serial-consoles
  17. /boot/config.txt を以下の内容で作成します。
    arm_64bit=1
    initramfs initrd.img-5.4.51-v8+ followkernel
  18. microSD カードをアンマウントします。
    # umount /mnt/boot
    # umount /mnt
  19. 出来上がった microSD カードを Raspberry Pi に挿入し起動し、sshd を有効とします。
    # systemctl enable ssh.service
  20. あとは rpi-eeprom パッケージを入れるなど、必要に応じて設定を行います。

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 が見えるようになりました。