vzctl exec. Bug? [message #34283] |
Sun, 21 December 2008 11:38  |
Pilat
Messages: 8 Registered: November 2006
|
Junior Member |
|
|
День добрый коллеги!
Получил весьма неожиданный результат при выполнении команд внутри VE с помощью exec с хост системы.
# vzctl exec 1101 "echo ~"
/
Естественно, что весь софт, который использует хомник пишет свои файлы "не туда". Первичные проблемы возникли с gpg & wget.
Внутри VE естественно всё нормально.
vzctl enter 1101
entered into VE 1101
# echo ~
/root
Ядро Убунтовское(8.04.1) стандартное:
2.6.24-19-openvz #1 SMP Wed Aug 20 22:07:43 UTC 2008 x86_64 GNU/Linux
VE тоже Убунта 8.04.1, самосбор, без особых модификаций.
# vzctl --version
vzctl version 3.0.22
Какие будут соображения, как с бедою великою сладить?
[Updated on: Sun, 21 December 2008 13:45] Report message to a moderator
|
|
|
Re: vzctl exec. Bug? [message #34284 is a reply to message #34283] |
Sun, 21 December 2008 12:24   |
Pilat
Messages: 8 Registered: November 2006
|
Junior Member |
|
|
Пофиксил явным выставлением HOME, перед выполнением команды.
Т.е. так работает:
vzctl exec 1101 'HOME=/root; echo ~'
/root
Другой вариант так:
vzctl exec 1101 'export HOME=/root; echo ~'
Но имхо всё же не кошерно, то что vzctl не подхватывает локальные переменные рута, хотя выполняет команды вроде как от него.
[Updated on: Sun, 21 December 2008 13:42] Report message to a moderator
|
|
|
Re: vzctl exec. Bug? [message #34296 is a reply to message #34284] |
Mon, 22 December 2008 12:15   |
maratrus
Messages: 1495 Registered: August 2007 Location: Moscow
|
Senior Member |
|
|
Если сделать "vzctl enter", то HOME должна выставиться должным образом.
Почему они разные в обоих случаях?
Можно, конечно, порассуждать, а какая она должна быть, и должне ли vzctl гадать, где у рута домашняя директория.
Я думаю, для ответа на этот вопрос можете забить баг в багзиллу http://bugzilla.openvz.org/ . Там соответсвенно либо признают, что так быть не должно, либо объяснят, почему так сделано.
Quote: |
Но имхо всё же не кошерно, то что vzctl не подхватывает локальные переменные рута, хотя выполняет команды вроде как от него.
|
рута с HN? По моему мнению, не совсем верно говорить, что команда vzctl exec запускается от рута с HN.
|
|
|
Re: vzctl exec. Bug? [message #34298 is a reply to message #34296] |
Mon, 22 December 2008 13:34   |
Pilat
Messages: 8 Registered: November 2006
|
Junior Member |
|
|
Quote: | рута с HN? По моему мнению, не совсем верно говорить, что команда vzctl exec запускается от рута с HN.
|
Мне сложно судить о внутреннем устройстве OVZ, скорее мои рассуждения сводятся к рассуждениям пользователя. С точки зрения пользователя VE это всё же виртуальная машина, от которой я жду максимальной абстракции и максимальной схожести с реальной машиной. При vzctl enter я же рут и vzctl "гадает" о моём окружении. И интуитивно от других команд я жду того же самого, хотя в man vzctl, всё же нашел упоминание о проблеме: "Environment variables are not set inside the VE".
Команда:
vzctl exec 2222 'id'
uid=0(root) gid=0(root)
Свидетельствует, о том, что пользователем текущим является root внутри VE и интуитивное ожидается окружение root`а.
И результат выполнения следующих команд тоже интуитивно должен быть одинаковым:
# vzctl exec 2222 "gpg --keyserver-options http-proxy --keyserver keyserver.ubuntu.com --recv-key $MYKEY"
# vzctl enter 2222
entered into VE 2222
# MYKEY=ABE2A3C4; gpg --keyserver-options http-proxy --keyserver keyserver.ubuntu.com --recv-key $MYKEY
Но он получается не корректным. В первом случае публичный ключ инсталлируется в /.gnupg. Во втором случае в /root/.gnupg.
В итоге можно сказать, что это документированная «фича», но ужасно не удобная, снижающая юзабилити.
Писать в баг репорт не буду, ибо с высокой вероятностью известен ответ, даже если можно поправить инертность разработчиков этого не позволит.
Спасибо за комментарий.
|
|
|
Re: vzctl exec. Bug? [message #34301 is a reply to message #34298] |
Mon, 22 December 2008 13:52   |
maratrus
Messages: 1495 Registered: August 2007 Location: Moscow
|
Senior Member |
|
|
Quote: |
При vzctl enter я же рут и vzctl "гадает" о моём окружении.
|
На самом деле не гадает а проставляет в "/root"
Quote: |
В итоге можно сказать, что это документированная «фича», но ужасно не удобная, снижающая юзабилити.
|
Так поэтому лучше и написать в bugzilla.
Все, что вы объяснили в своем сообщении и может послужить толчком. Если фича неудобна с точки зрения пользователя и логического объяснения почему так сделано нет, а есть обратное, то можно и поменять.
Quote: |
Писать в баг репорт не буду, ибо с высокой вероятностью известен ответ, даже если можно поправить инертность разработчиков этого не позволит.
|
Если Вы напишете в bugzilla, то во всяком случае будут знать о вашей проблеме.
|
|
|
|
Re: vzctl exec. Bug? [message #34304 is a reply to message #34283] |
Mon, 22 December 2008 15:33   |
asarg
Messages: 5 Registered: March 2008
|
Junior Member |
|
|
Работаю с pilat в одной комнате )
Мне кажется что проблему решить очень просто.
Что мы изначально имеем? vzctl? это он выполняет вход в VE и знает, что и как запустить? Все, нам для решения больше ничего не надо, кроме изменения исходников vzctl.
Конкретно, саму команду exec трогать не будем, оставим ее для совместимости с уже наработанными (подозреваю не только у нас) скриптами для обхода данной проблемы, вместо этого введем новую команду execl или добавим ключ --login к уже имеющемуся exec. Далее для простоты будем говорить просто об execl.
имеем:
vzctl [flags] execl veid command [arg ...]
Тогда vzctl сначала выполняет действия:
1. лезет внутрь VE и считывает оттуда /etc/passwd, и находит там $SHELL для UID=0.
2. проверяет, существует ли $SHELL внутри VE и исполнимый ли он.
3. находит /bin/echo внутри VE и проверяет, исполнимый ли он
4. если все условия соблюдены, то vzctl заходит внутрь VE и исполняет в нем команду /bin/echo 'command [arg ...]' | $SHELL -l - нашел именно такой способ, совместимый с различными диалектами шелла от bash до zsh.
5. если не соблюдены условия в пп 1-3, то fallback до vzctl exec или возврат ошибки.
в принципе несложно.
[Updated on: Mon, 22 December 2008 15:38] Report message to a moderator
|
|
|
Re: vzctl exec. Bug? [message #34306 is a reply to message #34304] |
Mon, 22 December 2008 16:04   |
asarg
Messages: 5 Registered: March 2008
|
Junior Member |
|
|
Поковырялся.
Предложенный способ в лоб не работает, переменные типа $HOME устанавливаются процессом /bin/login или sshd.
Так почему бы тогда не сделать маааааленькую заначку? сделать какой-нить хелпер для виртуального окружения? собранный статически... И ставить его опционально куда-нить в заранее заданное место внутри VE, например /bin/vzhelper, и он будет исполнять функции, аналогичные login и прочему, что еще может понадобиться. Если уж все равно VE надо специально напильником дорабатывать типа удаления строк getty tty1 в inittab.
Тогда vzctl и прочая будет использовать хелпер, если найдет его; и не будет использовать, если не найдет. А удобств будет на порядок выше.
[Updated on: Mon, 22 December 2008 16:06] Report message to a moderator
|
|
|
|