Enable checking whether ipvs modules are built-in or not

pull/8/head
Weibin Lin 2018-05-16 14:56:28 +08:00
parent e3b0e85138
commit c3e2fc0c0f
1 changed files with 22 additions and 1 deletions

View File

@ -23,7 +23,9 @@ package ipvs
import (
"bytes"
"fmt"
"io/ioutil"
"net"
"regexp"
"strconv"
"strings"
"sync"
@ -412,6 +414,25 @@ func NewLinuxKernelHandler() *LinuxKernelHandler {
// GetModules returns all installed kernel modules.
func (handle *LinuxKernelHandler) GetModules() ([]string, error) {
// Check whether IPVS required kernel modules are built-in
kernelVersionFile := "/proc/sys/kernel/osrelease"
b, err := ioutil.ReadFile(kernelVersionFile)
if err != nil {
glog.Errorf("Failed to read file %s with error %v", kernelVersionFile, err)
}
kernelVersion := strings.TrimSpace(string(b))
builtinModsFilePath := fmt.Sprintf("/lib/modules/%s/modules.builtin", kernelVersion)
b, err = ioutil.ReadFile(builtinModsFilePath)
if err != nil {
glog.Errorf("Failed to read file %s with error %v", builtinModsFilePath, err)
}
var bmods []string
for _, module := range ipvsModules {
if match, _ := regexp.Match(module+".ko", b); match {
bmods = append(bmods, module)
}
}
// Try to load IPVS required kernel modules using modprobe first
for _, kmod := range ipvsModules {
err := handle.executor.Command("modprobe", "--", kmod).Run()
@ -428,7 +449,7 @@ func (handle *LinuxKernelHandler) GetModules() ([]string, error) {
}
mods := strings.Split(string(out), "\n")
return mods, nil
return append(mods, bmods...), nil
}
// CanUseIPVSProxier returns true if we can use the ipvs Proxier.