невозможно записать файл /proc/sys/kernel/ns_last_pid

Я хочу отредактировать файл ns_last_pid, присутствующий в /proc/sys/kernel, но получаю сообщение об ошибке Read-only file system. Как это решить? Это то, что я написал, чтобы открыть файл.

int fd = open("/proc/sys/kernel/ns_last_pid", O_RDWR | O_CREAT, 0644);
            if (fd < 0) {
                cout<<strerror(errno)<<"\n";
                return 1;
            }

Я должен написать этот файл, изменить его значение. Этот файл содержит одно число, представляющее последний pid, выделенный для любого процесса. Я должен отредактировать это, чтобы получить желаемый номер pid для процесса. как эти ребята делают для своего проекта CRIU(см. первую ссылку).

Pid_restore(criu.org),

Как установить идентификатор процесса в Linux для определенного программа (ответ stackoverflow)

EDIT 1: Наименьший воспроизводимый пример

#include <fstream>
#include <bits/stdc++.h>
#include <sys/types.h>
#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <sched.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <unistd.h>
#include <fcntl.h> 
#include <errno.h>
#include <sys/types.h>
#include <sys/syscall.h>

using namespace std;
    int main(){
            printf("Opening ns_last_pid...\n");   
            int fd = open("/proc/sys/kernel/ns_last_pid", O_RDWR | O_CREAT, 0644);
            if (fd < 0) {
                cout<<strerror(errno)<<"\n";
                return 1;
            }
            printf("Locking ns_last_pid...\n");
            if (flock(fd, LOCK_EX)) {
                close(fd);
                printf("Can't lock ns_last_pid\n");
                return 1;
            }
            printf("Done\n");
            char buf[100];
            int pid_max = 30000;
            snprintf(buf, sizeof(buf), "%d", pid_max-1);

            printf("Writing pid-1 to ns_last_pid...\n");
            cout<<fd<<"\n";
            if (write(fd, buf, strlen(buf)) != strlen(buf)) {
               cout<<strerror(errno)<<"\n";
               printf("Can't write to buf\n");
               return 1;
            }
        
            printf("Done\n");
        
            printf("Cleaning up...");
            if (flock(fd, LOCK_UN)) {
                printf("Can't unlock");
                }
        
            close(fd);
        
            printf("Done\n");            
                      
            return 0;
        }

person user13145713    schedule 04.09.2020    source источник
comment
Комментарии не для расширенного обсуждения; этот разговор был перенесено в чат.   -  person Samuel Liew♦    schedule 05.09.2020


Ответы (1)


  1. Чтобы программа могла изменять файлы ядра, она должна принадлежать пользователю root.

    sudo chown root program // программа является исполняемым файлом (бинарным)

  2. установите бит setuid в исполняемом файле, чтобы выполнить программу с доступом суперпользователя. при этом он будет работать от имени пользователя root, даже если мы запустим его от имени любого пользователя на нашей машине.

    sudo chmod u+s program

Скомпилируйте исходный код и запустите программу с sudo, чтобы предотвратить другие ошибки доступа к разрешениям.

Спасибо TedLyngmo за предложение этого решения.

person user13145713    schedule 04.09.2020
comment
chmod u+s вообще очень плохая идея, я бы не стал ее советовать. Достаточно запустить программу с sudo, вам не нужно давать никому права запускать ее как root. - person Marco Bonelli; 06.09.2020
comment
@MarcoBonelli Я понимаю, что вы говорите, но это часть проекта, где мне нужно провести много подобных тестов. - person user13145713; 09.09.2020