Насколько я знаю, это не имеет значения в какой порядок поместить разделы в.
Однако "случайный", вероятно, не "корректное" слово для использования здесь. Возможно, Вы означали говорить "произвольный". Кроме того, возможно, у Вас должен быть первый раздел быть /
, следующий /home
и последний быть swap
. Это, по-моему, лучше, чем выбор произвольного порядка, чтобы вставить их, потому что существует "своего рода упорядочивание" здесь в противоположность произвольному упорядочиванию.
Думаю, он у меня есть:
Замена grep -Hv 0 / sys / block / * / съемный
от grep -Hv ^ ATA \ * $ / sys / block / * / device / vendor
, похоже, работает:
export USBKEYS=($(
grep -Hv ^ATA\ *$ /sys/block/*/device/vendor |
sed s/device.vendor:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
echo $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
Или даже использование readlink
, чтобы убедиться, что это USB, может точнее ...
export USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
echo $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
В этом I
Убедитесь, что это USB (или съемный
). Убедитесь, что это работает как жесткий диск (не CD -Rom)
Убедитесь, что они имеют размер больше 0 (не пустой картридер).
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed s+/device.*$+/dev*/ue*+ <(grep -Hv ^ATA\ *$ /sys/block/*/device/vendor)) <(:))) <(:))))
set | grep ^US=
Это может быть написано
US=($(
cut -d/ -f4 <(
grep -vl ^0$ $(
sed s@device/.*@size@ <(
grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)
)
) /dev/null # equivalant but quicker than <(:)
)) /dev/null)))
С ссылка для чтения
, версия для гольфа становится:
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)) ) <(:))) <(:))))
Последняя версия подпрограммы usbKeyChooser находится в моем интерактивном установщике :
#!/bin/bash
DIALOG=whiptail
usbKeyChoose() {
while [ ! -b /dev/$STICK ] ;do
USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4 ))
if [ ${#USBKEYS[@]} -eq 0 ];then
title="No key found"
else
title="Choose wich USB stick have to be installed"
fi
menu=(R "Re scan devices")
for dev in ${USBKEYS[@]} ;do
read model </sys/block/$dev/device/model
menu+=($dev "$model")
done
num=$($DIALOG --menu "$title" 21 72 14 "${menu[@]}" 2>&1 >/dev/tty)
if [ ! "$num" ] ; then
echo "User aborted."
exit 0;
fi
[ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
done; }
usbKeyChoose
echo $STICK
Мне нравится этот цикл решение, потому что они
В любом случае, даже если пользователь сделал ошибку ОК
выбор, следующий экран - это еще один выбор, спрашивающий пользователя, для которого изображение должно быть записано в ключе, по умолчанию на создать новое изображение , что является очень долгим процессом, когда пользователь можно было нажать Ctrl + c
Это ответ Ф. Хаури, адаптированный для kdialog:
#!/bin/bash
DIALOG=kdialog
usbKeyChoose() {
while [ ! -b /dev/$STICK ] ;do
USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4 ))
if [ ${#USBKEYS[@]} -eq 0 ];then
title="No key found"
else
title="Choose wich USB stick have to be installed"
fi
menu=(R "Re scan devices")
i=0
for dev in ${USBKEYS[@]} ;do
read model </sys/block/$dev/device/model
#echo $i $dev "$model"
menu+=("$i" "$dev $model")
i=$[i + 1]
done
num=$($DIALOG --menu "$title" "${menu[@]}")
#echo "num=$num"
#echo "USBKEYS[num]=${USBKEYS[num]}"
if [ ! "$num" ] ; then
echo "User aborted."
exit 0;
fi
[ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
done; }
usbKeyChoose
echo $STICK
Итак, чтобы вытащить это в список, вы можете использовать ту же команду, которую я дал вам раньше, но просто отмените требование removeable:
% for blk in $(lsblk -ndo name) ; do
> udevadm info --query=all --name "$/dev/$blk" |\
> grep -q ID_BUS=usb && printf \
> 'findmnt %s -no TARGET ;'\
> "/dev/$blk" /dev/"$blk"[0-9]
> } ; done 2>&- |. /dev/stdin
Ничего страшного - теперь она будет выводить только активные точки монтирования для блочных устройств на шине usb, а я, например, не могу придумать много примеров неснимаемых блочных устройств usb.
Что касается почему ваше текущее устройство не регистрируется как извлекаемое, то наиболее вероятный ответ заключается в том, что его драйвер просто не указывает его таким образом. Когда устройства обнаруживаются программой udev
она собирает информацию о них, как только может, основываясь на своей базе правил. Вы можете просмотреть все эти классификации с помощью:
% udevadm info --query=all --name /dev/$BLOCK_DEVICE
Это вернет список всех записей ключ=значение, которые система использует для классификации оборудования, на которое ссылается /dev/$BLOCK_DEVICE
. В нижней части этого сообщения slm советует, как эту информацию можно легко разобрать для ваших нужд - и это действительно довольно просто. Документация справедливо описывает ее как "человекочитаемую, удобную для grep". Выше я отфильтровал все блочные устройства только до тех, которые находятся на шине usb с помощью:
% grep -q ID_BUS=usb
Вы также можете пройтись по атрибутам
по всему дереву устройств для вашего текущего устройства и другого, чьи атрибуты
, по вашему мнению, оно должно отражать. Если этого не происходит, значит, udev
назначил его не так, как вы думаете. К счастью, вы можете увидеть каждую точку данных, которая повлияла на его назначение:
udevadm info --attribute-walk --name /dev/$BLOCK_DEVICE
Вы можете использовать эти данные для моделирования новых правил назначения по своему усмотрению.