2013-12-19

Linux. Используем файл как файловую систему.

Мучались мы долго с квотированием файловых ресурсов на samba, в итоге пришли к простому решению. Делаем файл ограниченного размера, подключаем его как файловую систему, шарим через самбу. Все, никто никогда за пределы файла не вылезет:

Создаем и монтируем ресурс размером 100М:

dd if=/dev/zero of=/files01/fs/alexsf.fs bs=1024 count=100000
mkfs.ext3 /files01/fs/alexsf.fs
mkdir /files01/mnt/alexsf
mount -t ext3 -o loop /files01/fs/alexsf.fs /files01/mnt/alexsf

Если нужно увеличить размер, например до 300М:

umount -l /files01/mnt/alexsf
dd if=/dev/zero of=/files01/fs/alexsf.fs bs=1 count=0 seek=300M
e2fsck -f /files01/fs/alexsf.fs
resize2fs /files01/fs/alexsf.fs
mount -t ext3 -o loop /files01/fs/alexsf.fs /files01/mnt/alexsf
e2fsck -f /files01/fs/alexsf.fs

Проще в некоторых случаях создать новый файл,  смонтировать и перелить данные, а исходный удалить.

Для монтирования при загрузке, в /etc/fstab добавить

/files01/fs/alexsf.fs   /files01/mnt/alexsf     ext3    acl,user_xattr  1 0

С флагами внимательно, провтыкаете - сервер не загрузится. Если стремно постоянно редактировать fstab, что придется делать на большой файлопомойке, где порядка сотни самбовских шар, можно написать скриптец и запихнуть его в init.d, ну и линки соответственно сделать для вашего уровня выполнения.

Такой вот скрипт:

#! /bin/sh
#
# Copyright (c) 2013 Filippov A.S.
#
# /etc/init.d/mntusersfs
#
### BEGIN INIT INFO
# Provides:          mntusersfs
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network
# Default-Start:    3 5
# Default-Stop:    3 5
# Description:       Mount users filesystems
### END INIT INFO

. /etc/rc.status

rc_reset

case "$1" in
  start)
        echo "Mount users filesystems..."
        mount -v -t ext3 -o loop /files01/fs/a1.ext3 /files01/mnt/a1
        mount -v -t ext3 -o loop /files01/fs/a2.ext3 /files01/mnt/a2
        mount -v -t ext3 -o loop /files01/fs/alexsf.ext3 /files01/mnt/alexsf
        rc_status -v -r
        ;;
    stop)
        echo "Umount users filesystems..."
        umount -l -v /files01/mnt/a1
        umount -l -v /files01/mnt/a2
        umount -l -v /files01/mnt/alexsf
        rc_status -v
        ;;
    status)
        mount -l -t ext3
        ;;
    restart)
        $0 stop
        $0 start
        rc_status
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac

rc_exit

В этом случае при провтыке в скрипте он просто не отработает целиком. Ошибки легче исправлять на живой системе :)

А вот так ставим на автозагрузку:

chkconfig mntusersfs on

Спустя пять дней закончились loop devices. Сейчас делаю так(номер loop увеличиваю при создании новой ФС)

dd if=/dev/zero of=/files01/userfs/admsektor.ext3 bs=1024 count=2048000
mkfs.ext3 /files01/userfs/admsektor.ext3
mkdir /files01/usermnt/admsektor
mknod -m 660 /dev/loop8 b 7 8
mount -t ext3 -o loop /files01/userfs/admsektor.ext3 /files01/usermnt/admsektor
mkdir /files01/usermnt/admsektor/admsektor
chmod 777 /files01/usermnt/admsektor/admsektor
tune2fs -m 1 /dev/loop8
tune2fs -r 1 /dev/loop8

Комментариев нет: