0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntuのドライバのdebパッケージを作成する

Posted at

Ubuntuでカーネルドライバのdebパッケージって、どうやって作るんだろう、と気になって、Copilotベースでやってみたものです。

1. 環境

以下のように、AlmaLinux10のKVM環境に、マシンイメージからVMを作り、使います。

image.png

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ファイルを作りました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?