|
1 | 1 | #define _GNU_SOURCE |
2 | 2 | #include <errno.h> |
3 | 3 | #include <fcntl.h> |
4 | | -#include <ftw.h> |
5 | 4 | #include <getopt.h> |
6 | | -#include <libkmod.h> |
7 | 5 | #include <net/if.h> |
8 | 6 | #include <netinet/ip.h> |
9 | 7 | #include <signal.h> |
|
16 | 14 | #include <sys/stat.h> |
17 | 15 | #include <sys/sysmacros.h> |
18 | 16 | #include <sys/types.h> |
19 | | -#include <sys/utsname.h> |
20 | 17 | #include <sys/wait.h> |
21 | 18 | #include <unistd.h> |
22 | 19 | #include "../vsockexec/vsock.h" |
@@ -60,20 +57,15 @@ static int opentcp(unsigned short port) |
60 | 57 | #define RNDADDENTROPY _IOW( 'R', 0x03, int [2] ) |
61 | 58 |
|
62 | 59 | #define DEFAULT_PATH_ENV "PATH=/sbin:/usr/sbin:/bin:/usr/bin" |
63 | | -#define OPEN_FDS 15 |
64 | 60 |
|
65 | 61 | const char *const default_envp[] = { |
66 | 62 | DEFAULT_PATH_ENV, |
67 | 63 | NULL, |
68 | 64 | }; |
69 | 65 |
|
70 | | -// global kmod k_ctx so we can access it in the file tree traversal |
71 | | -struct kmod_ctx *k_ctx; |
72 | | - |
73 | 66 | // When nothing is passed, default to the LCOWv1 behavior. |
74 | 67 | const char *const default_argv[] = { "/bin/gcs", "-loglevel", "debug", "-logfile=/run/gcs/gcs.log" }; |
75 | 68 | const char *const default_shell = "/bin/sh"; |
76 | | -const char *const lib_modules = "/lib/modules"; |
77 | 69 |
|
78 | 70 | struct Mount { |
79 | 71 | const char *source, *target, *type; |
@@ -411,110 +403,6 @@ int reap_until(pid_t until_pid) { |
411 | 403 | } |
412 | 404 | } |
413 | 405 |
|
414 | | -// load_module gets the module from the absolute path to the module and then |
415 | | -// inserts into the kernel. |
416 | | -int load_module(struct kmod_ctx *ctx, const char *module_path) { |
417 | | - struct kmod_module *mod = NULL; |
418 | | - int err; |
419 | | - |
420 | | - #ifdef DEBUG |
421 | | - printf("loading module: %s\n", module_path); |
422 | | - #endif |
423 | | - |
424 | | - err = kmod_module_new_from_path(ctx, module_path, &mod); |
425 | | - if (err < 0) { |
426 | | - return err; |
427 | | - } |
428 | | - |
429 | | - err = kmod_module_probe_insert_module(mod, 0, NULL, NULL, NULL, NULL); |
430 | | - if (err < 0) { |
431 | | - kmod_module_unref(mod); |
432 | | - return err; |
433 | | - } |
434 | | - |
435 | | - kmod_module_unref(mod); |
436 | | - return 0; |
437 | | -} |
438 | | - |
439 | | -// parse_tree_entry is called by ftw for each directory and file in the file tree. |
440 | | -// If this entry is a file and has a .ko file extension, attempt to load into kernel. |
441 | | -int parse_tree_entry(const char *fpath, const struct stat *sb, int typeflag) { |
442 | | - int result; |
443 | | - const char *ext; |
444 | | - |
445 | | - if (typeflag != FTW_F) { |
446 | | - // do nothing if this isn't a file |
447 | | - return 0; |
448 | | - } |
449 | | - |
450 | | - ext = strrchr(fpath, '.'); |
451 | | - if (!ext || ext == fpath) { |
452 | | - // no file extension found in the filepath |
453 | | - return 0; |
454 | | - } |
455 | | - |
456 | | - if ((result = strcmp(ext, ".ko")) != 0) { |
457 | | - // file does not have .ko extension so it is not a kernel module |
458 | | - return 0; |
459 | | - } |
460 | | - |
461 | | - // print warning if we fail to load the module, but don't fail fn so |
462 | | - // we keep trying to load the rest of the modules. |
463 | | - result = load_module(k_ctx, fpath); |
464 | | - if (result != 0) { |
465 | | - warn2("failed to load module", fpath); |
466 | | - } |
467 | | - return 0; |
468 | | -} |
469 | | - |
470 | | -// load_all_modules finds the modules in the image and loads them using kmod, |
471 | | -// which accounts for ordering requirements. |
472 | | -void load_all_modules() { |
473 | | - int max_path = 256; |
474 | | - char modules_dir[max_path]; |
475 | | - struct utsname uname_data; |
476 | | - int ret; |
477 | | - |
478 | | - // get information on the running kernel |
479 | | - ret = uname(&uname_data); |
480 | | - if (ret != 0) { |
481 | | - die("failed to get kernel information"); |
482 | | - } |
483 | | - |
484 | | - // create the absolute path of the modules directory this looks |
485 | | - // like /lib/modules/<uname.release> |
486 | | - ret = snprintf(modules_dir, max_path, "%s/%s", lib_modules, uname_data.release); |
487 | | - if (ret < 0) { |
488 | | - die("failed to create the modules directory path"); |
489 | | - } else if (ret > max_path) { |
490 | | - die("modules directory buffer larger than expected"); |
491 | | - } |
492 | | - |
493 | | - if (k_ctx == NULL) { |
494 | | - k_ctx = kmod_new(NULL, NULL); |
495 | | - if (k_ctx == NULL) { |
496 | | - die("failed to create kmod context"); |
497 | | - } |
498 | | - } |
499 | | - |
500 | | - kmod_load_resources(k_ctx); |
501 | | - ret = ftw(modules_dir, parse_tree_entry, OPEN_FDS); |
502 | | - if (ret < 0) { |
503 | | - kmod_unref(k_ctx); |
504 | | - die("failed to load kmod resources"); |
505 | | - } else if (ret != 0) { |
506 | | - // Don't fail on error from walking the file tree and loading modules right now. |
507 | | - // ftw may return an error if the modules directory doesn't exist, which |
508 | | - // may be the case for some images. Additionally, we don't currently support |
509 | | - // using a denylist when loading modules, so we may try to load modules |
510 | | - // that cannot be loaded until later, such as nvidia modules which fail to |
511 | | - // load if no device is present. |
512 | | - warn("error adding modules"); |
513 | | - } |
514 | | - |
515 | | - kmod_unref(k_ctx); |
516 | | -} |
517 | | - |
518 | 406 | #ifdef DEBUG |
519 | 407 | int debug_main(int argc, char **argv) { |
520 | 408 | unsigned int ports[3] = {2056, 2056, 2056}; |
@@ -645,11 +533,6 @@ int main(int argc, char **argv) { |
645 | 533 | init_entropy(entropy_port); |
646 | 534 | } |
647 | 535 |
|
648 | | - #ifdef DEBUG |
649 | | - printf("loading modules\n"); |
650 | | - #endif |
651 | | - load_all_modules(); |
652 | | - |
653 | 536 | pid_t pid = launch(child_argc, child_argv); |
654 | 537 | if (debug_shell != NULL) { |
655 | 538 | // The debug shell takes over as the primary child. |
|
0 commit comments