Позволяет (не позволяет) монтировать данную файловую систему любому пользователю. Это полезно для CD-ROM; даже если вы находитесь на рабочей станции с одним пользователем, удобно не переключаться на root
просто для монтирования CD. Демонтировать файловую систему может лишь пользователь, который смонтировал ее. user
предполагает наличие опций noexec
, nosuid
и nodev
.
suid
, nosuid
Поддерживает (не поддерживает) биты setuid
и setgid
исполняемых файлов в файловой системе.
rw
Монтирует файловую систему в режиме для чтения/записи.
Опции nodev
, noexec
и nosuid
особенно ценны для безопасности на файловых системах гибких дисков и CD-ROM. Рассмотрите студенческую среду, в которой студентам разрешено монтировать собственные гибкие диски или CD. Тривиально смастерить для жесткого диска файловую систему с оболочкой setuid-root или с файлом устройства с разрешением записи для всех, которая позволила бы предприимчивому пользователю изменить права доступа к системным файлам.
У каждой файловой системы есть специфичные для нее опции. Важной опцией для ext2
и ext3
является grpid
. Мы отложим обсуждение этой опции до раздела 11.5.1 «Группа по умолчанию для новых файлов и каталогов». Подробности для всех поддерживаемых файловых систем можно найти в справочной странице
В качестве конкретного примера вернемся к строчке для раздела Windows в нашей системе:
# device mount-point type options freq passno
/dev/hda1 /win vfat noauto,defaults,user,uid=2076,gid=10 0 0
Опция noauto
предотвращает монтирование раздела Windows при загрузке. Опция defaults
та же самая, что rw
, suid
, dev
, exec
, async
. Опция user
позволяет нам монтировать файловую систему, не будучи root
. Опции uid=
и gid=
делает файлы в /win
принадлежащими нам, так что нам не нужно иметь права root
при работе с этим разделом.
8.2.2. Работа со смонтированными файловыми системами: getmntent()
Любой из файлов /etc/fstab
, /etc/mtab
и /proc/mounts
может быть прочитан программное использованием набора процедур getmntent()
:
#include
#include
FILE *setmntent(const char *filename, const char *type);
struct mntent *getmntent(FILE *filep);
int addmntent(FILE *filep, const struct mntent *mnt);
int endmntent(FILE *filep);
char *hasmntopt(const struct mntent *mnt, const char *opt);
setmntent()
открывает файл, содержащий элементы точек монтирования. Аргумент filename
является файлом, который должен быть открыт. Аргумент type
похож на второй аргумент fopen()
, указывая доступ для чтения, записи или чтения/записи. (Рассмотрите команду mount
, которой приходится добавлять элемент к /etc/mtab
для каждой файловой системы, которую она монтирует, и umount
, которая должна удалять этот элемент.) Затем возвращаемое значение типа FILE*
используется с оставшимися процедурами.
getmntent()
читает файл, возвращая указатель на static struct mntent
, которая заполнена соответствующими значениями. Это статическое хранилище переписывается при каждом вызове. Когда больше не осталось элементов, она возвращает NULL
. (Это сходно с процедурами для чтения файлов паролей и групп; см раздел 6.3 «Имена пользователей и групп».)
addmntent()
вызывается для добавления сведений в конец открытого файла, она предназначена для использования функцией mount
.
endmntent()
закрывает открытый файл; вызывайте ее после завершения обработки. fclose()
; может потребоваться очистить другие внутренние структуры данных, связанные с переменной FILE*
.
hasmntopt()
является более специализированной функцией. Она просматривает struct mntent
, переданную в качестве первого параметра, в поисках опции mount
, совпадающей со вторым аргументом. Если опция найдена, она возвращает адрес совпадающей подстроки. В противном случае возвращается NULL
.
Поля в struct mntent
непосредственно соответствуют полям в файле /etc/fstab
. Структура выглядит следующим образом:
struct mntent {
char *mnt_fsname; /* Устройство или сервер для файл. С-мы. */
char *mnt_dir; /* Каталог для монтирования. */
char *mnt_type; /* Тип файловой системы: ufs, nfs и т.д. */
char *mnt_opts; /* Отделяемые запятыми опции для fs. */