У меня была такая же проблема, я нашел ответ на https://www.evonide.com/non-root-gpu-passthrough- настройка / . Вам нужно добавить -cpu host, kvm = off
в командную строку qemu. Я использую ganeti, поэтому проблема решена следующим образом:
gnt-instance modify -H cpu_type="host\,kvm=off"
Если я правильно понимаю, этот флаг не отключает ускорение KVM для гостя, которое включено с помощью -machine pc, Accel = kvm
. Но он отключает ускорение вложенного KVM для гостя (поэтому вы не сможете запустить виртуальную машину KVM внутри гостя).
Несколько общих тенденций, объясняющих, почему команда не анализирует должным образом в сценарии, но работает сама по себе:
Оболочка сообщает об ошибке при первой же ошибке. то, чего он не ожидает. Здесь он не ожидает (
, но кажется, что он находится внутри строки в кавычках. Возможное объяснение состоит в том, что вы не в строке в кавычках, потому что первый '
там на самом деле закрывает ранее незакрытую цитату вместо открытия новой '...'
, как в:
echo It's a bug
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds
На самом деле:
echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...
И это некотируемое (
выше неожиданно для оболочки .
Вы получаете аналогичные проблемы с любой структурой, которая не закрыта должным образом или имеет неправильный формат, например, fi
без , затем
...
На самом деле не следует использовать обратные кавычки. Вместо них следует использовать $ (...)
.
Внутренние обратные кавычки, \
обрабатываются по-другому.
echo "`
echo It\\\'s OK
`"
не подходит. echo It \\ 'OK
само по себе нормально, так как внутри обратных кавычек первые две обратные косые черты становятся одной, так что в итоге получается echo It \\' OK
.
Современная форма $ (...)
не имеет этих проблем.
псевдоним es чем-то похожи на макросы, их расширение снова подвергается интерпретации кода.
Например:
alias foo="echo '"
...
foo bar
echo 'baz('
может скрывать проблему в определении псевдонима foo
.
Есть более тонкие, например:
alias foo='a;b'
cmd | foo
Которые, не вызывая синтаксических ошибок, вызывают неожиданный синтаксический анализ.
Часто функции более подходят, чем псевдонимы
Некоторые байтовые последовательности могут интерпретироваться по-разному в зависимости от локали.
Например, байт 0xa0 - это неразрывный пробел в наборе символов ISO-8859-1. И этот символ оказывается пробелом в Solaris, а bash
обрабатывает все пробелы как разделители (в настоящее время только для однобайтовых символов).
Этот байт 0xa0 также является частью нескольких символов UTF-8, например à
. Таким образом, вы можете обнаружить, что, например, сценарий, имеющий:
var=àdo
(с этим à
, записанный в UTF-8) перестает работать при запуске в Solaris в локали ISO-8859-1, потому что это становится var = X do
(где X
- это первый байт этого символа à
).
Или вы можете обнаружить, что:
echo ε
С этим ε
, записанным в наборе символов BIG5-HKSCS, перестает работать, если вы не находитесь в локали zh_HK.big5hkscs
, поскольку что ε
фактически кодируется как 0xa3 0x60, где 0x60 в ASCII и все однобайтовые наборы символов являются обратным апострофом.