Мне удалось решить проблему после того, как я вручную установил более старую версию (v1.14.0
) libiscsi, где qemu смог найти libiscsi.so.4
файл.
Сначала я удалил v1.17.0-2
, установленный с помощью pacman.
sudo pacman -Rddn libiscsi
без деинсталляции зависимости qemu-block-iscsi.
Я клонировал исходный код с github sahlberg/libiscsi и после сборки установил библиотеку с помощью libtool. Я понимаю, что это не лучшее решение, потому что при следующем обновлении qemu мне придется удалить ручную установку и снова использовать пакет pacman
.
На данный момент я вижу, что на странице arch linux qemu-page пакет :
Flagged out-of-date on 2016-05-10 Version 2.6.0-1 in testing
код выполнен от имени root:
# git clone folder - libiscsi/
# Making install in lib
# directory 'libiscsi/lib'
mkdir -p '/usr/lib'
/bin/sh ../libtool --mode=install /usr/bin/install -c libiscsi.la '/usr/lib'
libtool --finish /usr/lib
----------------------------------------------------------------------
# Libraries have been installed in: /usr/lib
----------------------------------------------------------------------
# Making install in utils
# directory 'libiscsi/utils'
mkdir -p '/usr/bin'
/bin/sh ../libtool --mode=install /usr/bin/install -c iscsi-inq iscsi-ls iscsi-perf iscsi-readcapacity16 iscsi-swp '/usr/bin'
----------------------------------------------------------------------
# directory 'libiscsi/examples'
mkdir -p '/usr/bin'
install -c ld_iscsi.so '/usr/bin'
----------------------------------------------------------------------
# directory 'libiscsi/
mkdir -p '/usr/include/iscsi'
install -c -m 644 include/iscsi.h include/scsi-lowlevel.h '/usr/include/iscsi'
mkdir -p '/usr/lib/pkgconfig'
install -c -m 644 libiscsi.pc '/usr/lib/pkgconfig'
Я выполнил команды вручную, потому что по умолчанию make install
из libiscsi устанавливал либы в /usr/local/bin
и /usr/local/lib
.
Любые комментарии и предложения приветствуются!
Объедините 2 32-битных целых числа, взятых из /dev/urandom
. Должно быть возможно использовать od
для захвата одного 64-битного значения согласно ответу Стефана, но по крайней мере на некоторых версиях OS X это не удается без соответствующего сообщения об ошибке.
#!/bin/sh
low32=$(od -An -td4 -N4 < /dev/urandom)
high32=$(od -An -td4 -N4 < /dev/urandom)
long=$(($low32 + ($high32 << 32) ))
Вы можете сложить два 32-битных числа вместе, например,
#!/bin/bash
printf '0x%04x%04x\n' $RANDOM $RANDOM
j=$(printf '16#%04x%04x' $RANDOM $RANDOM)
echo $j
echo $(($j))
Образец вывода
0x5e34562d
16#7cf567f9
2096457721
Это одна из многих функций, зародившихся в оболочке Korn (ksh) и скопированных в bash и zsh несколько лет спустя.
В комментарии - вы можете добавить дополнительные биты:
#!/bin/bash
printf '0x%04x%04x\n' $RANDOM $RANDOM
foo=32767
printf '%016x\n' $((foo << 49))
printf '%016x\n' $((foo << 34))
printf '%016x\n' $((foo << 19))
printf '%016x\n' $((foo << 4))
printf '%016x\n' $((foo % 16))
printf '%016x\n' $((foo << 49 |
(foo << 34) |
(foo << 19) |
(foo << 4) |
(foo % 16)))
printf '%d\n' $((foo << 49 |
(foo << 34) |
(foo << 19) |
(foo << 4) |
(foo % 16)))
Пример вывода:
0x3a1e1184
fffe000000000000
0001fffc00000000
00000003fff80000
000000000007fff0
000000000000000f
ffffffffffffffff
-1
Как и в macOS / dev / urandom
, вы должны иметь возможность:
od -An -vtd8 -N8 < /dev/urandom
Однако, по словам тех, кто пробовал это в реальной системе macOS (см. комментарии), там это не работает. Поскольку macOS должна быть сертифицированной системой Unix, это означает, что это ошибка, поскольку POSIX четко определяет поведение этой команды . Единственное, что POSIX оставляет неопределенным (определяемым реализацией), является порядок байтов (о котором мы не заботимся здесь, поскольку это все случайные байты).
В качестве альтернативы вы можете использовать ksh
/ bash
/ zsh
$ RANDOM
здесь. Несмотря на то, что macOS sh
в настоящее время основан на bash
, было бы лучше переключиться на реализации bash / zsh (или ksh
, отличные от mksh
, чья арифметика использует 32 бита) как $ RANDOM
не является функцией sh
, поэтому может не работать в будущей версии macOS, если они решат переключиться на другую оболочку.
m=32768 # $RANDOM span
long=$((RANDOM+RANDOM*m+RANDOM*m*m+RANDOM*m*m*m+RANDOM*m*m*m*m))
или:
long=$((RANDOM|(RANDOM<<15)|(RANDOM<<30)|(RANDOM<<45)|(RANDOM<<60)))
Это 5 * 15 == 75 бит, но это будет усечено оболочкой до 64 бит.
В инструментарии POSIX для генерации случайных чисел используется метод awk
rand ()
, поэтому вы можете сделать:
awk 'BEGIN{srand(); printf "%.20g\n", rand() * (2^64) - (2^63)}'
Но будьте осторожны со многими awk
(те, которые основывают семя srand ()
на результате time (3)
), вы получите тот же результат, если запустите его дважды в ту же секунду.
Кроме того, из-за способа представления чисел с плавающей запятой я ожидал, что будут какие-то 64-битные числа (например, 2 63 -1), которые он никогда не выведет.