không thể ghi tệp / proc / sys / kernel / ns_last_pid
Tôi muốn chỉnh sửa ns_last_pidtệp có trong /proc/sys/kernel, nhưng tôi gặp lỗi Read-only file system. Làm thế nào để giải quyết điều này? Đây là những gì tôi đã viết để mở tệp.
int fd = open("/proc/sys/kernel/ns_last_pid", O_RDWR | O_CREAT, 0644);
if (fd < 0) {
cout<<strerror(errno)<<"\n";
return 1;
}
Tôi phải viết tệp này, thay đổi giá trị của nó. Tệp này chứa một số duy nhất in lại pid cuối cùng được phân bổ cho bất kỳ quá trình nào. Tôi đã chỉnh sửa điều này để tôi có thể nhận được số pid mong muốn cho một quá trình. như những người này đang làm cho dự án của họ CRIU(xem liên kết đầu tiên).
Pid_restore (criu.org),
Cách đặt ID tiến trình trong Linux cho một chương trình cụ thể (câu trả lời stackoverflow)
CHỈNH SỬA 1: Ví dụ nhỏ nhất có thể tái tạo
#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;
}
Trả lời
Đối với một chương trình để thay đổi tệp hạt nhân, nó phải được sở hữu bởi root
sudo chown root program// chương trình là tệp thực thi (nhị phân)đặt bit setuid trên tệp thi hành để thực thi chương trình có quyền truy cập siêu người dùng. với điều này, nó sẽ chạy dưới dạng root ngay cả khi chúng tôi thực thi nó với tư cách là bất kỳ người dùng nào trên máy của chúng tôi.
sudo chmod u+s program
Biên dịch mã nguồn và chạy chương trình với sudođể tránh các lỗi truy cập quyền khác.
Cảm ơn TedLyngmo đã đề xuất giải pháp này.