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: