Я не понимаю, как может работать ввод пространства имён монтирования

Другой подход - отключить мышь и клавиатуру (предполагая систему с USB-устройствами ввода):

00 23 * * * rmmod usbhid
00  7 * * * modprobe usbhid

Это не помешает вам выключить и снова включить систему, что снова включит клавиатуру и мышь... Если вы хотите предотвратить это, вы можете включить модуль в черный список, но вам, вероятно, придется каждый раз перестраивать initramfs (usbhid должен быть загружен очень рано во время загрузки, поскольку вы хотите иметь рабочую клавиатуру, чтобы исправить ситуацию, когда система не может загрузиться).

Если usbhid встроен в ядро вашей системы (например, Fedora), вы можете добиться того же эффекта, отвязав все HID-устройства; сложнее всего будет перепривязать их в 7 утра - вам нужно будет где-то хранить драйверы, от которых они были отвязаны (если нет способа их перечислить). Чтобы отвязать все устройства:

for device in /sys/bus/hid/devices/*; do
    echo ${device##*/} > ${device}/driver/unbind
done

(с соответствующей проверкой ошибок, конечно). Для повторной привязки нужно вспомнить, на какой драйвер указывал ${device}/driver, и echo идентификатор устройства для bind в каталоге драйвера.

2
28.06.2018, 11:59
1 ответ

И текущий рабочий каталог, и корень сбрасываются в корневую файловую систему введенного пространства имен монтирования.

Например, я проверил, что могу избежать chroot, запустив nsenter -m --target $$.

(Напоминание:chrootлегко скрыть, если вы все еще являетесь пользователем root. man chrootдокументирует хорошо -известный способ сделать это ).


Источник

https://elixir.bootlin.com/linux/latest/source/fs/namespace.c?v=4.17#L3507

static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns)
{
    struct fs_struct *fs = current->fs;

Примечание:currentозначает текущую задачу -текущего потока/процесса.

->fsбудут данными файловой системы этой задачи. -они совместно используются задачами, являющимися потоками одного и того же процесса. Например. ниже вы увидите, что изменение рабочего каталога — это операция на ->fs.

. изменение рабочего каталога влияет на все потоки одного и того же процесса. Подобные потоки, совместимые с POSIX -, реализуются с использованием флага CLONE _FS клона ().

    struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns;
    struct path root;
    int err;

...

    /* Find the root */
    err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt,
                "/", LOOKUP_DOWN, &root);

вот строка, о которой идет речь:

    /* Update the pwd and root */
    set_fs_pwd(fs, &root);
    set_fs_root(fs, &root);

...

}

...

const struct proc_ns_operations mntns_operations = {
   .name       = "mnt",
   .type       = CLONE_NEWNS,
   .get        = mntns_get,
   .put        = mntns_put,
   .install    = mntns_install,
   .owner      = mntns_owner,
};
2
27.01.2020, 22:09

Теги

Похожие вопросы