socat и gawk piped

При решении этой проблемы ключевое значение имела информация, представленная на http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml . Тем не менее, это руководство для очень старой версии RHEL, и различная информация была устаревшей.

Приведенные ниже инструкции разработаны для работы с CentOS 7, но они должны быть достаточно легко перенесены в любой дистрибутив под управлением systemd. Все команды выполняются как root.

  1. Убедитесь, что система находится в стабильном состоянии

    Убедитесь, что ее больше никто не использует и больше ничего важного не происходит. Вероятно, это хорошая идея, чтобы остановить обслуживающие подразделения, такие как httpd или ftpd, только для того, чтобы внешние соединения не нарушали работу в середине.

     systemctl stop httpd
    systemctl stop nfs-server
    # и так далее....
    
  2. Демонтировать все неиспользуемые файловые системы

     umount -a
    

    Это приведет к печати ряда предупреждений "Target is busy" для самого корневого тома и для различных временных/системных FS. На данный момент их можно игнорировать. Важно то, что нет подключенных файловых систем, кроме самой корневой файловой системы. Проверьте следующее:

     # монтирование само по себе предоставляет информацию, но столбец позволяет читать
    mount | column -t
    

    Если какие-либо файловые системы на диске все еще установлены, то все еще выполняется то, чего не должно быть. Проверьте использование fuser :

     # при необходимости:
    yum установка psmisc
    # затем:
    fuser -vm 
    systemctl stop 
    umount -a
    # повтор при необходимости...
    
  3. Сделайте временный корень

     mkdir/tmp/tmproot
    mount -t tmpfs none/tmp/tmproot
    mkdir/tmp/tmproot/{ proc, sys, dev, run, usr, var, tmp, oldroot}
    cp -ax/{ bin и т.д., mnt, sbin, lib, lib64 }/tmp/tmproot/
    cp -ax/usr/{ bin, sbin, lib, lib64 }/tmp/tmproot/usr/
    cp -ax/var/{ account, пустой, lib, локальный, lock, nis, opt, save, run, spool, tmp, yp }/tmp/tmproot/var/
    

    Это создает очень минимальную корневую систему, которая нарушает (среди прочего) просмотр manpage (no /usr/share ), настройки на уровне пользователя (no /root или /home ) и т. д. Это намеренно, так как это является стимулом не оставаться в такой сфальсифицированной жюри корневой системе дольше, чем необходимо.

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

  4. Поверните в корень

     mount --make-rprivate/#, необходимый для работы pivot_root
    pivot_root/tmp/tmproot/tmp/tmproot/oldroot
    для i в dev proc sys run; do mount --move/oldroot/$ i/$ i; готово
    

    systemd приводит к тому, что подключения разрешают совместное использование поддерева по умолчанию (как в случае с mount --make-shared ), и это приводит к сбою pivot _ root . Поэтому мы отключаем его глобально с помощью mount --make-rprivate/. Системные и временные файловые системы перемещаются оптом в новый корень. Это необходимо для того, чтобы это вообще работало; гнезда для связи с системойd,среди прочего, жить в /запустить , и поэтому нет пути, чтобы сделать запущенные процессы его закрыть.

  5. Убедитесь, что удаленный доступ пережил переключение

     systemctl restart sshd
    состояние systemctl sshd
    

    После перезапуска sshd убедитесь, что вы можете войти, открыв другой терминал и подключившись к машине снова через ssh. Если вы не можете, исправьте проблему, прежде чем двигаться дальше.

    После проверки возможности повторного подключения выйдите из используемой оболочки и снова подключитесь. Это позволяет оставшейся вилке sshd выйти и гарантирует, что новая не удерживает /oldroot .

  6. Закрыть все еще используя старый корень

     fuser -vm/oldroot
    

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

      USER PID ACCESS COMMAND
    / oldroot: монтирование корневого ядра/oldroot
    корень 1... е. systemd
    корень 549... э. systemd-журнал
    корень 563... э. lvmetad
    корень 581 ф.. э. systemd-udevd
    корень 700 F.. е. auditd
    корень 723... э. NetworkManager
    корень 727... э. irqbalance
    корень 730 F.. е. настроился
    корень 736... э. smartd
    корень 737 F.. е. rsyslogd
    корень 741... э. abrtd
    chrony 742... э. chronyd
    корень 743... э. abrt-watch-log
    libstoragemgmt 745... э. lsmd
    корень 746... э. systemd-logind
    dbus 747... э. dbus-демон
    корень 753.. ce. фактическое время отправления
    корень 754... э. crond
    корень 770... э. agetty
    polkitd 782... э. polkitd
    корень 1682 F.ce. владелец
    постфикс 1714.. ce. qmgr
    постфикс 12658.. ce. погрузка
    

    Необходимо разобраться с каждым из этих процессов, прежде чем демонтировать /oldroot . Подход грубой силы - это просто убить $ PID для каждого, но это может сломать вещи. Чтобы сделать это более мягко:

     systemctl | grep running
    

    Создается список запущенных служб. Это можно соотнести со списком процессов, содержащих /oldroot , а затем выполнить systemctl restart для каждого из них. Некоторые службы откажутся зайти во временный корень и войти в неисправное состояние; на данный момент они не имеют никакого значения.

    Если корневым диском, размер которого требуется изменить, является диск LVM, может потребоваться перезапуск некоторых других запущенных служб, даже если они не отображаются в списке, созданном fuser -vm/oldroot . Если вы не можете изменить размер диска LVM на шаге 7, попробуйте systemctl перезапустить systemd-udevd .

    Некоторые процессы не могут быть обработаны с помощью простого перезапуска системы . Для меня они включали auditd (который не любит быть убитым через systemctl , и поэтому просто хотел убить -15 ). С ними можно справиться индивидуально.

    Последним процессом, который вы найдете, обычно является systemd . Для этого запустите systemctl daemon-reexec .

    После завершения работы таблица должна выглядеть следующим образом:

      USER PID ACCESS COMMAND
    / oldroot:монтирование корневого ядра/oldroot
    
  7. Демонтировать старый корень

     umount/oldroot
    

    На данном этапе вы можете выполнять любые необходимые манипуляции. Исходный вопрос требовал простого вызова resize2fs , но здесь можно делать все, что угодно; другой пример использования - перенос корневой файловой системы из простого раздела в LVM/RAID/что угодно.

  8. Поверните корень назад

     монтируйте /oldroot
    снова монтировать --make-rprivate/#
    pivot_root/oldroot/oldroot/tmp/tmproot
    для i в dev proc sys run; do mount --move/tmp/tmproot/$ i/$ i; готово
    

    Это прямой разворот шага 4.

  9. Удаление временного корня

    Повторите шаги 5 и 6, за исключением использования /tmp/tmproot вместо /oldroot . Затем:

     umount/tmp/tmproot
    rmdir/tmp/tmproot
    

    Поскольку это tmpfs, в этот момент временный корень растворяется в эфире, его больше никогда не увидеть.

  10. Верните вещи на свои места

    Снова монтируйте файловые системы:

     монтируйте -a
    

    На данном этапе необходимо также обновить /etc/fstab и grub.cfg в соответствии с любыми корректировками, внесенными на этапе 7.

    Перезапустите все отказавшие службы:

     systemctl | grep
    systemctl перезапуск 
    

    Снова разрешить общие поддеревы:

     mount --make-rshared/
    

    Запустите остановленные служебные блоки - можно использовать одну команду:

     systemctl isolate default.target
    

И вы закончили.

Большое спасибо Эндрю Вуду, который разработал эту эволюцию на RHEL4, и Стиву, который предоставил мне связь с первым.

-121--3758-

Первый и самый простой из них - поиск в Интернете, форумах для обеспечения безопасности этого дистрибутива.

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

проверьте конфигурации по умолчанию для ssh,... проверьте, как он выходит на сеть, например, проверьте входящий и исходящий трафик с помощью команды netstat tcptrack и this .

проверьте активность сообщества, выпуски ошибок и обновления.

1
13.04.2018, 12:25
1 ответ

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

Чтобы очистить выходной буфер вручную, используйте fflush()в программе gawk:

gawk '{... ; print out; fflush() }'
0
28.01.2020, 00:37

Теги

Похожие вопросы