无法写入 /proc/sys/kernel/ns_last_pid 文件
unable to write /proc/sys/kernel/ns_last_pid file
我想编辑 /proc/sys/kernel
中的 ns_last_pid
文件,但出现 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
(先看link)。
Pid_restore(criu.org),
How to set process ID in Linux for a specific program(Whosebug 答案)
编辑 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;
}
对于更改内核文件的程序,它应该属于 root
sudo chown root program
// 程序是可执行文件(二进制文件)
在可执行文件上设置 setuid 位以执行具有超级用户访问权限的程序。
有了这个,即使我们以我们机器上的任何用户身份执行它,它也会 运行 作为 root。
sudo chmod u+s program
编译源代码和运行程序sudo
以防止其他权限访问错误。
感谢 TedLyngmo 提出此解决方案。
我想编辑 /proc/sys/kernel
中的 ns_last_pid
文件,但出现 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
(先看link)。
Pid_restore(criu.org),
How to set process ID in Linux for a specific program(Whosebug 答案)
编辑 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;
}
对于更改内核文件的程序,它应该属于 root
sudo chown root program
// 程序是可执行文件(二进制文件)在可执行文件上设置 setuid 位以执行具有超级用户访问权限的程序。 有了这个,即使我们以我们机器上的任何用户身份执行它,它也会 运行 作为 root。
sudo chmod u+s program
编译源代码和运行程序sudo
以防止其他权限访问错误。
感谢 TedLyngmo 提出此解决方案。