Skip to content

pmorjan/kmod

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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)
}

About

Go implementation for loading / unloading Linux kernel modules

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages