Por que monitorar o status de uma gravação em USB não é confiável?

1

Eu escrevo arquivos ISO muito para pen drives USB, e estou tentando encontrar uma maneira de monitorar o status de uma gravação. Pesquisando isso, encontrei várias soluções, incluindo pv , dcfldd e o sinal USR1 para o comando dd .

Em todos os casos, este parece ser o caso:

  1. O arquivo é gravado no pen drive a cerca de 100 MB / s
  2. A transferência termina (ou possivelmente congela a 99,99%) em menos de 10 segundos
  3. O comando de transferência permanece sem resposta por vários minutos , nem mesmo respondendo a interrupções
  4. A transferência termina

O comportamento que espero seria uma gravação relativamente lenta, talvez em torno de 5 MB / s, e uma barra de progresso que progride de maneira uniforme de 0% para 100%. Parece que o arquivo foi gravado rapidamente em um buffer de algum tipo e depois foi lentamente para o disco depois.

Aqui estão alguns comandos que tentei, todos basicamente com o mesmo resultado:

# function vdd {
>     sudo dd "$@" &
>     sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
> }
# vdd bs=4096 if="/path/to/ubuntu-15.04-desktop-amd64.iso" of=/dev/sdb
dcfldd bs=4096 if="/path/to/ubuntu-15.04-desktop-amd64.iso" of=/dev/sdb
pv "/path/to/ubuntu-15.04-desktop-amd64.iso" | dd bs=4096 of=/dev/sdb
pv -B 4096 "/path/to/ubuntu-15.04-desktop-amd64.iso" > /dev/sdb

Eu pesquisei as páginas man de dd , pv e dcfldd para a palavra "flush" sem resultados ...

    
por Hubro 31.07.2015 / 23:55

1 resposta

1

Se você precisar de uma ferramenta cli

USB="/dev/sdb"
ISO_IMAGE="/path/to/ubuntu-15.04-desktop-amd64.iso"
SIZE=$(du -h -B1 "$ISO_IMAGE" | awk '{print $1}')

dd if="$ISO_IMAGE" | pv -s "$SIZE" | dd of="$USB" bs=4M oflag=dsync

Aqui o dd pedirá a saída completamente síncrona ao disco.

Você mencionou flush, você provavelmente desejará usá-lo para alguma interface do usuário para escrever o progresso linha por linha com pv -n .

 USB="/dev/sdb"
 ISO_IMAGE="/path/to/ubuntu-15.04-desktop-amd64.iso"
 SIZE=$(du -h -B1 "$ISO_IMAGE" | awk '{print $1}')

 (dd if="$ISO_IMAGE" | pv -n -s "$SIZE" | dd of="$USB" bs=4M oflag=dsync) 2>&1 | \
  yad --center --borders=6 --title="Image writer" --text="$(echo -e "Writing $(basename "$ISO_IMAGE"):")"\
        --width=300 --progress --no-buttons --auto-close --image=system-run --window-icon=drive-removable-media-usb
    
por 16.10.2017 / 01:01