Seletor de armazenamento removível USB: USBKeyChooser
Acho que tenho:
Substituir grep -Hv 0 /sys/block/*/removable
por grep -Hv ^ATA\ *$ /sys/block/*/device/vendor
parece funcionar:
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
Ou mesmo usando readlink
para garantir que isso é USB poderia ser mais preciso ...
export USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block//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
Retroceder:
Neste eu
-
Certifique-se de que esta é USB (ou removível
-
Garanta esse trabalho como um disco rígido (não um CD-Rom)
-
Verifique se eles têm tamanho maior que 0 (não um leitor de cartão vazio)
Versão com golfe:
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=
Isso pode ser escrito
US=($(
cut -d/ -f4 <(
grep -vl ^0$ $(
sed s@device/.*@size@ <(
grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block//dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)
)
) /dev/null # equivalant but quicker than <(:)
)) /dev/null)))
Com readlink
, a versão com golf se torna:
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block//dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)) ) <(:))) <(:))))
Em bom: usbKeyChooser
Existe a versão final da sub-rotina usbKeyChooser no meu live installer :
#!/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//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
Eu gosto dessa solução looping porque eles
- vamos inserir muitas chaves,
- aguarde o registro do kernel,
- valida a escolha,
- padrão para nada e
- permite o cancelamento do usuário.
De qualquer forma, mesmo que o usuário tenha errado ok
choice, a próxima tela é outra opção perguntando ao usuário para qual imagem precisa ser escrita na chave padrão para criar nova imagem que é um processo muito longo onde o usuário pode pressionar Ctrl + c