Skip to content

Latest commit

 

History

History
78 lines (65 loc) · 1.74 KB

README.md

File metadata and controls

78 lines (65 loc) · 1.74 KB

GoDoc

kmod

A Go implementation of functions to load and unload Linux kernel modules.

Module dependencies are loaded / unloaded automatically as defined in <mod_dir>/modules.dep. Kmod uses the syscall finit_module(2) to load a kernel file into the kernel and if that fails init_module(2). Compressed files are not supported directly but users can provide a custom function to uncompress and load a module file into the kernel. (SetInitFunc). This is to keep the number of external dependencies low and also allows maximum flexibility.

See the simple examples below and modprobe.go for an complete example.

// Load uncompressed kernel module
package main

import (
    "log"

    "github.com/pmorjan/kmod"
)

func main() {
    k, err := kmod.New()
    if err != nil {
        log.Fatal(err)
    }
    if err := k.Load("brd", "rd_size=32768 rd_nr=16", 0); err != nil {
        log.Fatal(err)
    }
}
// Load XZ compressed module
package main

import (
    "io/ioutil"
    "log"
    "os"

    "github.com/pmorjan/kmod"
    "github.com/ulikunitz/xz"
    "golang.org/x/sys/unix"
)

func main() {
    k, err := kmod.New(kmod.SetInitFunc(modInit))
    if err != nil {
        log.Fatal(err)
    }
    if err := k.Load("brd", "rd_size=32768 rd_nr=16", 0); err != nil {
        log.Fatal(err)
    }
}

func modInit(path, params string, flags int) error {
    f, err := os.Open(path)
    if err != nil {
        return err
    }
    rd, err := xz.NewReader(f)
    if err != nil {
        return err
    }
    buf, err := ioutil.ReadAll(rd)
    if err != nil {
        return err
    }
    return unix.InitModule(buf, params)
}