LINUX.ORG.RU
ФорумAdmin

Скрипт на Altlinux

 


0

1

Файловый сервер samba, работающий по протоколу cifs. Он должен предоставлять доступ к файловой системе, смонтированной из файла на диске. Независимо от заявленного размера файловой системы файл, который её содержит, должен занимать ровно столько места на диске, сколько файловая система занимает фактически. Например, один мегабайт. Запуск файлового сервера может происходить только в том случае, если файловая система смонтирована в нужный каталог. То есть, при попытке запуска файлового сервера происходит попытка монтирования файловой системы. В случае неудачного завершения попытки монтирования запуск файлового сервера не происходит. И наоборот — при попытке отмонтирования файловой системы происходит попытка останова файлового сервера. В случае неудачного останова отмонтирование файловой системы не выполняется. Что смог:

#!/bin/sh   
cd /mnt
if [ ! -d samba ]; then
mkdir -p samba
fi
cd /opt
fallocate -l 1GB file_1gb
mkfs.ext4 file_1gb >> /dev/null 2>&1
mount /opt/file_1gb /mnt/samba
if [ $? -ne 1 ]; then
systemctl start smb
elif [ $? -ne 0 ]; then
systemctl stop smb
exit 1
fi
Но это не правильно как мне кажется - незнаю как начать проверку того что - при включении samba должно начинаться монтирование в нужную папку, если не туда то не запускается сервер!!!



Последнее исправление: frost114 (всего исправлений: 2)
Ответ на: комментарий от AS

Дополнение к этому коду бы, а то не понятно как эти условия соблюдать - когда при запуске сервера сначала должна правильно примонтироваться файловая система

frost114
() автор топика
Ответ на: комментарий от frost114

Как минимум, убедиться, что samba не запускается при загрузке сервера. Вообще, этот файл как должен удаляться? При остановке всегда, или только стираться при попытке запуска? А то, может, вовсе tmpfs задействовать? Ещё можно парсить вывод mount и/или df.

AS ★★★★★
()
Ответ на: комментарий от frost114

не понятно как эти условия соблюдать

Монтировать файловую систему. если mount завершается успехом, то он возвращает 0. При ошибке возвращается число (код ошибки) отличное от 0.

Как уже писал AS можно парсить вывод mount (пример

ismount=`mount|grep <filename-samba-image>`
если вернет пустую строку — монтирование не удалось). Парсить вывод df на наличие точки монтирования. Убедились, что файловая система примонтирована запускайте сервер.

сначала должна правильно примонтироваться файловая система

Проблема с mount файловой системы из файла?

anymouze ★★
()

Мам смотри я без скриптов!

# /etc/systemd/system/mnt-samba-create.service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/fallocate -l 1GB /opt/file_1gb
ExecStart=/sbin/mkfs.ext4 /opt/file_1gb
ExecStop=/bin/rm /opt/file_1gb
# /etc/systemd/system/mnt-samba.mount
[Unit]
Requires=mnt-samba-create.service
After=mnt-samba-create.service

[Mount]
What=/opt/file_1gb
Where=/mnt/samba
Type=ext4
# /etc/systemd/system/smb.service.d/override.conf
[Unit]
Requires=mnt-samba.mount
After=mnt-samba.mount
gasinvein ★★★
()
Последнее исправление: gasinvein (всего исправлений: 1)
Ответ на: комментарий от AS

А что, разве не просто? Человекочитаемое декларативное описание.
К тому же, оно надёжно и однозначно делает именно то, что ТС хочет. В отличие от его скрипта.

gasinvein ★★★
()
Последнее исправление: gasinvein (всего исправлений: 1)
Ответ на: комментарий от gasinvein

К тому же, оно надёжно

Вот в этом месте с systemd мне всегда смешно.

AS ★★★★★
()
Ответ на: комментарий от anymouze

Надо как то сделать, что бы запуск файлового сервера инициировал запуск монтирования и в случае удачного монтирования запустить сервер. А не сначала смотировать, а потом запустить сервер, если смонтируется в нужное место.

frost114
() автор топика
Ответ на: комментарий от frost114

Надо как то сделать

Это на столько легко, что это просто учебный начальный уровень написания скрипта на bash. Потому вряд ли кто-то что-то скажет больше, чем уже сказано. Остальное - в job.

Но вот вопрос: а зачем оно так надо вообще?

AS ★★★★★
()
Ответ на: комментарий от frost114

запуск файлового сервера

Если нужно systemd, то я вряд ли что-то толковое подскажу. Смотрите

Я предполагал запуск файлового сервера скриптом. Алгоритм такой:

Старт_скрипта "Старт файлового сервера"
1. монтируем файловую систему для файлового сервера
2. если смонтировали, то запустить файловый сервер
   иначе финиш
Финиш_скрипта

Ваш скрипт так и должен делать.По коду Вашего скрипта мне не понятно это — остановить сервер, если монтирование не удалось — но ведь на тот момент ещё не запущен. Или (что)?

Мой вариант:

#!/bin/sh
#
fallocate -l 1GB /opt/file_1gb
mkfs.ext4 /opt/file_1gb >> /dev/null 2>&1
mkdir -p /mnt/samba
mount /opt/file_1gb /mnt/samba
if [ $? -eq 0 ]; then
  systemctl start smb
  exit 0 // Ok
else
  exit 1 // ERROR: no start server
fi

Ваше условие противоречиво

запуск файлового сервера инициировал запуск монтирования
в случае удачного монтирования запустить сервер

может Вам нужен systemd?

По завершению работы файлового сервера.

при попытке отмонтирования файловой системы происходит попытка останова файлового сервера.

Пока файловый сервер работает файловая система будет «занята» и отмонтировать её не получится (или сервер «упадёт»).

anymouze ★★
()
Ответ на: комментарий от anc

т.е. при работе файлового сервера можно с «его файловой системой» делать что угодно? (я спрашиваю, а не спорю — как-то не было необходимости изучать этот вопрос в таком варианте) И что будет, если отмонтировать (как у ТС) «файловую систему»? (на самостоятельные эксперименты

сейчас не могу)

anymouze ★★
()
Ответ на: запуск файлового сервера от anymouze

Нет systemd не нужен, именно на shell надо сделать. Задание скопировал как оно есть. Вот сам попробовал, но не уверен, что так оно должно быть:

MONIT=/mnt/samba
KATALOG=/opt/mksf1
if [ ! -d $KATALOG ]; then
mkdir $KATALOG >/dev/null 2>&1
cd $KATALOG
fallocate -l 1MB file_1mb
mkfs.ext4 file_1mb >/dev/null 2>&1
echo "Создан mkfs1 каталог с файлом"
else 
echo "Каталог с файлом уже есть"
fi
if [ ! -d $MONIT ]; then
mkdir $MONIT
fi
if mount /opt/mkfs1/file_1mb /mnt/samba; then
systemctl start smb
echo "Монтирование удачно"
else
echo "Мщнтирование не удалось"
systemctl stop smb
fi

Как теперь вторую часть сделать, с отмонтированием где?

frost114
() автор топика
Ответ на: комментарий от anymouze

Если она не занята кем-то (в смысле кемто из подключенных к шаре пользователей) то конечно можно. Сам сервер ничего не «занимает» да как бэ и не должен, да и было бы странным подобное поведение. Даже винда до таких «высот» еще не дошла :).

И что будет, если отмонтировать (как у ТС) «файловую систему»?

А получиться что будет другой каталог т.е. mountpoint. И если есть в него права на запись для подключившегося пользователя то он туда может чегонибудь «поназаписать».

anc ★★★★★
()
Ответ на: комментарий от anc

Если она не занята кем-то (в смысле кемто из подключенных к шаре пользователей)

Ну я «где-то рядом» имел ввиду, но написал «то что написал» :(

будет другой каталог т.е. mountpoint

Да согласен. Эта мысль меня посетила уже после печати комментария. Конечно, можно ещё «тут копать» — будут проблемы или нет, и т.д. Но в постановке задачи (как мне теперь кажется) это лишнее...

anymouze ★★
()
Ответ на: комментарий от anymouze

Но в постановке задачи (как мне теперь кажется) это лишнее...

Постановка задачи настолько кривая, что не до конца понятно что же хочет ТС на самом деле.

anc ★★★★★
()
Ответ на: комментарий от frost114

В целом неплохо, на мой взгляд. Но Вы как-то проверяете работу скрипта? Вот 1-е место, что меня смущает:

if mount /opt/mkfs1/file_1mb /mnt/samba; then

(я про отсутствие [ ])

2-е место это остановка незапущенного сервера (ошибку возвращает и сообщение о ней):

systemctl stop smb

А получить разъяснения по заданию возможно? И есть какие-то условия (требования) к коду скрипта? Сообщения об ошибках от команд в скрипте допускаются?

«Вредный совет» (если я ошибаюсь, поправьте пожалуйста)

Если принять замечание от anc-- что наличие(отсутствие) файловой системы на работу сервера не влияет, то можно первой командой запустить файловый сервер. Затем выполнить остальной Ваш код (только я бы тогда заменил

if mount /opt/mkfs1/file_1mb /mnt/samba; then
systemctl start smb
на
if mount /opt/mkfs1/file_1mb /mnt/samba; then
systemctl restart smb
).

anymouze ★★
()
Ответ на: комментарий от anc

Абсолютно согласен. Самое скверное, что и ТС похоже не совсем понимает что как требуется выполнять задание.

P.S. Вспомнилась задачка из курса (информатики или программирования — точно уже не скажу): «Написать программу для сортировки чисел на чётные и нечётные». И к ней ряд чисел: 1.23 2.45 3.22 ...

и ведь решали...

anymouze ★★
()
Ответ на: комментарий от frost114

запуск файлового сервера инициировал запуск монтирования

Тогда делай, как я предложил.

Если нужно именно на баше (что было бы странно и глупо), тогда остаётся только править инитскрипт самбы. Который, скорее всего, и сам тоже systemd-юнит.

gasinvein ★★★
()
Последнее исправление: gasinvein (всего исправлений: 1)
Ответ на: комментарий от anymouze

В целом неплохо, на мой взгляд. Но Вы как-то проверяете работу скрипта? Вот 1-е место, что меня смущает:

if mount /opt/mkfs1/file_1mb /mnt/samba; then
Тут как раз ноль смущения. Это не test

Вас не смутило другое?

if [ ! -d $KATALOG ]; then
else
echo «Каталог с файлом уже есть»

Каталог конечно может и есть, а вот наличие файла не гарантируем.

Ну и еще по мелочи.

anc ★★★★★
()
Ответ на: комментарий от anc

да-да в глаза бросается. я проигнорировал потому, что основное условие это монтирование файла. А так: любая команда (создать файл, создать в нём ФС) может завершится ошибкой и это не проверяется :(

anymouze ★★
()
Ответ на: комментарий от anymouze

Поясню Квадратные скобочки - это «аналог» test, так что у ТС в данном случае как раз все норм. Вот все остальное можно долго и нудно обсуждать, но в целом «почти» «верно» для начального этапа. :)

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 2)
Ответ на: комментарий от anymouze

Самое скверное что это задание, которое никакого отношения не имеет к реализации в жизни. Это тупо задание написать скрип, что б он делал вот то, что я написал в заголовке темы. Никакие файлы самбы даже трогать не надо. Тестировать его надо будет на абсолютно чистой машине, где чисто будет установлена только samba. Даже больше скажу, задание сами разработчики альта дали.

frost114
() автор топика
Ответ на: комментарий от frost114

Пусть определятся, чего им хочется:

  • стартовать файловый сервер, создавать директории, создавать файл, создавать в файле ФС, монтировать этот файл. Если смонтировалось (пере)запускать файловый сервер, если нет останавливать файловый сервер
  • создавать директории, создавать файл, создавать в файле ФС, монтировать этот файл. Если смонтировалось запускать файловый сервер
  • ...

Короче требуйте с них «техническое задание». Или у них это такой «вступительный экзамен»? Тогда пишите «нормальный» скрипт — создать директорию, в ней файл, в файле ФС, создать точку монтирования, примонтировать ФС, запустить samba. И проверки не стеснятесь выполнять. Любая команда может завершится неудачей.

И наоборот — при попытке отмонтирования файловой системы происходит попытка останова файлового сервера. В случае неудачного останова отмонтирование файловой системы не выполняется.

Я понял так, что

if systemctl stop smb; then
         umount /mnt/samba
fi

P.S.

А нужно 2 скрипта или в один «соединить»?

anymouze ★★
()
Ответ на: комментарий от anymouze

Нужно все в одном это сделать, при том это только первый скрипт, там еще есть 2 часть задания - там еще сложнее

frost114
() автор топика
Ответ на: комментарий от frost114

Напиши два юнита на systemd, первый - монтирование файловой системы, второй - запуск файлового сервера.

Пропиши юнит монтирования файловой системы как зависимость запуска файлового сервера.

Далее просто запускай юнит файлового сервера, он по зависимости вызовет юнит монтирования файловой системы и если файловая система смонтируется, то запустится сам.

Можно попробовать модифицировать уже существующий юнит запуска файлового сервера.

anonymous
()
Ответ на: комментарий от frost114

Ну так бы сразу и сказал: студент, дали задание написать скрипт на bash, я не знаю как, т.к. не слушал преподавателя.

Ну что же, вперёд на доп занятия.

Либо пиши сколько готов заплатить за помощь форума.

anonymous
()
Ответ на: комментарий от frost114

Сколько книг не смотрел

примеров маловато в них

В общем «хороших» не знаю, плохие советовать не стану. Могу советовать только «поиск» и «практику». Вот официальный (?) мануал

Книги только знакомят с синтаксисом, операторами, конструкциями (циклов, выбора, ...). Все остальное постигается через практику (собственно зачем Вам и дают задания)

anymouze ★★
()
Ответ на: комментарий от gasinvein

Человекочитаемое декларативное описание.

Чёт попалось...

[Service]
User=news
PermissionsStartOnly=true
PIDFile=/run/news/innd.pid
Type=forking
ExecStart=/usr/libexec/news/rc.news
ExecStop=/bin/su -m  news -c '/usr/libexec/news/rc.news stop'
KillMode=control-group

Это вот Exec... rc.news выглядит эпично. :-)

AS ★★★★★
()
Ответ на: комментарий от AS

Не очень понимаю, зачем тут PermissionsStartOnly - нет же никаких Pre/Post операций. А без PermissionsStartOnly и обёртка с su не нужна.

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Не очень понимаю, зачем тут PermissionsStartOnly

Мне больше понравился rc.news, который на sh, и 4500b примерно.

AS ★★★★★
()
Ответ на: комментарий от AS

Я вижу, ты на что-то намекаешь, но не понимаю, на что.

gasinvein ★★★
()
Ответ на: комментарий от frost114

Никак не запускать, в последнем блоке (/etc/systemd/system/smb.service.d/override.conf) мы добавили юниту самбы smb.service зависимость от нашего юнита mnt-samba.mount, и теперь оно будет запускаться автоматически при запуске самбы.
Если хочешь запустить руками напрямую - запускай mnt-samba.mount.

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Ясно, просто автомонтирование в этом случае не нужно, поэтому без последнего блока сделал. Все равно правда надо как то подделать его щас, а то не совсем соответствует ( в случае неудачного монтирования служба не запускается надо как то реализовать), а там еще и вторая часть где выключение службы тоже надо будет как то.

frost114
() автор топика
Ответ на: комментарий от frost114

в случае неудачного монтирования служба не запускается надо как то реализовать

Директива Requires=mnt-samba.mount именно это и делает.

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Я правильно понимаю, что первая часть с названием mnt-samba-create.service определяет когда запускать, а когда останавливать службу samba. И если в ExecStart указать файл скрипта, где будут условия на запуск, а в ExecStop на останов сервера и отмонтирование, то он будет проверять эти скрипты и уже вычислять что делать со службой. Или не так работает.

frost114
() автор топика
Ответ на: комментарий от frost114

определяет когда запускать, а когда останавливать службу samba

Не понял, что ты имеешь в виду, но попробую объяснить.
Первый блок, юнит mnt-samba-create.service, создаёт файл и ФС в нём.
Второй блок, mnt-samba.mount, просто задёт точку монтирования, эквивалент записи в fstab. Но она зависит от первого юнита, т.к. чтобы примонтировать файл, нам надо сперва его создать.
А в третьем блоке мы просто делаем юнит smd.service (службу самбы) зависимым от нашей точки монтирования, т.е. перед запускам самбы systemd будет запускать точку монтирования, которая будет запускать создание файла-контейнера.

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Т.е. надо будет запустить smb.service, которой автоматом запустит 2 других сценария. И последний сценарий является как бы службой samba, типо введя ./smb.service мы вводим systemctl start smb и начают выполняться 2 первых сценария, а затем в случае успеха запускается служба?

frost114
() автор топика
Ответ на: комментарий от frost114

Блин, ничего не надо никуда вводить, и это не сценарии, а файлы описания юнитов systemd. Если ты создашь эти три файла (и перезагрузишься или выполнишь systemctl daemon-reload), то при запуске самбы (так, как обычно, systemctl start smb), у тебя будет создаваться и монтироваться файл с ФС.
Ты впервые с линуксом работаешь что ли?

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

А кто ж знал то, зарегался месяц где то назад, теперь будем знать

frost114
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.