chrootを使ってLinuxのimgファイルにライブラリをインストール

はじめに

chrootを使って、Linuxのimgにライブラリをインストールする。

環境

問題、課題

LinuxUbuntuをimgファイルを複数回、再インストールを行う作業を行っていた。その際、必要なライブラリを都度にインストールすることが手間がかかったため、imgに直接にインストールすることで、ライブラリのインストールにかかる時間の短縮化する。

chrootコマンドを使って、debファイルをインストールする。

解決

chrootコマンドについて

chroot コマンドは、Unixオペレーティングシステムで使用されるコマンドで、指定したディレクトリを新しいルートディレクトリ(/)として設定し、その環境内でコマンドを実行するためのものである。これにより、プロセスがその新しいルートディレクトリを基準にファイルシステムを参照するようになる。

imgをマウントして、chrootしてそのマウント先を新しいルートディレクトリとして操作することで、ライブラリをインストールする。

envader.plus

パスを確認

使用するファイルのパスを確認する。

$ ls
<library>.deb ubuntu-22.04.1-server_work.img

イメージファイルをマウント

まず、イメージファイルをループバックデバイスとしてマウントする。

$ ls ubuntu-22.04.1-server_work.img
ubuntu-22.04.1-server_work.img

$ sudo losetup -fP ubuntu-22.04.1-server_work.img

これにより、イメージファイルがループバックデバイスに関連付けられる。 次に、どのデバイスに関連付けられたかを確認する。

$ sudo losetup -l
NAME    SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                              DIO LOG-SEC
/dev/loop0
                0      0         0  0 /home/admin/cdi/RMcli_v1.0.0.108/RMcli_RedHat8.6_v1.0.0.108/ubuntu-22.04.1-server_work.img
                                                                                                                                               0     512

/dev/loop0 に関連付けられたことを確認した

パーティションをマウント

イメージファイル内のパーティションをマウントする。 まず、パーティション情報を確認する。

$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 10 GiB, 10737418240 bytes, 20971520 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: gpt
Disk identifier: 1E86FE81-6066-45BB-A5CC-6E4A9CC07D76

Device         Start      End  Sectors  Size Type
/dev/loop0p1    2048  2203647  2201600  1.1G EFI System
/dev/loop0p2 2203648 18980863 16777216    8G Linux filesystem

Linux filesystemと記載のあるdeviceに対して、マウントポイントを作成し、パーティションをマウントする。

$ sudo mkdir /mnt/ubuntu_image
$ sudo mount /dev/loop0p2 /mnt/ubuntu_image

#確認
$ mount | grep /mnt/ubuntu_image
/dev/loop0p2 on /mnt/ubuntu_image type ext4 (rw,relatime,seclabel)

インストーラをコピー

chroot環境内でdebパッケージをインストールする。まず、debパッケージをchroot環境内にコピーする。

$ cp -r ./<library>.deb /mnt/ubuntu_image/tmp/

chroot環境に入る

chroot環境のために、ホスト側の必要なファイルをマウントし、マウントしたイメージファイルのルートファイルシステムchrootする。

$ sudo mkdir /mnt/ubuntu_image/dev
$ sudo mount --bind /dev /mnt/ubuntu_image/dev
#確認
$ mount | grep /mnt/ubuntu_image/dev
devtmpfs on /mnt/ubuntu_image/dev type devtmpfs (rw,nosuid,seclabel,size=7822248k,nr_inodes=1955562,mode=755)

$ sudo mkdir /mnt/ubuntu_image/proc
$ sudo mount --bind /proc /mnt/ubuntu_image/proc
#確認
$ mount | grep /mnt/ubuntu_image/proc
proc on /mnt/ubuntu_image/proc type proc (rw,nosuid,nodev,noexec,relatime)

$ sudo mkdir /mnt/ubuntu_image/sys
$ sudo mount --bind /sys /mnt/ubuntu_image/sys
#確認
$ mount | grep /mnt/ubuntu_image/sys
sysfs on /mnt/ubuntu_image/sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)

chrootに入る。

$ sudo chroot /mnt/ubuntu_image
(20秒ほど時間がかかる)
root@localhost:/# whoami
root

ライブラリのインストール

chroot環境内で以下のコマンドを実行してインストールする。

root@localhost:/# dpkg -i /tmp/<library>.deb

#確認
root@localhost:/# dpkg -l | grep cortex
(インストールしたライブラリが表示されることを確認)

chroot環境から抜ける

インストールが完了したら、chroot環境から抜けます。

# exit
exit

マウントを解除

最後に、すべてのマウントを解除し、ループバックデバイスを解放する。

$ sudo umount /mnt/ubuntu_image/dev
$ sudo umount /mnt/ubuntu_image/proc
$ sudo umount /mnt/ubuntu_image/sys
$ sudo umount /mnt/ubuntu_image
$ sudo losetup -d /dev/loop0

#確認
$ mount | grep /mnt/ubuntu_image
(何も表示されない)

参考

envader.plus