Фрагмент ro в строке, отображаемой из файла /proc/mounts, указывает на то, что монтирование выполнено только для чтения.
Наконец, мы перемещаем точку монтирования в новое местоположение внутри иерархии каталога:
# mkdir /demo
# ./t_mount — f m /testfs /demo
# cat /proc/mounts | grep sda12
/dev/sda12 /demo ext3 ro 0
Листинг 14.1. Использование системного вызова mount()
filesys/t_mount.c
#include
#include "tlpi_hdr.h"
static void
usageError(const char *progName, const char *msg)
{
if (msg!= NULL)
fprintf(stderr, "%s", msg);
fprintf(stderr, "Usage: %s [options] source target\n\n", progName);
fprintf(stderr, "Available options: \n");
#define fpe(str) fprintf(stderr, " " str) /* Короче! */
fpe("-t fstype [e.g., 'ext2' or 'reiserfs']\n");
fpe("-o data [file system-dependent options,\n");
fpe(" e.g., 'bsdgroups' for ext2]\n");
fpe("-f mountflags can include any of: \n");
#define fpe2(str) fprintf(stderr, " " str)
fpe2("b — MS_BIND create a bind mount\n");
fpe2("d — MS_DIRSYNC synchronous directory updates\n");
fpe2("l — MS_MANDLOCK permit mandatory locking\n");
fpe2("m — MS_MOVE atomically move subtree\n");
fpe2("A — MS_NOATIME don't update atime (last access time)\n");
fpe2("V — MS_NODEV don't permit device access\n");
fpe2("D — MS_NODIRATIME don't update atime on directories\n");
fpe2("E — MS_NOEXEC don't allow executables\n");
fpe2("S — MS_NOSUID disable set-user/group-ID programs\n");
fpe2("r — MS_RDONLY read-only mount\n");
fpe2("c — MS_REC recursive mount\n");
fpe2("R — MS_REMOUNT remount\n");
fpe2("s — MS_SYNCHRONOUS make writes synchronous\n");
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
unsigned long flags;
char *data, *fstype;
int j, opt;
flags = 0;
data = NULL;
fstype = NULL;
while ((opt = getopt(argc, argv, "o: t: f: "))!= -1) {
switch (opt) {
case 'o':
data = optarg;
break;
case 't':
fstype = optarg;
break;
case 'f':
for (j = 0; j < strlen(optarg); j++) {
switch (optarg[j]) {
case 'b': flags |= MS_BIND; break;
case 'd': flags |= MS_DIRSYNC; break;
case 'l': flags |= MS_MANDLOCK; break;
case 'm': flags |= MS_MOVE; break;
case 'A': flags |= MS_NOATIME; break;
case 'V': flags |= MS_NODEV; break;
case 'D': flags |= MS_NODIRATIME; break;
case 'E': flags |= MS_NOEXEC; break;
case 'S': flags |= MS_NOSUID; break;
case 'r': flags |= MS_RDONLY; break;
case 'c': flags |= MS_REC; break;
case 'R': flags |= MS_REMOUNT; break;
case 's': flags |= MS_SYNCHRONOUS; break;
default: usageError(argv[0], NULL);
}
}
break;
default: usageError(argv[0], NULL);
}
}
if (argc!= optind + 2)
usageError(argv[0], "Wrong number of arguments\n");
if (mount(argv[optind], argv[optind + 1], fstype, flags, data) == -1)
errExit("mount");
exit(EXIT_SUCCESS);
}
filesys/t_mount.c
14.8.2. Размонтирование файловой системы: системные вызовы umount() и umount2()
Системный вызов umount() размонтирует смонтированную файловую систему.
#include
int umount(const char *
Возвращает 0 при успешном завершении и –1 при ошибке
В аргументе target указывается точка монтирования файловой системы, которую следует размонтировать.
В версии Linux 2.2 и более ранних можно идентифицировать файловую систему двумя способами: по точке монтирования или по имени устройства, содержащего эту файловую систему. Начиная с версии ядра 2.4 Linux не допускает использование второго способа, поскольку теперь файловую систему можно смонтировать в нескольких местах, вследствие чего указание файловой системы для аргумента target было бы неоднозначным. Мы подробно объясним этот момент в разделе 14.9.1.
Невозможно размонтировать файловую систему, которая
Системный вызов umount2() является расширенной версией системного вызова umount(). Он позволяет более точно управлять работой с помощью аргумента flags.
#include
int umount2(const char *
Возвращает 0 при успешном завершении и –1 при ошибке
Аргумент flags, который является битовой маской, может не содержать значений или состоит из следующих флагов, объединенных операцией ИЛИ:
• MNT_DETACH (начиная с версии Linux 2.4.11) — выполняет «ленивое» размонтирование. Точка монтирования помечается таким образом, чтобы новые процессы не могли иметь доступ к ней, однако те процессы, которые уже используют ее, могут продолжать ее использование. Файловая система фактически размонтируется, когда все процессы прекращают использование точки монтирования.