Фрагмент 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 *target);

Возвращает 0 при успешном завершении и –1 при ошибке

В аргументе target указывается точка монтирования файловой системы, которую следует размонтировать.

В версии Linux 2.2 и более ранних можно идентифицировать файловую систему двумя способами: по точке монтирования или по имени устройства, содержащего эту файловую систему. Начиная с версии ядра 2.4 Linux не допускает использование второго способа, поскольку теперь файловую систему можно смонтировать в нескольких местах, вследствие чего указание файловой системы для аргумента target было бы неоднозначным. Мы подробно объясним этот момент в разделе 14.9.1.

Невозможно размонтировать файловую систему, которая занята — то есть если в файловой системе есть открытые файлы или же текущий рабочий каталог какого-либо процесса расположен где-либо в этой файловой системе. Применение системного вызова umount() к занятой файловой системе приведет к возникновению ошибки EBUSY.

Системный вызов umount2() является расширенной версией системного вызова umount(). Он позволяет более точно управлять работой с помощью аргумента flags.

#include

int umount2(const char *target, int flags);

Возвращает 0 при успешном завершении и –1 при ошибке

Аргумент flags, который является битовой маской, может не содержать значений или состоит из следующих флагов, объединенных операцией ИЛИ:

• MNT_DETACH (начиная с версии Linux 2.4.11) — выполняет «ленивое» размонтирование. Точка монтирования помечается таким образом, чтобы новые процессы не могли иметь доступ к ней, однако те процессы, которые уже используют ее, могут продолжать ее использование. Файловая система фактически размонтируется, когда все процессы прекращают использование точки монтирования.

Перейти на страницу:

Похожие книги