Skip to content

Commit 71270a3

Browse files
author
Kathryn Baldauf
authored
Merge pull request #2091 from katiewasnothere/kabaldau/revert_init_kmod
Revert "Use kmod library to load modules"
2 parents 7df3b5f + d736453 commit 71270a3

5 files changed

Lines changed: 2 additions & 138 deletions

File tree

.github/workflows/ci.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -686,11 +686,6 @@ jobs:
686686
go.sum
687687
test/go.sum
688688
689-
- name: Install kmod
690-
shell: bash
691-
run: |
692-
sudo apt-get install -y libkmod-dev
693-
694689
- name: Set version info
695690
shell: pwsh
696691
run: |

.github/workflows/codeql.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,6 @@ jobs:
9292
with:
9393
languages: ${{matrix.language}}
9494

95-
- name: Install kmod
96-
shell: bash
97-
run: |
98-
sudo apt-get install -y libkmod-dev
99-
10095
# build binaries
10196
- name: Build go binaries
10297
shell: pwsh

Makefile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ CGO_ENABLED:=0
77
GOMODVENDOR:=
88

99
CFLAGS:=-O2 -Wall
10-
LDFLAGS:= -s # strip C binaries
11-
LDLIBS:= -lkmod
10+
LDFLAGS:=-static -s # strip C binaries
1211

1312
GO_FLAGS_EXTRA:=
1413
ifeq "$(GOMODVENDOR)" "1"
@@ -182,7 +181,7 @@ bin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o
182181

183182
bin/init: init/init.o vsockexec/vsock.o
184183
@mkdir -p bin
185-
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
184+
$(CC) $(LDFLAGS) -o $@ $^
186185

187186
%.o: %.c
188187
@mkdir -p $(dir $@)

README.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@ It is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd
1010

1111
While this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md).
1212

13-
### Install dependencies
14-
To build the init binary used to launch Utility VMs, we rely on "libkmod". To install libkmod, run the following in a linux environment:
15-
16-
```sh
17-
> sudo apt-get update
18-
> sudo apt-get install -y libkmod2 libkmod-dev
19-
```
20-
2113
### Linux Hyper-V Container Guest Agent
2214

2315
To build the Linux guest agent itself all that's needed is to set your GOOS to "Linux" and build out of ./cmd/gcs.

init/init.c

Lines changed: 0 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
#define _GNU_SOURCE
22
#include <errno.h>
33
#include <fcntl.h>
4-
#include <ftw.h>
54
#include <getopt.h>
6-
#include <libkmod.h>
75
#include <linux/random.h> // RNDADDENTROPY
86
#include <net/if.h>
97
#include <netinet/ip.h>
@@ -17,7 +15,6 @@
1715
#include <sys/stat.h>
1816
#include <sys/sysmacros.h>
1917
#include <sys/types.h>
20-
#include <sys/utsname.h>
2118
#include <sys/wait.h>
2219
#include <unistd.h>
2320

@@ -55,20 +52,15 @@ static int opentcp(unsigned short port)
5552
#endif
5653

5754
#define DEFAULT_PATH_ENV "PATH=/sbin:/usr/sbin:/bin:/usr/bin"
58-
#define OPEN_FDS 15
5955

6056
const char *const default_envp[] = {
6157
DEFAULT_PATH_ENV,
6258
NULL,
6359
};
6460

65-
// global kmod k_ctx so we can access it in the file tree traversal
66-
struct kmod_ctx *k_ctx;
67-
6861
// When nothing is passed, default to the LCOWv1 behavior.
6962
const char *const default_argv[] = { "/bin/gcs", "-loglevel", "debug", "-logfile=/run/gcs/gcs.log" };
7063
const char *const default_shell = "/bin/sh";
71-
const char *const lib_modules = "/lib/modules";
7264

7365
struct Mount {
7466
const char *source, *target, *type;
@@ -406,110 +398,6 @@ int reap_until(pid_t until_pid) {
406398
}
407399
}
408400

