LINUX.ORG.RU

Сообщения azhirov1991

 

Загрузка по сети с многоуровневым монтированием

 , , ,

Работаю над механизмом загрузки по сети. Идея заключается в том, чтобы можно было грузить несколько клиентов с одного источника, в формате ReadOnly, при этом изменения каждого клиента хранить на другом ресурсе в ReadWrite.

Для разработки был взят Debian 12. Сам механизм реализуется в initrd.

  1. Загрузка в iPXE
  2. Подключение и последующая загрузка с iSCSI
  3. Монтирование NFS ресурса, на котором лежит пользовательский qcow2
  4. Монтирование qcow2
  5. Создание стека overlayfs в качестве корневой директории, где iSCSI в нижний слой, а qcow2 в верхний слой
  6. Передача последующей загрузки в сформированный корень

Вся магия монтирования реализована в /run, чтобы при передачи загрузки система видела смонтированные источники.

Данный механизм отрабатывает на несколько клиентов, проблем нет, всё корректно грузится и работает. Конфликтов нет.

Проблемы возникают на этапе выключения. Даже с учетом того, что смонтированный стек «живёт» в /run, systemd всё же «не понимает» его устройство и размонтирует всё в своём порядке.

Проблем с iSCSI не возникает, так как в /etc/default/open-iscsi есть параметр, которому можно передать кастомную точку монтирования, которую он учтет при размонтировании.

Но вот с двойным монтированием NFS + qcow2 не удаётся провернуть подобный трюк. При этом qcow2 является RW устройством. Соответственно, в процессе выключения некоторые данные, всё же, ещё пишутся.

Возникает кольцевая зависимость (если я правильно понимаю).

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

Может есть иной подход?

azhirov1991
()

Реализация окна ввода пароля на ncurses

 , ,

Всем привет!

В рамках своей разработки вынес отдельно пример кода, который реализует форму ввода. Хочу сделать ввод пароля в виде скрытых символов. Разобрался, что можно использовать регулярку в данном случае. В общем, попытался с простого примера:

#include <form.h>

int main() {
    initscr();
    curs_set(1);
    WINDOW *win = newwin(5, 40, 10, 10);
    keypad(win, TRUE);
    box(win, 0, 0);
    wrefresh(win);

    FIELD *fields[2];
    fields[0] = new_field(1, 20, 2, 2, 0, 0);
    fields[1] = NULL;
    set_field_type(fields[0], TYPE_REGEXP, "^[0-9]* *$");
    set_field_opts(fields[0], O_VISIBLE | O_ACTIVE | O_EDIT);

    FORM *form = new_form(fields);
    set_form_win(form, win);
    set_form_sub(form, derwin(win, 3, 38, 1, 1));
    post_form(form);
    wrefresh(win);

    int ch;
    while ((ch = wgetch(win)) != KEY_F(1)) {
        int status = form_driver(form, ch);
        if( status == E_OK ) {
            status = form_driver(form, REQ_VALIDATION);
        }
        if (status == E_INVALID_FIELD) {
            form_driver(form, REQ_DEL_PREV);
        } else if (status == E_OK) {
            wrefresh(win);
        }
    }

    unpost_form(form);
    free_form(form);
    free_field(fields[0]);
    endwin();

    return 0;
}

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

В общем, гуглил примеры работы с формами ввода, ничего толкового не удалось найти. Прошу помощи гуру. Спасибо!

azhirov1991
()