Ubuntuでカーネルドライバのdebパッケージって、どうやって作るんだろう、と気になって、Copilotベースでやってみたものです。
1. 環境
以下のように、AlmaLinux10のKVM環境に、マシンイメージからVMを作り、使います。
VM作成後、ホスト名を設定済みです。
root@ubuntu:~# hostnamectl set-hostname u2404smi-vm2
root@ubuntu:~#
パッケージ作成に必要なパッケージを入れます。
root@u2404smi-vm2:~# apt install build-essential linux-headers-$(uname -r) dpkg-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
linux-headers-6.8.0-71-generic is already the newest version (6.8.0-71.71).
linux-headers-6.8.0-71-generic set to manually installed.
The following additional packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu bzip2 cpp cpp-13 cpp-13-x86-64-linux-gnu
cpp-x86-64-linux-gnu fakeroot g++ g++-13 g++-13-x86-64-linux-gnu g++-x86-64-linux-gnu gcc gcc-13 gcc-13-base
gcc-13-x86-64-linux-gnu gcc-x86-64-linux-gnu libalgorithm-diff-perl libalgorithm-diff-xs-perl
libalgorithm-merge-perl libasan8 libatomic1 libbinutils libcc1-0 libctf-nobfd0 libctf0 libdpkg-perl
libfakeroot libfile-fcntllock-perl libgcc-13-dev libgomp1 libgprofng0 libhwasan0 libisl23 libitm1 liblsan0
libmpc3 libquadmath0 libsframe1 libstdc++-13-dev libtsan2 libubsan1 lto-disabled-list make
Suggested packages:
binutils-doc gprofng-gui bzip2-doc cpp-doc gcc-13-locales cpp-13-doc debian-keyring g++-multilib
g++-13-multilib gcc-13-doc gcc-multilib autoconf automake libtool flex bison gdb gcc-doc gcc-13-multilib
gdb-x86-64-linux-gnu bzr libstdc++-13-doc make-doc
The following NEW packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu build-essential bzip2 cpp cpp-13 cpp-13-x86-64-linux-gnu
cpp-x86-64-linux-gnu dpkg-dev fakeroot g++ g++-13 g++-13-x86-64-linux-gnu g++-x86-64-linux-gnu gcc gcc-13
gcc-13-base gcc-13-x86-64-linux-gnu gcc-x86-64-linux-gnu libalgorithm-diff-perl libalgorithm-diff-xs-perl
libalgorithm-merge-perl libasan8 libatomic1 libbinutils libcc1-0 libctf-nobfd0 libctf0 libdpkg-perl
libfakeroot libfile-fcntllock-perl libgcc-13-dev libgomp1 libgprofng0 libhwasan0 libisl23 libitm1 liblsan0
libmpc3 libquadmath0 libsframe1 libstdc++-13-dev libtsan2 libubsan1 lto-disabled-list make
0 upgraded, 47 newly installed, 0 to remove and 0 not upgraded.
Need to get 66.9 MB of archives.
After this operation, 228 MB of additional disk space will be used.
Do you want to continue? [Y/n]
yを入れて、インストールします。
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 binutils-common amd64 2.42-4ubuntu2.5 [240 kB]
Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsframe1 amd64 2.42-4ubuntu2.5 [15.5 kB]
~
Processing triggers for libc-bin (2.39-0ubuntu8.5) ...
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
root@u2404smi-vm2:~#
2. koファイル作成
まず、ドライバのkoファイルを作ります。作業場所は~/meminfo-build/とします。
root@u2404smi-vm2:~# mkdir -p ~/meminfo-build
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# cd ~/meminfo-build
root@u2404smi-vm2:~/meminfo-build#
meminfo_logger.koというドライバを作ります。meminfo_logger.cを作り、メモリサイズをprintkする処理を書きます。
root@u2404smi-vm2:~/meminfo-build# vim meminfo_logger.c
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# cat meminfo_logger.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Taro");
MODULE_DESCRIPTION("Log total memory size to kernel log");
static int __init meminfo_init(void)
{
struct sysinfo i;
si_meminfo(&i);
unsigned long total_kb = i.totalram * i.mem_unit / 1024;
printk(KERN_INFO "Total memory: %lu KB\n", total_kb);
return 0;
}
static void __exit meminfo_exit(void)
{
printk(KERN_INFO "meminfo_logger module unloaded\n");
}
module_init(meminfo_init);
module_exit(meminfo_exit);
root@u2404smi-vm2:~/meminfo-build#
Makefileを作ります。
root@u2404smi-vm2:~/meminfo-build# vim Makefile
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# cat Makefile
obj-m += meminfo_logger.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
root@u2404smi-vm2:~/meminfo-build#
これで、こういう状態です。
root@u2404smi-vm2:~/meminfo-build# ls -l
total 8
-rw-r--r-- 1 root root 166 Sep 2 11:12 Makefile
-rw-r--r-- 1 root root 578 Sep 2 11:11 meminfo_logger.c
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# pwd
/root/meminfo-build
root@u2404smi-vm2:~/meminfo-build#
makeコマンドを実行し、ビルドします。
root@u2404smi-vm2:~/meminfo-build# make
make -C /lib/modules/6.8.0-71-generic/build M=/root/meminfo-build modules
make[1]: Entering directory '/usr/src/linux-headers-6.8.0-71-generic'
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
You are using: gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
CC [M] /root/meminfo-build/meminfo_logger.o
MODPOST /root/meminfo-build/Module.symvers
CC [M] /root/meminfo-build/meminfo_logger.mod.o
LD [M] /root/meminfo-build/meminfo_logger.ko
BTF [M] /root/meminfo-build/meminfo_logger.ko
Skipping BTF generation for /root/meminfo-build/meminfo_logger.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-6.8.0-71-generic'
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# echo $?
0
root@u2404smi-vm2:~/meminfo-build#
これで、koファイルが作られていました。
root@u2404smi-vm2:~/meminfo-build# ls -lh
total 360K
-rw-r--r-- 1 root root 166 Sep 2 11:12 Makefile
-rw-r--r-- 1 root root 0 Sep 2 11:12 Module.symvers
-rw-r--r-- 1 root root 578 Sep 2 11:11 meminfo_logger.c
-rw-r--r-- 1 root root 168K Sep 2 11:12 meminfo_logger.ko
-rw-r--r-- 1 root root 37 Sep 2 11:12 meminfo_logger.mod
-rw-r--r-- 1 root root 1.2K Sep 2 11:12 meminfo_logger.mod.c
-rw-r--r-- 1 root root 144K Sep 2 11:12 meminfo_logger.mod.o
-rw-r--r-- 1 root root 26K Sep 2 11:12 meminfo_logger.o
-rw-r--r-- 1 root root 37 Sep 2 11:12 modules.order
root@u2404smi-vm2:~/meminfo-build#
3. debファイル作成
debファイルを作ります。debファイル作成場所は、~/meminfo-deb/とします。
root@u2404smi-vm2:~/meminfo-build# mkdir -p ~/meminfo-deb/lib/modules/$(uname -r)/extra
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# mkdir -p ~/meminfo-deb/DEBIAN
root@u2404smi-vm2:~/meminfo-build#
debパッケージをインストールすると、OSの/lib/modules/$(uname -r)/extra/に、meminfo_logger.koが置かれるようにするので、それに相当するディレクトリに、koファイルをコピーしておきます。
root@u2404smi-vm2:~/meminfo-build# cp ./meminfo_logger.ko ~/meminfo-deb/lib/modules/$(uname -r)/extra/
root@u2404smi-vm2:~/meminfo-build#
rpmファイルと違って、ビルドとパッケージ作成は、別々の作業なんですね。
debパッケージの情報を表す、controlファイルを作成します。
root@u2404smi-vm2:~/meminfo-build# vim ~/meminfo-deb/DEBIAN/control
root@u2404smi-vm2:~/meminfo-build#
root@u2404smi-vm2:~/meminfo-build# cat ~/meminfo-deb/DEBIAN/control
Package: meminfo-bin
Version: 1.0
Section: kernel
Priority: optional
Architecture: amd64
Maintainer: Test <test@example.com>
Description: Precompiled kernel module to log total memory
This package installs a precompiled meminfo_logger.ko module.
root@u2404smi-vm2:~/meminfo-build#
これでファイルは揃ったので、debファイルを作ります。debファイルは、dpkg-deb --buildしたとき、カレントに作られるので、~/に移動しました。
root@u2404smi-vm2:~/meminfo-build# cd
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# ls -l
total 8
drwxr-xr-x 2 root root 4096 Sep 2 11:12 meminfo-build
drwxr-xr-x 4 root root 4096 Sep 2 11:13 meminfo-deb
root@u2404smi-vm2:~#
作成します。meminfo-deb.debが作られました。
root@u2404smi-vm2:~# dpkg-deb --build ~/meminfo-deb
dpkg-deb: building package 'meminfo-bin' in '/root/meminfo-deb.deb'.
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# echo $?
0
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# ls -l
total 60
drwxr-xr-x 2 root root 4096 Sep 2 11:12 meminfo-build
drwxr-xr-x 4 root root 4096 Sep 2 11:13 meminfo-deb
-rw-r--r-- 1 root root 49514 Sep 2 11:15 meminfo-deb.deb
root@u2404smi-vm2:~#
パッケージの情報は、dpkg-deb -Iで見られます。(ちなみに、dpkgコマンドは、インストール済みのパッケージに対するコマンド)
root@u2404smi-vm2:~# dpkg-deb -I meminfo-deb.deb
new Debian package, version 2.0.
size 49514 bytes: control archive=274 bytes.
247 bytes, 8 lines control
Package: meminfo-bin
Version: 1.0
Section: kernel
Priority: optional
Architecture: amd64
Maintainer: Test <test@example.com>
Description: Precompiled kernel module to log total memory
This package installs a precompiled meminfo_logger.ko module.
root@u2404smi-vm2:~#
パッケージに含まれるファイルの一覧は、dpkg-deb -cで見られます。
root@u2404smi-vm2:~# dpkg-deb -c meminfo-deb.deb
drwxr-xr-x root/root 0 2025-09-02 11:13 ./
drwxr-xr-x root/root 0 2025-09-02 11:13 ./lib/
drwxr-xr-x root/root 0 2025-09-02 11:13 ./lib/modules/
drwxr-xr-x root/root 0 2025-09-02 11:13 ./lib/modules/6.8.0-71-generic/
drwxr-xr-x root/root 0 2025-09-02 11:13 ./lib/modules/6.8.0-71-generic/extra/
-rw-r--r-- root/root 171032 2025-09-02 11:13 ./lib/modules/6.8.0-71-generic/extra/meminfo_logger.ko
root@u2404smi-vm2:~#
4. debパッケージの動作確認
作ったdebパッケージをOSに入れます。
root@u2404smi-vm2:~# dpkg -i meminfo-deb.deb
Selecting previously unselected package meminfo-bin.
(Reading database ... 76988 files and directories currently installed.)
Preparing to unpack meminfo-deb.deb ...
Unpacking meminfo-bin (1.0) ...
Setting up meminfo-bin (1.0) ...
root@u2404smi-vm2:~#
/lib/modules/6.8.0-71-generic/extra/に、koファイルが配置されていることが分かります。
root@u2404smi-vm2:~# ls -l /lib/modules/6.8.0-71-generic/extra/
total 168
-rw-r--r-- 1 root root 171032 Sep 2 11:13 meminfo_logger.ko
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# date
Tue Sep 2 11:19:14 UTC 2025
root@u2404smi-vm2:~#
ドライバをロードします。lsmodで、meminfo_loggerが現れます。
root@u2404smi-vm2:~# depmod
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# modprobe meminfo_logger
root@u2404smi-vm2:~#
root@u2404smi-vm2:~# lsmod | grep mem
meminfo_logger 12288 0
async_memcpy 16384 2 raid456,async_raid6_recov
async_tx 16384 5 async_pq,async_memcpy,async_xor,raid456,async_raid6_recov
root@u2404smi-vm2:~#
dmesgに、メモリサイズが出ました。
root@u2404smi-vm2:~# dmesg | tail -n5
[ 11.571408] audit: type=1400 audit(1756810928.756:122): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/lib/snapd/snap-confine" pid=1003 comm="apparmor_parser"
[ 11.575260] audit: type=1400 audit(1756810928.760:123): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/lib/snapd/snap-confine//mount-namespace-capture-helper" pid=1003 comm="apparmor_parser"
[ 1081.511637] meminfo_logger: loading out-of-tree module taints kernel.
[ 1081.511642] meminfo_logger: module verification failed: signature and/or required key missing - tainting kernel
[ 1081.511837] Total memory: 2977784 KB
root@u2404smi-vm2:~#
まとめ
Ubuntu24.04で、ロードされるとメモリサイズを表示するだけのドライバのdebファイルを作りました。
