Я занимаюсь тестированием продукта на устройствах Apple и Android. Мне нужен скрипт, который будет заполнять жесткий диск устройства до тех пор, пока на диске, с которым он работает, не останется 100 КБ места. Также в системах Linux я использую dd if =/dev/zero of = нули bs = 1M, чтобы полностью заполнить жесткий диск, но .. Как сделать так, чтобы он заполнял жесткий диск до тех пор, пока не останется определенное количество места? Я хотел бы это как для командной строки Linux или сценария летучей мыши (Windows) Пример сценария оболочки и пакетного сценария Windows будет лучшим! Спасибо!
2 ответа
Вам нужно написать настоящий файл или достаточно пустых файлов? Используемый вами метод dd
будет довольно медленным для больших дисков. , ,
В Windows вы можете использовать fsutil file createnew <filename> <length_in_bytes>
который создаст файл-заполнитель. Вот техническая страница с некоторыми подробностями.
В linux fallocate
работает аналогично, например, fallocate -l 10G 10gig_filler
. Вот предыдущий вопрос SU о создании файлов-заполнителей, а также немного более техническая версия Stack Overflow .
В Linux вы можете сделать что-то подобное, чтобы оставить только 1M *:
avail=$( df --output=source,avail -BM | grep sda6 |
awk '{print $NF}' | sed s/M//i); size=$((avail-left) );
fallocate -l $sizeM filler_file;
Хитрость заключается в синтаксическом анализе df
чтобы получить доступное пространство, а затем с помощью fallocate
для создания файла необходимого размера. Однако, как отметил @jjlin, вызов fallocate
не будет работать на всех файловых системах.
Вы можете превратить вышеприведенный маленький скрипт в функцию, чтобы упростить его использование, а также использовать альтернативный метод для создания файла в файловой системе, которая не поддерживает fallocate
(хотя fallocate
намного быстрее и должен быть предпочтительным, когда это возможно), Просто добавьте эти строки в ваш ~/.bashrc
(или эквивалент для других оболочек):
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
}
Затем вы можете запустить его так:
Заполнить_диск нужный_свободный_объект целевой_диск out_file
Например, чтобы создать файл с именем /foo.txt
, который оставит только 100M свободным для /
(sda1
), запустите
fill_disk 100 M sda1 /foo.txt
Просто убедитесь, что целевой файл находится на диске, который вы хотите заполнить, функция не проверяет это.
* Я не мог заставить его работать надежно для небольших размеров, либо он исчерпал бы пространство, либо дал бы мне немного отличающиеся значения от тех, которые я запрашивал.
В соответствии с запросом, то же самое, что и скрипт:
#!/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
Сохраните его как fill_disk.sh
и запустите так:
bash fill_disk.sh 100 M sda1 /foo.txt