О хранении данных
hardsign — 31.10.2024
Размышляя, куда бы положить локальную копию «Флибусты», в
очередной раз купил sd-карточку на известном сайте. Разумеется, тут
же начал её проверять. Карточка тормозная, скорость записи — около
3 мегабайт в секунду, ну и естественно фальшивая. Никогда, НИКОГДА
не покупайте sd-карточки объёмом больше 32 Гбайт на AliExpress!
У меня, кстати, много лет (тьфу-тьфу-тьфу) в телефоне стоит
карточка на 128 Гбайт, но она куплена ещё на DealExtreme, вот.
А теперь немного технических подробностей о проверке
карточек.
Когда-то давно я написал скриптик, который создаёт файлы, а
потом проверяет их контрольную сумму. Потом выяснилось, что хорошо
бы регулировать размер файла, хорошо бы запускать проверку в
несколько приёмов и так далее. В результате скриптик превратился в
настоящее приложение с азартными играми и прочими атрибутами
красивой жизни.
#!/usr/bin/env bash #
https://habr.com/ru/post/590021/ die() { echo >&2 -e
"${1-}" exit "${2-1}" } usage() { cat
< Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-f
file_size] media_path This script tests the media
availability and I/O speed by creating random files
and checking the hashes. media_path Path to the
media mount point Available options: -h,
--help Print this help and exit -f, --file-size File
size (default=1024M) EOF exit } cleanup() {
trap - SIGINT SIGTERM ERR EXIT # script cleanup here }
setup_colors() { if [[ -t 2 ]] && [[ -z
"${NO_COLOR-}" ]] && [[ "${TERM-}" !=
"dumb" ]]; then
NOFORMAT='\033[0m' RED='\033[0;31m'
GREEN='\033[0;32m' ORANGE='\033[0;33m'
BLUE='\033[0;34m' PURPLE='\033[0;35m'
CYAN='\033[0;36m' YELLOW='\033[1;33m'
else NOFORMAT='' RED=''
GREEN='' ORANGE='' BLUE=''
PURPLE='' CYAN='' YELLOW=''
fi } parse_params() { FILE_SIZE=1024
MEDIA_PATH='' args=("$@") [[
${#args[@]} -eq 0 ]] && usage
while :; do case
"${1-}" in -h | --help) usage ;; --no-color)
NO_COLOR=1 ;; -f | --file-size) FILE_SIZE="${2-}"
shift ;; -?*) die "Unknown option: $1" ;; *)
MEDIA_PATH="${1}" break ;; esac shift
done [[ -z "${MEDIA_PATH-}" ]] && die
"Missing media path" return 0 }
setup_colors for i in printf dd bc tee md5sum cut
do if ! which
${i} >/dev/null; then die
"${RED}${i}${NOFORMAT} NOT FOUND; PLEASE INSTALL";
fi; done set -Eeuo pipefail trap cleanup
SIGINT SIGTERM ERR EXIT parse_params "$@"
if [[ ! -d ${MEDIA_PATH} ]];
then die "Media path not found";
fi if [[
${MEDIA_PATH:(-1)} == "/"
]]; then
MEDIA_PATH=${MEDIA_PATH:0:(-1)};
fi nf=0 while : do
znf=000000${nf}
fn=${MEDIA_PATH}/${znf:(-6)}.bin
nf=$((nf+1)) if [[ -f
${fn} ]]; then printf
"%06s: ${RED}already exists${NOFORMAT}\n"
${znf:(-6)} continue
fi rc=$((/usr/bin/time -f
'%e' dd if=/dev/urandom
bs=1048576
count=${FILE_SIZE} status=none
|\ tee ${fn} | md5sum | cut
-f 1 -d ' ') 2>&1)
tw=$(echo ${rc} | cut -f 1
-d ' ') hw=$(echo
${rc} | cut -f 2 -d '
') LC_NUMERIC=C sw=$(echo
"scale=3; ${FILE_SIZE}/${tw}" | bc)
LC_NUMERIC=C printf "%06s: %5.1f s ${YELLOW}%4.1f
Mb/s${NOFORMAT} %s // " \
${znf:(-6)}
${tw} ${sw}
${hw} rc=$((/usr/bin/time -f
"%e" md5sum ${fn} | cut -f
1 -d ' ') 2>&1)
tr=$(echo ${rc} | cut -f 1
-d ' ') hr=$(echo
${rc} | cut -f 2 -d '
') if [[
${hr} == ${hw}
]]; then
comp=${GREEN}ok${NOFORMAT};
else
comp=${RED}ERROR${NOFORMAT};
fi LC_NUMERIC=C sr=$(echo "scale=3;
${FILE_SIZE}/${tr}" | bc) LC_NUMERIC=C printf
"%s ${YELLOW}%4.1f Mb/s${NOFORMAT} %5.1f s %b\n"
${hr} ${sr}
${tr} ${comp}
done
Когда я понял, что карта фальшивая, создал спор на AliExpress,
но ушлые китайцы потребовали видео, на котором видно, что карточка
врёт. И вот я одной рукой держу телефон, другой набираю в консоли
команды... и в конце пятой минуты оказывается, что файл читается
корректно, и контольная сумма сходится.
Закопался в гугл и оказалось, что Linux очень вольно обращается
с оперативной памятью. В данном случае весь огромный файл просто
кешировался, и естественно, что все данные были корректны.
Хорошая новость заключалась в том, что файловый кеш относится к
общей памяти процесса, и если ограничить память процесса, то не
будет и кеша. Я когда-то слышал слово cgroups
, но
толкового руководства в сети так и не нашёл. Максимум — вот такое.
Ну что ж... режем доступную память до минимума, снимаем процесс
копирования файла на видео... И вот уже AliExpress принял решение
полностью вернуть деньги. Справедливость восторжествовала.
Но где же хранить данные?
Пришлось вспомнить давно забытое кунг-фу и купить обычный
жёсткий диск. А к нему — usb-адаптер с внешним питанием на 12
вольт.

Тарахтит как трактор, выдаёт честных 180 мегабайт в секунду (на
5400 об/мин). Для торрентов — то, что надо. Осталось подключить его
к серверу, и это будет отдельная песня с отдельной картинкой.