Удалить / home / <пользователь> из оверлея casper-rw при завершении работы (служба systemd)

В моей компании мы используем загрузочную живую флешку USB с Ubuntu (эм ... Xubuntu) 18.04 для проведения собеседований. У него есть набор инструментов (три или четыре IDE, пара просмотрщиков графического интерфейса базы данных ...) и игрушечный проект, о котором можно задавать вопросы.

Эта флешка имеет накладной раздел Casper-RW для постоянного хранения (созданный с помощью mkusb ). Упомянутый раздел в основном используется для хранения образов Docker и для хранения некоторых начальных значений, которые могут немного измениться в зависимости от того, к какой машине подключен флеш-накопитель.

Этот раздел монтируется «вручную» в /media/overlay путем добавления следующей строки mkdir --parents /media/overlay/ && mount -L casper-rw /media/overlay/ в файл rc.local (спасибо @sudodus за ответ мой предыдущий вопрос ).

Теперь, этот casper-rw персистентный слой работает отлично ... Возможно, слишком хорошо Мы хотели бы стереть каталог /home/<user>, в котором были сохранены .bash_history и другие изменения, сделанные собеседником, когда мы закрывали тестовую среду (тестовая среда ... значение: ноутбук, на котором собеседник делал какие-то вещи) так что он готов к следующему кандидату.

Благодаря этим ответам ( Unix & Linux , AskUbuntu ) я создал сервис systemd, который ... своего рода делает то, что я хочу, просто кажется, что это происходит, когда система ботинки , а не когда он падает. Это не большое дело, это просто ... это немного меня беспокоит : - D

Это сервис systemd, который я создал в /etc/systemd/system/clear-stick.service:

[Unit]
Description=Cleans-up interview sticker
RequiresMountsFor=/media/overlay/
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target umount.target casper.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clear_interview_stick.sh
ExecStop=/usr/local/bin/clear_interview_stick.sh
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

Я подозреваю, что он запускает только строку ExecStart при загрузке, а не линию ExecStop при выключении. Если я внесу изменения в каталог /home/, выключу компьютер и подключу флешку в другом месте, изменения все еще будут. Кроме того, если я посмотрю журналы в journalctl, то увижу только ссылки на наклейку с прояснением интервью , окруженную, как кажется, стартовыми последовательностями других служб.

Я не уверен на 100%, произойдет ли это из-за неправильного (очень вероятного) определения .service или из-за того, что я не до конца понимаю, как работает оверлей casper-rw, и хотя .service запущен на завершение работы, он не может очистить каталог /media/overlay/home/interviewee?.

Как я упоминал ранее, это не огромная, огромная сделка , поскольку кажется, что она стирает каталог /home/ при загрузке, но я бы предпочел сделать это "" "правильно "" " и сотрите его при выключении.

И на всякий случай это уместно, вот содержание /usr/local/bin/clear_interview_stick.sh:

#!/bin/bash

had_to_mount="false";
if [[ ! -d "/media/overlay/upper/" ]]; then
    mount -L casper-rw /media/overlay/
    had_to_mount="true";
fi

if [[ -d "/media/overlay/upper/home/interviewee/" ]]; then
    echo "Removing interviewee /home";
    rm -rf "/media/overlay/upper/home/interviewee/";
else
    echo "interviewee /home/ not found"
fi

if [[ -f /root/.bash_history ]]; then
    rm /root/.bash_history;
fi

if [[ "${had_to_mount}" == "true" ]]; then
       umount /media/overlay;
fi       

2
задан 6 August 2019 в 16:52

1 ответ

НАКОНЕЦ!!Я понял!!!. Огромное спасибо к @Rinzwind, кто дал мне решающий ключ к разгадке в комментариях к вопросу для этого.

(!!), Если кто-то читает эти слова: не предполагайте, что это - правильный способ сделать его, потому что это, вероятно, не. Я действительно плохо знаком с SystemD, и я главным образом... хорошо... абсолютно ничего не знаю об этом.

Я получил его работа с помощью сервиса, которым ExecStarts (важный, я пробовал много только ExecStop и не работал), после shutdown.target и это разыскивается final.target.

  • /etc/systemd/system/clear-stick.service:

    [Unit]
    Description=Cleans-up interview sticker
    
    DefaultDependencies=no
    Before=final.target umount.target
    After=shutdown.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/clear_interview_stick.sh
    RemainAfterExit=true
    
    [Install]
    WantedBy=final.target
    

Также помогло наблюдению, как наложение casper-rw сделало это (я имею в виду: рассмотрение фактического /etc/systemd/system/final.target.wants/casper.service файл) и как это использует ExecStart, заставляет его бежать umount (хотя я хотел свой сервис, выполненный прежде umount)... подобные вещи.

Кроме того, в одном из моих многих тестов я удалил строку RequiresMountsFor=/media/overlay/ Это могло бы все еще быть в порядке (я не попробовал все возможные перестановки), но с тех пор в то время, когда mount /media/overlay делался через /etc/rc.local, (mkusb вступает во владение /etc/fstab), и что я сделал работы без него, я не пустил его.

В предыдущем абзаце я упоминаю, "но с тех пор в то время, когда mount..." Поэтому на всякий случай SystemD не "видел" монтирование, которое не было перечислено в /etc/fstab но созданный через rc.local, Я также создал a .mount файл единицы, как объяснено здесь, чтобы попытаться иметь SystemD знают об этом. Плюс чувствовавший инструмент для очистки мне.

Это то, как:

  • /etc/systemd/system/media-overlay.mount:

    [Unit]
    Description=Mount Overlay in /media/
    
    [Mount]
    What=/dev/disk/by-label/casper-rw
    Where=/media/overlay
    Type=ext4
    Options=defaults
    
    [Install]
    WantedBy=multi-user.target
    

Это не помогло со стиранием. Я предполагаю, возможно???? (большое предположение, большое, возможно) поэтому, я все еще использовал ExecStop? Я не знаю, действительно. Тем не менее, это .mount файл сделал преуспевший создание mount, таким образом, я сохранил его.

Я уверен инструмент для очистки и более надежен .service мог быть записан, но так как каждый тест взял меня больше, чем полчаса, потому что я должен был восстановить загрузочную карту с интерфейсом USB, я решил отъезд его как это. (Если это компилирует, это поставлется, правильно?)

Стоит отметить что list-dependencies команда (как в systemctl list-dependencies --after final.target) было также действительно полезно для наблюдения то, что продолжалось.

1
ответ дан 2 December 2019 в 04:36

Другие вопросы по тегам:

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