LINUX.ORG.RU

Альтернатива fstab

 , ,


0

1

Возникла потребность заменить стандартный механизм монтирования разделов через /etc/fstab при загрузке своим костылём (причина - парсить и менять записи в fstab из скрипта очень уж неудобно).

Куда копать вообще, что почитать?



Последнее исправление: FRCTLL (всего исправлений: 1)

Есть rc.local или аналог, всё зависит от вашего дистрибутива и системы инициализации.

Ну и чем же оно не удобно ?

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

rc.local или аналог

Оно же выполняется почти на самом последнем этапе загрузки, так что не пойдёт.

Ну и чем же оно не удобно ?

Чем оно удобно?

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

Чем оно удобно?

Тем, что там есть все, что нужно для монтирования. И почти ничего лишнего. И очень удобно для парсинга, ибо сделано в виде таблицы.

Пример задачи, когда оно не удобно?

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

Оно же выполняется почти на самом последнем этапе загрузки, так что не пойдёт.

А что вы хотите в ваш велосипед выносить монтирование системных частей (/var, /usr, прочее) файловой системы ? Напишите свой сценарий и поместите на тот уровень запуска (очерёдность), который нужно.

Чем оно удобно?

Ну так и напишите, что вы не осилили реализовать ваш мега скрипт по редактированию /etc/fstab, хотя я смысла в регулярном редактировании /etc/fstab не вижу.

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

Мне надо из скрипта менять определённый участок в предпоследнем столбце. Проблема в том, что определённый он только с одной стороны, а то, что идёт после этого участка, может быть любым.

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

А что вы хотите в ваш велосипед выносить монтирование системных частей (/var, /usr, прочее) файловой системы ?

Это трудно было понять?

Ну так и напишите, что вы не осилили

Я не осилил.

я смысла в регулярном редактировании /etc/ftab не вижу

Поздравляю. Можешь быть свободен.

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

Проблема в том, что определённый он только с одной стороны, а то, что идёт после этого участка, может быть любым.

С fstab это делается в одну минуту. Давай конкретный пример, нарисую тебе однострочник.

Kroz ★★★★★
()

Тебе кто-то запрещает сделать по аналогии? Или вообще свой велосипед напиши и запускай его из того же systemd.

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

Ну например строка:

/dev/sda2		/			btrfs		noatime,ssd_spread,discard,compress=lzo,space_cache,subvol=root/orig	0 0

Нужно менять root/orig на указанную переменную.

Можно даже облегчить условие - допустить, что subvol=$VOLUME будет всегда на последнем месте, перед табуляцией и цифрами 0 0

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

Это трудно было понять?

Так не делают. Если у тебя systemd, то для его работы нужно, что бы /usr был примонтирован уже при смене корня с intitrd, поэтому сценарий init разбирает /etc/fstab на корневом разделе и делает помимо монтирования корня так же и монтировние /usr, а если у тебя в /etc/fstab не будет записи о /usr, то как следствие /usr не будет примонтирован и твоя система c systemd не запустится.

Я не осилил.

Можешь написать скрипт генерации /etc/fstab, хотя бы простым:

ROOT_OPTS="defaults,rw"
USR_OPTS="defaults,rw"
VAT_OPTS="defaults,rw"
echo "/dev/root / <type_fs> $ROOT_OPTS <dump/pass>" > /etc/fstab
echo "/dev/usr /usr <type_fs> $USR_OPTS <dump/pass>" >> /etc/fstab
echo "/dev/var /var <type_fs> $VAR_OPTS <dump/pass>" >> /etc/fstab

В таком случае можешь просто менять значения переменных, в которых указаны опции монтирования.

Поздравляю. Можешь быть свободен.

И тебе желаю того же, при чём целиком от Linux.

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

Так не делают

Пусть не делают, я-то причём?

Можешь написать скрипт генерации /etc/fstab

Это ничем не отличается от задачи смены участка строки в fstab.

И тебе желаю того же, при чём целиком от Linux

Нажми кнопку «Игнорировать» и не плачь больше.

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

Это ничем не отличается от задачи смены участка строки в fstab.

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

Пишу с планшета, так что проверить нет возможности. Примерно так:

echo "та твоя строка" | sed s/subvol=root\/orig/subvol=root\/another/p
Меняет orig на another. То, что нужно?

Прийду домой напишу поосновательней. Хотя, думаю, до того времени уже кто-то подскажет: задача тривиальная.

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

echo «та твоя строка» | sed s/subvol=root\/orig/subvol=root\/another/p

А если там не root/orig будет? Нужно чтобы менялось то, что стоит между subvol= и табуляцией.

Меняет orig на another. То, что нужно?

Нет, надо менять полностью root/orig, но всё равно спасибо.

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

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

Пусть не делают, я-то причём?

Ты вообще понял что я тебе написал про systemd ?

Это ничем не отличается от задачи смены участка строки в fstab.

Ну тогда напиши разбор каждой строки в /etc/fstab на устройство, точку монтирования, тип файловой системы, опции монтирования и dump/pass.

Т.к. в опциях монтирования все параметры перечислены через запятую легко можно строку разрезать на список параметров со значениями, применяя в качестве разделителя запятую, потом просто перебираешь каждый элемент списка и находишь в нём subvol=root/orig, меняешь значение после равно, это всё так же легко делается и хотя бы приведённым скриптом перезаписываешь /etc/fstab. Всё, ни какого редактирования. Можно в скрипт передавать название опции и нового значения в качестве параметров.

