Вот упрощенный тестовый пример:
trap '
trap - HUP EXIT || exit "$?"
kill -s HUP "$$" || exit "$?" ' HUP INT
kill -HUP $$
$ dash dash-bug
dash-bug: 3: /home2/ahq/dash-bug: Syntax error: EOF in backquote substitution
Изменение длины или содержимого цитируемого кода может либо «исправить» ошибку, либо привести к другим интересным искажениям, когда случайные байты появляются из ниоткуда.
Это было вызвано использованием -после -бесплатной ошибки, которая была исправлена, начиная с dash 0.5.9, но все еще присутствует в dash 0.5.8 из стабильной версии Debian 9.8 (stretch ), Ubuntu 18.04 (бионический )и Ubuntu 18.10 (космический ).
Это коммит , в котором это исправлено:
commit 6c3f73bc536082fec38bd36e6c8a121033c68835
Author: Herbert Xu
Date: Thu Oct 2 08:26:06 2014 +0800
[EVAL] Fix use-after-free in dotrap/evalstring
The function dotrap calls evalstring using the stored trap string.
If evalstring then unsets that exact trap string then we will end
up using freed memory.
This patch fixes it by making evalstring always duplicate the string
before using it.
Signed-off-by: Herbert Xu
Обходной путь -состоит в том, чтобы поместить обработчик прерывания в функцию --, чтобы никакие команды не запускались после сброса прерывания, пытающегося использовать строку действия после того, как оно было освобождено:
sighandler(){
trap - "$sig" EXIT || exit "$?"
kill -s "$sig" "$$" || exit "$?"
}
for sig in HUP INT QUIT ALRM TERM; do
trap "sig=$sig; sighandler" "$sig"
done
kill -s HUP "$$"
Ваши /dev/sda[1-7]
не являются логическими томами LVM, а являются обычными традиционными разделами диска.
Каждый раздел всегда должен представлять собой одну группу последовательных дисковых блоков на одном диске. Расширение раздела возможно только в его хвостовой части :, если раздел занимает блоки X..Y, вы можете расширить его, чтобы охватить блоки X.. (Y+N )-, но только если блоки (Y +1 )... (Y+N )все свободны.
В вашем случае sda6
заканчивается в блоке #280764415, а sda7
начинается в блоке #280766464. И sda7
, кажется, продолжается до конца диска. Таким образом, без предварительного удаления или сжатия sda7
вы можете расширить sda6
только на (280766464 -1)-280764415 = 2048 блоков, или, другими словами, ровно на 1 МБ. Это так мало, что в большинстве случаев не стоит заморачиваться.
Если вы сжимаете sda7
, сжатие раздела также происходит в его хвостовой части. Таким образом, после сжатия раздела вам также придется переместить его в конец диска. Перемещение раздела требует его размонтирования, а поскольку перемещение требует интенсивной записи -, это займет некоторое время... поэтому потребуется некоторое время простоя приложения.
Если sda6
не является вашей корневой файловой системой, я бы посоветовал вам вместо этого:
pvcreate
), sdb1
диск, возможно, уже используется vgextend
(, если только вы не знаете, что вам потребуется переместить sdb1
на другой компьютер/ВМ отдельно от нового диска позже, в в этом случае создайте новую группу томов для нового диска с vgcreate
), lvcreate
),mkfs
логический том, использующий предпочтительный тип файловой системы, sda6
(cp -a
т.к. root в большинстве случаев работает хорошо ), sda6
и смонтировать новый логический том LVM в ту же точку монтирования sda6
, которая была занята ранее. Отредактируйте /etc/fstab
, чтобы ваш новый логический том LVM автоматически монтировался в предыдущее местоположение sda6
при каждой перезагрузке с этого момента. Убедившись, что все успешно скопировано, вы можете преобразовать sda6
в другой физический том LVM, а затем использовать его для дальнейшего расширения группы томов LVM (с помощьюvgextend
). Это позволит вам использовать пространство для последующего расширения любых существующих логических томов в той же группе томов(lvextend
)или для создания одного или нескольких новых логических томов (lvcreate
), если это необходимо.
Если sda6
содержит вашу корневую файловую систему (/
), то перенести ее на LVM можно, но довольно сложно; Вместо этого я бы рекомендовал создать новую виртуальную машину и на этот раз выбрать установку на основе LVM -в установщике ОС. После установки базовой ОС на основе LVM -вы можете установить все те же программные пакеты, что и на старой виртуальной машине, скопировать всех пользователей, группы и все файлы ОС, не относящиеся к -, и, наконец, удалить старую ВМ.