409-
// load_module gets the module from the absolute path to the module and then
410-
// inserts into the kernel.
411-
int load_module(struct kmod_ctx *ctx, const char *module_path) {
412-
struct kmod_module *mod = NULL;
413-
int err;
414-
415-
#ifdef DEBUG
416-
printf("loading module: %s\n", module_path);
417-
#endif
418-
419-
err = kmod_module_new_from_path(ctx, module_path, &mod);
420-
if (err < 0) {
421-
return err;
422-
}
423-
424-
err = kmod_module_probe_insert_module(mod, 0, NULL, NULL, NULL, NULL);
425-
if (err < 0) {
426-
kmod_module_unref(mod);
427-
return err;
428-
}
429-
430-
kmod_module_unref(mod);
431-
return 0;
432-
}
433-
434-
// parse_tree_entry is called by ftw for each directory and file in the file tree.
435-
// If this entry is a file and has a .ko file extension, attempt to load into kernel.
436-
int parse_tree_entry(const char *fpath, const struct stat *sb, int typeflag) {
437-
int result;
438-
const char *ext;
439-
440-
if (typeflag != FTW_F) {
441-
// do nothing if this isn't a file
442-
return 0;
443-
}
444-
445-
ext = strrchr(fpath, '.');
446-
if (!ext || ext == fpath) {
447-
// no file extension found in the filepath
448-
return 0;
449-
}
450-
451-
if ((result = strcmp(ext, ".ko")) != 0) {
452-
// file does not have .ko extension so it is not a kernel module
453-
return 0;
454-
}
455-
456-
// print warning if we fail to load the module, but don't fail fn so
457-
// we keep trying to load the rest of the modules.
458-
result = load_module(k_ctx, fpath);
459-
if (result != 0) {
460-
warn2("failed to load module", fpath);
461-
}
462-
return 0;
463-
}
464-
465-
// load_all_modules finds the modules in the image and loads them using kmod,
466-
// which accounts for ordering requirements.
467-
void load_all_modules() {
468-
int max_path = 256;
469-
char modules_dir[max_path];
470-
struct utsname uname_data;
471-
int ret;
472-
473-
// get information on the running kernel
474-
ret = uname(&uname_data);
475-
if (ret != 0) {
476-
die("failed to get kernel information");
477-
}
478-
479-
// create the absolute path of the modules directory this looks
480-
// like /lib/modules/<uname.release>
481-
ret = snprintf(modules_dir, max_path, "%s/%s", lib_modules, uname_data.release);
482-
if (ret < 0) {
483-
die("failed to create the modules directory path");
484-
} else if (ret > max_path) {
485-
die("modules directory buffer larger than expected");
486-
}
487-
488-
if (k_ctx == NULL) {
489-
k_ctx = kmod_new(NULL, NULL);
490-
if (k_ctx == NULL) {
491-
die("failed to create kmod context");
492-
}
493-
}
494-
495-
kmod_load_resources(k_ctx);
496-
ret = ftw(modules_dir, parse_tree_entry, OPEN_FDS);
497-
if (ret < 0) {
498-
kmod_unref(k_ctx);
499-
die("failed to load kmod resources");
500-
} else if (ret != 0) {
501-
// Don't fail on error from walking the file tree and loading modules right now.
502-
// ftw may return an error if the modules directory doesn't exist, which
503-
// may be the case for some images. Additionally, we don't currently support
504-
// using a denylist when loading modules, so we may try to load modules
505-
// that cannot be loaded until later, such as nvidia modules which fail to
506-
// load if no device is present.
507-
warn("error adding modules");
508-
}
509-
510-
kmod_unref(k_ctx);
511-
}
512-
513401
#ifdef DEBUG
514402
int debug_main(int argc, char **argv) {
515403
unsigned int ports[3] = {2056, 2056, 2056};
@@ -640,11 +528,6 @@ int main(int argc, char **argv) {
640528
init_entropy(entropy_port);
641529
}
642530

643-
#ifdef DEBUG
644-
printf("loading modules\n");
645-
#endif
646-
load_all_modules();
647-
648531
pid_t pid = launch(child_argc, child_argv);
649532
if (debug_shell != NULL) {
650533
// The debug shell takes over as the primary child.

0 commit comments

Comments
 (0)