Нажми кнопку «Игнорировать» и не плачь больше.

Зачем, скорее тебя заигнорят на форуме.

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

Ты вообще понял что я тебе написал про systemd ?

Разлепи глазки на теги, там стоит openrc.

Ну тогда напиши разбор каждой строки в /etc/fstab на устройство, точку монтирования, тип файловой системы, опции монтирования и dump/pass

Легче и проще будет сделать то, что я спросил изначально.

Зачем, скорее тебя заигнорят на форуме.

Трусы меняй почаще когда мечтаешь.

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

Легче и проще будет сделать то, что я спросил изначально.

Раз у тебя openrc, то легче это сделать через rc.local и добавить /etc/init.d/local на уровень запуска boot

Ну а по поводу последнего, зачем же ты всем раскрываешь нюансы своего время провождения.

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

В общем, покумекал я по твоей задаче... Я бы сделал так:

1. Если нужно не на этапе загрузки - формировал бы fstab каким-то простым скриптом, например:

#!/bin/sh

SUBVOL="root/orig"

FSTAB="
/proc      /proc       proc   rw,nosuid,nodev,noexec 0 0
/dev/shm   /dev/shm    tmpfs  rw,nosuid,nodev,noexec 0 0

/dev/cdrom /mnt/cdrom  auto   iocharset=utf8,users,noauto,owner,ro 0 0

LABEL=\"kroot82\" /       reiserfs        rw,acl,user_xattr,data=journal,barrier=flush,notail     0 0
LABEL=\"kswap82\" none    swap            sw                              0 0
LABEL=\"kvar82\"  /var    reiserfs        rw,noatime,nodiratime,notail    0 0
LABEL=\"khome82\" /home   reiserfs        rw,acl,user_xattr,data=journal,barrier=flush,notail     0 0
LABEL=\"data\"    /mnt/data       reiserfs        ro,acl,user_xattr,data=journal,barrier=flush,notail    0 0

/dev/sda2               /                       btrfs           noatime,ssd_spread,discard,compress=lzo,space_cache,subvol=$SUBVOL      0 0

/home/kroz/mine/archive/photos/my\040photos /home/ftp/photos      none    bind    0       0
"

echo "$FSTAB"

Здесь я мешал свой fstab с твоей строчкой. Если не знаешь bash:
- вместо $SUBVOL подставится значение этой переменной, которое определено вверху. Можешь задавать вручную, а если есть правила, можно задавать автоматически.
- при копировании оригинального fstab в это скрипт, экранируй двойные кавычки, обратные косые, доллары
- скрипт выводит содержимое на экран (дабы было легко дебажить); чтобы получить из этого файл, перенаправь вывод в fstab . Только бекапы всегда делай.

2. Если это делать нужно на этапе загрузки, то добавил бы соотв. строки в /etc/init.d/localmount - загрузочный скрипт, который, собственно, отвечает за монтирование устройств во время загрузки. Скриптом как выше сказано нельзя, так как на момент запуска localmount у нас примонтирован только корень, и то read-only. Но, если очень нужно, здесь можно тоже поизгаляться. Но, если дело в одной строчке, я бы добавил что-то типа:

mount /dev/sda2	/ -t btrfs -o noatime,ssd_spread,discard,compress=lzo,space_cache,subvol=root/orig
Опять же, если «root/orig» меняется динамически, соотв. скриптец легко это сделает. Если нужна помощь - расскажи правило, помогу со скриптом.

Вопросы? Комментарии? Пожелания?

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

Ну во-первых, у вас затрутся все параметры после subvol, т.е.

param1,param2,subvol=root/orig,param3,param4
Будет заменён на param1,param2,subvol=$VOLUME 0 0

Ну а во-вторых, вместо значения в переменной VOLUME будет указано '$VOLUME' потому, что у вас стоят одинарные 'ковычки', а не «двойные ковычки» и как следствие подстановки значения переменной не будет.

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

Нет. Там другая проблема - в переменной присутствует символ слэша и sed от этого впадает в ступор.

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

Так работает как надо:

sed -e 's%subvol=.*%subvol='$1' 0 0%'

Вот за что я не люблю баш - так за то, что регулярно приходится дёргать эту наркоманскую отрыжку (sed)

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

Тогда уже так:

$ sed 's/subvol=[^\t, ]*/subvol='$VOLUME'/'

. - любой символ
* - колличество - любое, точнее 0 и больше.
Сочетание [^\t, ] говорит «не табуляция, не запятая, не пробел».
В итоге ищем то, что начинается с «subvol=» за которым следует любое количество любых символов кроме табуляций, запятых, пробелов.

То есть теперь все равно, в конце оно строки с параметрами или в середине.

Там другая проблема - в переменной присутствует символ слэша и sed от этого впадает в ступор.

Экранировать его:

VOLUME="xxx\/yyy"

Вот за что я не люблю баш - так за то, что регулярно приходится дёргать эту наркоманскую отрыжку (sed)

bash, как раз позволяет от него в некоторых случаях уходить: http://www.opennet.ru/docs/RUS/bash_scripting_guide/x4171.html , ближе к концу.

И вопрос не в sed, а в регулярных выражениях. Пока не освоишь, и правда наркоманским кажется, а когда освоишь, получается благодать. Рекомендую для начала: http://ru.wikipedia.org/wiki/Регулярные_выражения .

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.