Preenchendo o disco rígido até que uma certa quantidade de espaço seja deixada?

1

Estou fazendo alguns testes de um produto em dispositivos Apple e Android. Eu gostaria de um script que encha o disco rígido dos dispositivos até que o espaço de 100KB seja deixado na unidade contra a qual ele é executado. Também em sistemas linux eu uso dd if = / dev / zero de = zeros bs = 1M para encher o disco inteiramente, mas .. Como faço para preencher o disco rígido até que uma certa quantidade de espaço seja deixada? Eu gostaria disso tanto para linha de comando do Linux ou um script de morcego (windows) Exemplo de um script de shell e um script de lote do Windows seria o melhor! Obrigado!

    
por Rubynator 11.12.2013 / 00:35

2 respostas

4

Você precisa escrever um arquivo real ou os arquivos fictícios são suficientes? O método dd que você está usando será muito lento para unidades grandes. . .

No Windows, você pode usar fsutil file createnew <filename> <length_in_bytes> , que criará um arquivo de preenchimento. Aqui está uma página de technet com mais alguns detalhes .

No linux, fallocate funciona de forma semelhante, por exemplo %código%. Aqui está uma pergunta sobre SU anterior sobre a criação de arquivos de preenchimento, bem como um versão ligeiramente mais técnica no Stack Overflow .

    
por 11.12.2013 / 00:57
0

No Linux, você poderia fazer algo assim para deixar apenas 1M *:

avail=$( df --output=source,avail -BM | grep sda6 | 
        awk '{print $NF}' | sed s/M//i); size=$((avail-left)  ); 
fallocate -l $sizeM filler_file;

O truque é analisar df para obter o espaço disponível e, em seguida, usar fallocate para criar um arquivo com o tamanho necessário. No entanto, como @jjlin apontou out , a chamada fallocate não funcionará em todos os sistemas de arquivos.

Você pode transformar o pequeno script acima em uma função para facilitar o uso e também usar um método alternativo para criar o arquivo quando em um sistema de arquivos que não suporta fallocate (embora fallocate seja muito mais rápido e deve ser preferido sempre que possível). Basta adicionar essas linhas ao seu ~/.bashrc (ou equivalente para outros shells):

fill_disk(){
    ## The space you want left
    left=$1 
    ## The unit you are using (Units are K, M, G,  T,  P, E, Z, Y (powers of 1024) or 
    ## KB, MB, ... (powers of 1000).
    unit=$2 
    ## The target drive
    disk=$3 
    ## The file name to create, make sure it is on the right drive.
    outfile=$4
    ## The space currently available on the target drive
    avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
    ## The size of the file to be created
    size=$((avail-left))
    ## Skip if the available free space is already less than what requested
    if [ "$size" -gt 0 ]; then
    ## Use fallocate if possible, fall back to head otherwise
    fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
    else 
    echo "There is already less then $left space available on $disk"
    fi
}

Você pode iniciá-lo assim:

fill_disk desired_free_space unit target_disk out_file

Por exemplo, para criar um arquivo chamado /foo.txt , que deixará apenas 100 M livres em / ( sda1 ), execute

fill_disk 100 M sda1 /foo.txt

Apenas verifique se o arquivo de destino está na unidade que deseja preencher , a função não verifica isso.

* Não consegui que funcionasse de maneira confiável para tamanhos pequenos, ou ficaria sem espaço ou me daria valores ligeiramente diferentes daqueles que solicitei.

Conforme solicitado, aqui está a mesma coisa que um script:

#!/bin/env/bash
left=$1 
unit=$2 
disk=$3 
outfile=$4
avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
size=$((avail-left))
if [ "$size" -gt 0 ]; then
  fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
else 
  echo "There is already less then $left space available on $disk"
fi

Salve-o como fill_disk.sh e execute assim:

bash fill_disk.sh 100 M sda1 /foo.txt
    
por 11.12.2013 / 07:08