Почему в пространстве имен пользователя, отличном от -root, в файловой системе nosuid,nodev монтирование с привязкой завершается успешно, а повторное монтирование терпит неудачу?

Таким образом, основная проблема с вашей командой заключается в том, что, используя |, вы на самом деле разбиваете ее на несколько команд, первая из которых — nnoremap, а начиная со второй — последовательность команд silent!с замены, которые выполняются во время получения вашего .vimrc, а не становятся частью команды.

Использование \|или <bar>должно решить эту проблему.

Вторая проблема заключается в том, что nnoremapожидает команду в обычном режиме, поэтому он берет ваш silent!и запускает командуs(замены ), которая затем заменяет символ под курсором на ilent!..., это не то, что вам нужно... Вам нужен дополнительный :перед первым silent!, чтобы он знал, что нужно перейти в командный режим.

И в-третьих, ваша последняя команда %s/;$<CR>не очень хорошо сформирована, вам нужны две дополнительные /для ее завершения. Я предполагаю, что вы намерены удалить все ;в конце строк,так что %s/;$//это то, что я предполагаю, что вы хотите здесь. (Я также заметил, что вы пропустили здесь silent!, может быть, по недосмотру? Добавляю сюда, на всякий случай.)

Собираем все воедино:

nnoremap ;; :silent! :%s/\s\+$//e \| silent! :%s/\(\n\n\)\n\+/\1/ \| silent! :%s#\($\n\s*\)\+\%$## \| silent! :%s/;$//<CR>
2
23.06.2021, 10:07
1 ответ

Я нашел ответ.

Как видно из приведенных ниже выдержек из исходного кода ядра, если какой-либо из флагов NODEV, NOSUID, NOEXEC и/или ATIME уже установлен, мне нужно будет сохранить (, т. е. продолжить установку ). ] их во время моего второго звонка на mount().

Из fs/namespace.cисходного кода ядра Linux:

/*
 * Handle reconfiguration of the mountpoint only without alteration of the
 * superblock it refers to.  This is triggered by specifying MS_REMOUNT|MS_BIND
 * to mount(2).
 */
static int do_reconfigure_mnt(struct path *path, unsigned int mnt_flags)
{
        struct super_block *sb = path->mnt->mnt_sb;
        struct mount *mnt = real_mount(path->mnt);
        int ret;

        if (!check_mnt(mnt))
                return -EINVAL;

        if (path->dentry != mnt->mnt.mnt_root)
                return -EINVAL;

        if (!can_change_locked_flags(mnt, mnt_flags))
                return -EPERM;

        down_write(&sb->s_umount);
        ret = change_mount_ro_state(mnt, mnt_flags);
        if (ret == 0)
                set_mount_attributes(mnt, mnt_flags);
        up_write(&sb->s_umount);

        mnt_warn_timestamp_expiry(path, &mnt->mnt);

        return ret;
}


static bool can_change_locked_flags(struct mount *mnt, unsigned int mnt_flags)
{
        unsigned int fl = mnt->mnt.mnt_flags;

        if ((fl & MNT_LOCK_READONLY) &&
            !(mnt_flags & MNT_READONLY))
                return false;

        if ((fl & MNT_LOCK_NODEV) &&
            !(mnt_flags & MNT_NODEV))
                return false;

        if ((fl & MNT_LOCK_NOSUID) &&
            !(mnt_flags & MNT_NOSUID))
                return false;

        if ((fl & MNT_LOCK_NOEXEC) &&
            !(mnt_flags & MNT_NOEXEC))
                return false;

        if ((fl & MNT_LOCK_ATIME) &&
            ((fl & MNT_ATIME_MASK) != (mnt_flags & MNT_ATIME_MASK)))
                return false;

        return true;
}
2
28.07.2021, 11:22

Теги

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