다른 옵션을 변경하지 않고 읽기 전용으로 다시 마운트

다른 옵션을 변경하지 않고 읽기 전용으로 다시 마운트

직장에서는 파일 시스템을 읽기 전용으로 다시 마운트하는 systemd-shutdown데 사용됩니다 .mount()

/* MS_REMOUNT requires that the data parameter
 * should be the same from the original mount
 * except for the desired changes. Since we want
 * to remount read-only, we should filter out
 * rw (and ro too, because it confuses the kernel) */
...filter_options(m->options, "rw\0ro\0", NULL, NULL, &options);

...mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, options)...

strace mount -oremount,rw /boot그런데 살펴 보니 mount시스템 호출의 마지막 매개변수로 NULL이 전달되었습니다. 이는 이전 옵션 문자열을 복사하고 수정하는 것이 실제로 필요하지 않음을 의미합니까?

답변1

아니요.

/etc/fstab제네릭이 아닌 옵션을 편집하고 추가하면 foo" /sbin/mountfoo"가 마지막 인수로 전달됩니다 mount(). 귀하의 예에서는 NULL을 전달하지만 이는 빈 문자열을 의미한다고 가정합니다 "". 아마도 그들은 동일한 효과를 가지고 있을 것입니다.


/sbin/mount경로와 장치를 모두 전달하면 분명히 동작이 달라집니다(!).

다시 마운트 기능은 fstab의 옵션과 함께 mount 명령을 사용하는 표준 방법을 따릅니다. 이는 device와 dir이 모두 지정된 경우에만 mount가 fstab(또는 mtab)을 읽지 않음을 의미합니다.

 mount -o remount,rw /dev/foo /dir

이 호출 후에는 모든 이전 마운트 옵션이 교체되고, mount 명령에 의해 내부적으로 생성되고 유지되는 Loop= 옵션을 제외하고 fstab(또는 mtab)의 모든 항목이 무시됩니다.

 mount -o remount,rw  /dir

이 호출 후 mount는 fstab을 읽고 옵션을 명령줄(-o)의 옵션과 병합합니다. fstab에서 마운트 지점을 찾을 수 없는 경우 지정되지 않은 소스에서 다시 마운트할 수 있습니다.

이는 마지막 경우가 마운트 지점에 대한 현재 옵션을 재정의하는 것으로 보인다는 의미입니다.


질문에 언급된 코드에 뭔가 수상한 점이 있습니다. 설치 플래그를 재설정하는 것 같습니다. 현재 동작:

기존 설치 다시 설치

... mountflags 및 데이터 매개변수는 의도적으로 변경된 매개변수를 제외하고 원래 mount() 호출에 사용된 값과 일치해야 합니다.

그래서 아마 그 댓글이 여기에서 나온 것 같아요.

MS_LAZYTIME, MS_MANDLOCK, MS_NOATIME, MS_NODEV, MS_NODIRATIME, MS_NOEXEC, MS_NOSUID, MS_RELATIME, MS_RDONLY 및 MS_SYNCHRONOUS 설치 플래그를 변경할 수 있습니다.

코드는 다음과 같습니다.지금잘 작동합니다. 읽기 전용으로 다시 마운트하면 후속 쓰기 문제 또는 blockdev가 읽기 전용이기 때문에 읽기-쓰기 다시 마운트가 거부되는 문제를 방지할 수 있습니다. systemd-shutdown이 시점에서 SIGKILL은 파일 시스템에 액세스할 수 있는 다른 프로세스로 전송되어야 하므로 NOEXEC와 같은 보안 옵션을 무시할 수 있습니다.

재설치 중에 MS_DIRSYNC 플래그 설정을 변경하려는 시도는 자동으로 무시됩니다.

이는 다른 플래그가 자동으로 무시되지 않고 일치하지 않으면 호출이 실패할 수 있음을 의미하지만 핵심 커널 코드는 그런 작업을 수행하지 않는다고 생각합니다.

Linux 3.17부터 MS_NOATIME, MS_NODIRATIME, MS_RELATIME 또는 MS_STRICTATIME 중 하나라도 mountflags에 지정되지 않은 경우 다시 마운트 작업은 MS_RELATIME을 기본값으로 설정하는 대신 이러한 플래그의 기존 값을 유지합니다.

Linux 2.6.26부터 이 플래그는 mountflags를 읽기 전용으로 지정하여 기존 바인드 마운트를 읽기 전용으로 만들 수도 있습니다.

MS_REMOUNT | MS_BIND | MS_RDONLY

systemd-shutdown이 fstab을 정확히 같은 방식으로 처리하지 않는 것은 괜찮은 것 같습니다 mount -oremount,ro /boot:). (이전 sysvinit 스크립트는 루트 파일 시스템을 제외하고 RO를 다시 마운트하지 않기 때문에 적어도 Debian에서는 괜찮습니다.)

관련 정보