Аннотация
Запуск Raspberry Pi с полной поддержкой графики на microSD, навсегда остающейся в режиме read-only после установки системы. Отсутствие какой-либо записи данных на флэш-память повышает надёжность устройства, приближая его к промышленному классу изделий. Пошаговая инструкция. Небольшой театр инженерного абсурда для развлечения аудитории.
Мне понадобилось сетевое устройство с открытым кодом и выходом HDMI, и я решил попробовать Малиновый Прог. Да, я именно так предлагаю переводить Pi: Прог. Понятное дело, даже одноплатнику нужна операционка. И вот, захожу я на официальный сайт, ожидая встретить там подробное руководство по созданию суровой, неломаемой Вещи a la turnkey box. Но народ, как ни в чём не бывало, устанавливает Ubuntu (т.е. Raspbian Jessie) прямо на microSD, размещая и swap там же. Как обычный десктоп, face palm.
Но то цветочки. Малиновые ягодки — это проекты фоторамок из МалинПрога, требующие обязательного выключения кнопкой. Иначе фоторамка после сбоя питания может не заработать, вместо картинок предлагая воспользоваться fsck. Но и это не предел, под катом читателя ждёт настоящий шедевр инженерного абсурда, найденный автором на просторах сети.
Итак, по стандартной инструкции нормальный одноплатник превращается в раздутый десктоп со средним временем жизни год-полтора, пока изношенная флэшка не сдохнет, превратив в общем-то хороший девайс в кирпич. И большинство людей, похоже, это вполне устраивает. Меня — нет.
Куда мир катится
Прежде чем открывать спойлер, оденьте защитную маску, либо заранее возьмитесь руками за голову.
Ладно, не буду отрицать самостоятельной полезности аппаратного взбадривателя: это реальный лайф-хак для тех, у кого почасовая оплата идёт за сидение перед монитором. Или для поддержания в тонусе какого-нибудь особо
/etc/lightdm/lightdm.conf
:...
xserver-command=X -s 0 -dpms -nocursor
...
Флажок
-nocursor
убирает долой из центра экрана неподвижную стрелку курсора. А вместо нейтрализации скринсейвера можно просто закомментировать его запуск в файле ~/.config/lxsession/LXDE/autostart
. Если это не помогает, можно повесить по cron(8)
с интервалом 718 минут команду xscreensaver-command -deactivate
(это уже стёб, дорогие читатели ;-)Я поступил просто: принял LightDM с автовходом, но оставил в файле
~/.config/lxsession/LXDE/autostart
лишь вызов feh с префиксом '@' для перезапуска в случае аварии и соотв. параметрами. Т.е. как бы обычная графика, но без lxpanel
, без pcmanfm
, без xscreensaver
, с отключённым DPMS и скрытым курсором несуществующей мыши.Минимальную графику очень легко получить командами
apt-get
и правкой файла autostart
, причём в системе будет всё необходимое для жизнедеятельности стандартных приложений, включая X-сервер, менеджер окон, менеджер сеансов и менеджер дисплея с автовходом пользователя. Но пока это ещё не Вещь, а всего лишь одноплатный десктоп.UPD
Пользователь Jaromir предлагает вообще отказаться от менеджера дисплея и использовать unclutter в тех случаях, когда мышь изредка требуется. Эта утилита скрывает курсор, если мышь находится в покое достаточно долго.
Пользователь Spider55 рекомендует вместо LightDM использовать noDM. Считаю весьма разумным, но тогда пошаговая инструкция чуть меняется.
Задача
Сферический одноплатник в вакууме — это скучно. Не для того на Малиновом Проге целая гребёнка GPIO с I2C/PWM, а также всякие CSI-DSI и сторожевой таймер. Но я в качестве практического примера использую всё-таки сетевой демонстратор с HDMI-выходом, добавив возможность нескольким пользователям по очереди «захватывать» общий экран-табло и транслировать на него свой рабочий стол, не вставая с кресла. Экран повёрнут лицом в сторону гостей, в состоянии покоя тихонечко перебирает случайным образом картинки, выложенные в сети. Если надо показать гостю продукт, один из сидящих за стойкой администраторов временно превращает табло в «зеркало» своего монитора, но потом освобождает его для другого админинистратора. В моём случае это реальный бизнес-инструмент, висящий в реальном торговом зале. Кстати, благодарю пользователя Sauron за подсказку.
Однако, глянув на размер этой публикации, я решил отложить описание прикладного решения (т.е. собственно видеомодуля) в отдельную статью. Пока позвольте сфокусироваться на изначальной задаче: заставить Raspberry Pi загружаться и работать с microSD в режиме read-only, не боясь отключения питания и не запиливая флэш-память мусором.
Теория вопроса
Даже очень серьёзная файловая система с журналом в конечном итоге не может проконтролировать процессы, происходящие внутри SD-носителя при отключении питания. Например, серьёзные SSD-накопители для использования в ЦОД имеют конденсаторы, разряда которых как раз хватает на закрытие последней транзакции записи, и даже остаётся ещё немного. А что с отключением питания в microSD? Я уверен, там конденсаторов достаточной ёмкости нет, зато есть ненулевая вероятность того, что запись страницы NAND-памяти не успеет завершиться. И потом драйвер файловой системы от прочитанного придёт в такое недоумение, что потребуется ручное вмешательство оператора. Вот вам и фоторамка с fsck.
Насколько сложно перевести microSD Raspberry Pi в режим read-only методом Микеланджело, т.е. убирая лишние службы и пакеты? Достаточно просто, если нет графики (ссылка). Но стоит пустить в систему иксы с этими их многочисленными менеджерами всего, начинается долгий и нудный поединок с непредсказуемым результатом. Это вам не иголка в стоге сена, её хотя бы магнитом можно вытянуть. Представьте, что неизвестное количество иголок спрятаны в клубке из колючей проволоки, да ещё обильно присыпаны гвоздями. Какой там поиск иголок, не убиться бы насмерть.
Лемма: для выполнения даже самой элементарной новой функции линукс-система всегда подтянет кучу ненужных зависимостей, причём даже с «лёгкой» графикой рост системной энтропии получается кратный.
Теорема: в любом конечном наборе программных пакетов всегда найдётся бесконечно малый кусок кода, который попытается записать один бесконечно бесполезный бит на файловую систему, смонтированную в read-only, чем вызовет фатальную ошибку, повалит всю систему и перечеркнёт многочасовые усилия оператора.
Решение: UnionFS
Один немец несколько лет назад придумал очень красивый способ собрать все эти иголки в корыто с помощью UnionFS и просто сжигать их в печи при каждой перезагрузке. К сожалению, оригинальный пост уже погиб вместе с хостившим его доменом, но немец точно не одинок. Благодарные читатели сохранили идею, я считаю просто необходимым опубликовать её здесь.
Суть в том, что поверх постоянной «подложки» (read-only файловой системы на microSD) при каждом включении создаётся временная «нашлёпка» в ОЗУ, поглощающая всю ненужную энтропию и «сгорающая» при выключении питания устройства. Файловая система на microSD всё время остаётся read-only, и потому риск её повреждения снижается почти до нуля, как и риск преждевременного износа флэшки.
noatime
не поможет, нужен аппаратный ключ на microSD. Иначе как объяснить тот факт, что по /sys/block/mmcblk0/stat
у меня оказалось считано 282612 секторов, а записано аж 96, и это в режиме read-only? Ладно, хоть соотношение почти 3000:1, на обычной системе оно 5:1.UPD:
Пользователь gattopazzo83 указал мне на промышленную память Flash Media Kit производства известной фирмы Харлампий-Панкрат (теперь уже Эдуардович). Раз у неё 100,000 циклов записи, это точно SLC-память в формате microSD. Даже если уважаемый читатель использует файловую систему в read-only, для серьёзных проектов я настоятельно рекомендую потратиться на промышленную память, это практика крепсондо («до» по-японски означает «путь» ;-)
UPD:
В комментариях достаточно длинная дискуссия вышла у меня с пользователем doga, в результате которой я «открыл» для себя простой способ получать внутреннюю информацию об используемой SD-карточке прямо из командной строки RPi. Пользователь doga в долгу не остался и указал на пакет mmc-utils, который тоже читает внутренности SD-карточки, но готового порта для Raspbian я не увидел. Что-то помещаю в спойлер, который, видимо, будет пополняться и раздуваться.
SD-внутренностиКоманда:udevadm info -a -n /dev/mmcblk0
Можно увидеть «сырые» регистрыCID
иCSD
, из них код изделия (name
), серийный номер (serial
), дату производства (date
), идентификаторы производителя (hwrev, fwrev, oemid, manfid
). Расшифровку можно найти на сайте www.sdcard.org в разделе загрузок «упрощённых» спецификаций (Simplified Specifications), см. Part 1 Simplified, Physical Layer Simplified Specification.
Очень интересный объектstat
, структура которого описана прямо на kernel.org. Эта информация сбрасывается при перезагрузке, но по ней можно оценить среднесуточную нагрузку на чтение и запись.
Коды производителей где-то точно лежат, но я их нашёл только в исходниках lsmmc.c.
«Пробить по базе» карточку можно хотя бы в разделе RPi SD cards на сайте Embedded Linux, это просто отзывы пользователей.
Самое интересное — данных износа — пока не увидел, хотя утилиту mmc-utils собрал, но пока запустить её не удалось.
Недостатки
Какие минусы, помимо «сгорания» логов? Устройства без аппаратных часов при старте всегда считают, что на дворе 1 января 1970 года, и пребывают в этом заблуждении вплоть до подъёма сетевого стэка и доступности NTP. Поэтому на момент данной публикации целый ряд файловых объектов «нашлёпки» будут примерно на 46 лет моложе, чем им кажется. С другой стороны, несколько секунд от начала эпохи — уже не ноль.
UPD: часы реального времени
Пользователь st1373 в комментариях напомнил о наличии I2C-совместимых часов реального времени DS3231 (стоимостью примерно в полтора рулона туалетной бумаги). Есть и нехитрая инструкция на русском: Подключение RTC (часов реального времени) к Raspberry Pi.
Безопасность
Обновления безопасности накатывать на такую систему довольно неудобно. Но, опять же, взломать такую Вещь несколько сложнее, чем эксплуатировать уязвимость Adobe Flash в браузере обычного десктопа. Вредоносный код должен открыть файловую систему на запись, чтобы закрепиться в ней, иначе он «сгорит» при перезагрузке вместе с логами и мусором. Упомянутая ниже SquashFS усложняет изменения ещё больше. Однако все эти преимущества справедливы ровно до того момента, пока вся выпоняемая масса кода «замкнута» в read-only зонах, т.е. когда защищённая «подложка» не делает вызовов команд, расположенных в записываемых областях: именно это и есть (будет?) приоритетным вектором заражения в Интернете Вещей. Будьте внимательны со стартовыми скриптами, они выполняются с правами root, одно неверное движение — и это критическая уязвимость инфраструктуры домашнего очага, постоянно подключённой к Интернету.
Пошаговая инструкция
Поскольку я впервые в жизни установил Rasbian Jessie и особо не верю в долговечность microSD даже в read-only, то решил записать все шаги подробно. Вдруг понадобится повторить.
DISCLAIMER
Извините за переносы строк. Все команды запускаются с правамиroot
, но аккуратный читатель может использовать каждый разsudo
. Честно говоря, я не понимаю, зачем каждую команду запускать черезsudo
, будто это защитит от чего-то. Вот скажите, когда вы в последний раз *не были* уверены, что хотите удалить данный файл в корзину? Это как выпить пять бокалов пива по пол-литра, но на дорожку ещё налейте один 0.33, пожалуйста, а то мне уже хватит… Я дам неправильный совет: если уж взялись за эти игрушки, выходите наroot
командойsudo bash
, не занимайтесь самообманом.
1. Инициализация
Установите Raspbian Jessie Lite. Утилитой
raspi-config
задайте региональные настройки и пароль пользователя pi
. Подключите сеть, Debian — дитя широкополосного доступа. Загрузку в графику пока не включайте.apt-key update
apt-get update
2. Установка и удаление программ
С графикой, установка:
apt-get install --no-install-recommends tightvncserver xtightvncviewer xserver-xorg xinit lxde-core lxappearance lightdm feh xprintidle policykit-1 busybox-syslogd ntpdate watchdog unionfs-fuse
Удаление:
dpkg --purge rsyslog
apt-get remove --purge wolfram-engine triggerhappy cron anacron logrotate dphys-swapfile fake-hwclock
apt-get autoremove --purge
Пакеты
tightvncserver, xtightvncviewer, xprintidle и feh
понадобились мне для частной задачи, можете обойтись без них.Если без графики, вам *не* понадобятся также:
xserver-xorg xinit lxde-core lxappearance lightdm policykit-1
.3. Создание графического окружения
Теперь утилитой
raspi-config
можно включить автозапуск в графическом режиме с автовходом, который будет с правами пользователя pi
. Чем зацикливаться на sudo
, лучше поставить сильный пароль пользователю pi
, и не использовать pi
для автоматического входа в графический интерфейс. Вместо этого создать пользователя pu
и запускать «иксы» с его правами. Причём командный интерпретатор (default shell) этого пользователя лучше либо отключить совсем (поставив /usr/sbin/nologin
), либо подменить специальным скриптом типа /usr/local/bin/pu
. Об этом я намерен рассказать в другой публикации, посвящённой видеотабло с удалённым управлением по SSH, ради чего и создаётся отдельная учётная запись с пониженными правами. Ещё раз благодарю Sauron et al.adduser --home /home/pu --shell /usr/local/bin/pu --uid 990 --gecos "RPi p-u" --gid 1000 pu
mkdir -p /home/pu/.config/lxsession/LXDE
cp -p /etc/xdg/lxsession/LXDE/desktop.conf /home/pu/.config/lxsession/LXDE/desktop.conf
touch /home/pu/.config/lxsession/LXDE/autostart
chown -R pu:pi /home/pu
sed -i 's/^#\?xserver-command=.*$/xserver-command=X -s 0 -dpms -nocursor/' /etc/lightdm/lightdm.conf
sed -i 's/^#\?autologin-user=.*$/autologin-user=pu/' /etc/lightdm/lightdm.conf
Вместо двух последних команд можете открыть редактором
/etc/lightdm/lightdm.conf
и задать значения двух параметров, первый я уже упоминал выше, второй говорит сам за себя:...
xserver-command=X -s 0 -dpms -nocursor
...
autologin-user=pu
...
4. Сторожевой таймер (по желанию)
У меня Raspberry Pi 3 Model B, поэтому ядерный модуль сторожевого таймера зовут так:
modprobe bcm2835_wdt
echo "bcm2835_wdt " | sudo tee -a /etc/modules
Затем добавляем следующую строку в секцию
[Install]
в конце файла /lib/systemd/system/watchdog.service
:[Install]
WantedBy=multi-user.target
После этого включаем службу:
systemctl enable watchdog.service
Сторожевой таймер в минимальной конфигурации должен сработать, если зависло ядро. Но есть ещё много других вариантов, например, по чрезмерной нагрузке на систему, по истечению памяти, по перегреву системы, по отсутствию сигнального файла и т.д. См. также
watchdog(8)
и watchdog.conf(5)
5. Параметры старта
Я отключил отображение малинового лого и swap-файл, включил быструю загрузку. Для этого добавил в
/boot/cmdline.txt
буквально три слова logo.nologo fastboot noswap
. У меня в итоге получилось так:logo.nologo dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap
6. Запечатывание корневой файловой системы Raspberry Pi в read-only
Вот теперь мы добрались, наконец, до главного.
Ниже скрипт, который следует расположить под именем
mount_unionfs
где-нибудь в /usr/local/bin
. Не забудьте включить биты выполнимости +x (chmod
755 или 555). Обратите внимание на суффиксы .orig
и .rw
, они должны совпадать с подготовкой (далее):#!/bin/sh
DIR=$1
ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab)
if [ $ROOT_MOUNT = "rw" ]; then
/bin/mount --bind ${DIR}.orig ${DIR}
else
/bin/mount -t tmpfs ramdisk ${DIR}.rw
/usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}.rw=RW:${DIR}.orig=RO ${DIR}
fi
Из других инструкций я решил воспользоваться советом и сделать следующее:
insserv -r bootlogs
insserv -r alsa-utils
rm -rf /var/lib/dhcp/
ln -s /tmp /var/lib/dhcp
Графические приложения очень любят записывать в
/home
что-нибудь ненужное, поэтому в дополнение к /etc
и /var
я включил ещё и /home
. Подготовим разделы к переключению в режим UnionFS (внимание на суффиксы .orig
и .rw
):
cp -al /etc /etc.orig
mv /var /var.orig
mv /home /home.orig
mkdir /etc.rw /var /var.rw /home /home.rw
Наконец, файл
fstab(5)
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat ro 0 2
/dev/mmcblk0p2 / ext4 ro 0 1
mount_unionfs /etc fuse defaults 0 0
mount_unionfs /var fuse defaults 0 0
mount_unionfs /home fuse defaults 0 0
none /tmp tmpfs defaults 0 0
7. Аудит системы и тест
Окиньте взглядом систему, уберите за собой
.bash_history
, всякие лог-файлы и т.д. Учтите, что они сейчас могут находиться не там, где обычно (например, в /var.orig
вместо var
).Перезагрузите систему и посмотрите, что получилось. Если была допущена ошибка, есть большие шансы, что система уйдёт в single user и просто запустит консоль
root
. Если файловая система цела, перемонтировать её из read-only в read-write довольно просто:mount -o rw,remount /
Если же система загрузилась нормально в read-only и выполняет все функции, поздравляю!
Это родилась Интернет-Вещь.
8. Распечатывание файловой системы
Если нужно распечатать систему, сперва верните коневую систему в состояние read-write (см. выше). Затем закомментируйте в
fstab(5)
строки, начинающиеся со слова mount_unionfs
, после чего *обязательно* верните на место каталог /var.orig
со всем содержимым (и желательно /home.orig
тоже). Если не восстановить /var
, потеряете базу установленных пакетов, но ведь именно ради установки обновлений безопасности командой apt-get
вы только что распечатали систему, не так ли? Перед apt-get
перезагрузите систему и убедитесь в её адекватности. Как запечатывать обратно, знаете;)Альтернативы
Уважаемых читателей, которые знают готовые промышленные образы операционных систем (с поддержкой read-only) для Raspberry Pi и других одноплатных компьютеров, приглашаю делиться в комментариях. Надеюсь, с вашей помощью я смогу информационно обогатить этот раздел и других читаталей, резидентов и гостей уважаемого портала Geektimes:)
UPD: OverlayFS
Уважаемый ValdikSS упомянул проект OverlayFS, который вошёл в ядро Linux в 2014г, уже после оригинального немецкого поста, а такжеinitramfs
. Проект Domoticz, у которого есть и готовый образ для Малинового Прога, может использовать OverlayFS. И заодно ещё раз поблагодарю Sauron за комментарий про Domoticz.
UPD: SquashFS
Пользователи Vooon, Vcoderlab, av_in et al справедливо упомянули в комментариях SquashFS. И даже википедия отмечает, что данная система удачно ложится «под»union mount
, также аккумулируя энтропию записи исключительно в ОЗУ для последующего уничтожения. Однако не стоит забывать, что SquashFS by-design всегда остаётся read-only, т.е. речь идёт скорее о серийном изготовлении firmware-прошивки, с соответствующим (длинным) циклом тестирования, но это не главное. Обновление критических уязвимостей, особенно на раздутых системах, очень сильно удорожает подобные проекты. И не только я считаю, что именно критические уязвимости в IoT будут определять ландшафт информационной безопасности в ближайшие лет десять. Нет ничего невозможного, но даже если уважаемый читатель настолько подкован, что может изготовить стабильный образ системы на SquashFS, стоит ли он двух-трёх Малиновых Прогов? Впрочем, это всего лишь вопрос времени, и мы с вами скоро увидим больше удачных community-проектов для Интернета Вещей на базе SquashFS, в т.ч. и для Raspberry Pi. Например, OpenELEC.
UPD: F2FS
Пользователь nlykl упомянул F2FS aka «Flash-Friendly File System», и на тему МалинПрога есть даже HOWTO: Replace the micro SD card's ext4 root partition by f2fs on the Raspberry PI. DISCLAIMER: мною не проверялось. См. также обзор F2FS в одном онлайн-журнале.
Что касается аппаратных альтернатив самому Малиновому Прогу в контексте прикладной задачи (сетевой HDMI-свисток), то я случайно наткнулся на один обзор, который, впрочем, намерен обсудить отдельно. Чисто экономически Raspberry Pi весьма выгоден, это пока главное:)
UPD:
Находится ли моя система в зоне риска?
Именно этот вопрос и задаёт себе рациональный читатель. К сожалению, индустрия флэш-памяти для Интернета Вещей только начинает вырабатывать аппаратные механизмы, аналогичные S.M.A.R.T для HDD и SSD. SanDisk, кстати, уже пошёл по этому пути, встроив метрики износа в структуры EXTCSD. И когда нужные стандарты более-менее устаканятся, появится поддержка в ядре Linux и утилиты командной строки. А там, глядишь, и аналогsmartd(8)
для встраиваемых систем появится.
Но получить ответ на вопрос «сколько моя Linux-система записывает на SD-карточку в сутки/неделю» можно уже сейчас, нужно только продержать систему включённой достаточно долго, чтобы статистика получилась точнее (т.е. желателен uptime порядка месяца, или хотя бы 10 дней). Итак, заходим в систему и делаем две команды (без sudo и root):
uptime -p cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB (%.1f%% I/Os merged) written: %.3f MiB (%.1f%% I/Os merged)\n", $3*512/1048576, $2/$1*100, $7*512/1048576, $6/$5*100}'
Первая в комментариях не нуждается, а вторая напишет объёмы считанных и записанных данных с момента старта системы, в мегабайтах, а также «кучность» запросов. Например, пользователь Meklon в комментариях весьма любезно поделился цифрами медиа-центра, работающего на базе openELEC / KODI. Примерно за 6 дней система считала порядка 72Мб и записала менее 66Мб. Примечательно соотношение чтение/запись близкое к 1:1, что я связываю с использованием SquashFS (она распаковывает файловую систему в ОЗУ и потому SD-карточку почти не трогает даже на чтение). Классические же системы имеют показатель чтение/запись от 5:1 до 10:1, но он может сильно варьироваться. Однако главное в том, что 10Мб в сутки — это существенно меньше автомобильного регистратора, система с такими параметрами весьма долговечна.
Но помимо статистического подвоха, в такой методике есть ещё один чисто технологический изъян: запись на флэшку производится не блоками по 512 байт, а страницами неизвестного размера. В докладе Optimizations for Cheap Flash Media автора Arnd Bergmann (ссылка, англ.) сказано довольно много интересного по поводу внутренней «кухни» флэшек, в т.ч. упомянут размер страницы 32кБайт. И если принять самый неудачный сценарий «кучности» записи, то каждый блок 512 байт вынудит записать одну страницу, т.е. объём фактически записанных данных получится в 64 раза больше, чем говоритstat
.
Как только автор наберёт достаточно материала, будет продолжение в отдельной публикации.
Ссылки
Make Raspbian System Read-Only
blog.pi3g.com/2014/04/make-raspbian-system-read-only
(источник)
How to make RaspberryPi truly read-only, reliable and trouble-free
k3a.me/how-to-make-raspberrypi-truly-read-only-reliable-and-trouble-free
(без графики)
Protect your Raspberry PI SD card, use Read-Only filesystem
hallard.me/raspberry-pi-read-only
(прислал sisaenkov, улучшенная версия, но тоже без графики)
Stopping SD Card Corruption on Raspberry Pi’s Raspbian
ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi
(без графики)
Raspberry Pi как информационное табло — с помощью VNC на localhost
habrahabr.ru/post/212661
Подключение RTC (часы реального времени) к Raspberry Pi
raspberrypi.ru/blog/598.html
(использует I2C-совместимые часы DS3231)
ECIO(TM), a powerful USB programmable single chip computer based on PICmicro microcontroller technology
www.matrixtsl.com/product.php?Prod=ECIO28P
Easy Raspberry Pi Based Screensaver/Slideshow for Exhibitions/Store Front
www.instructables.com/id/Easy-Raspberry-Pi-Based-ScreensaverSlideshow-for-E
(у меня вызвал искреннее недоумение шаг 6)
Flash memory card design (2013)
wiki.linaro.org/WorkingGroups/KernelArchived/Projects/FlashCardSurvey
(почему флэшка накрывается гораздо раньше, чем мы ожидаем? польза и вред от оптимизации внутренней логики под FAT; классификация контрафактных продуктов; каталог флэшек 2013г)
Optimizing Linux with cheap flash drives, Arnd Bergmann, 2011
lwn.net/Articles/428584
(иллюстрированная статья)
Optimizations for Cheap Flash Media, Arnd Bergmann, 2011
free-electrons.com/blog/elce-2011-videos
(видео выступления на английском, запись любительская, но интересная)
SD Association, Simplified Specifications, Part 1 Simplified: Physical Layer Simplified Specification
www.sdcard.org/downloads/pls/index.html
Block layer statistics in /sys/block/<dev>/stat
www.kernel.org/doc/Documentation/block/stat.txt
(как оценить износ SD-карточки с момента запуска системы: запуститеcat /sys/block/mmcblk0/stat
и потом сразуuptime -p
)
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (179)
Sun-ami
18.12.2016 01:40+3Не знаю как для Raspberry Pi, а для микроконтроллеров проблема закрытия транзакции записи в flash-память решается например так: Детектор питания настраивается на такой порог, ниже которого в норме напряжение не должно опускаться, но при котором МК и флешка ещё должны нормально работать. Перед началом транзакции записи проверяется, не вышло ли питание за этот порог, и если вышло — начало записи откладывается до нормализации питания. При этом до завершение транзакции записи питание обеспечивается конденсаторами на плате. Если встроенного детектора нет (а в STM32 он есть) — используется внешняя микросхема монитора питания, обычно с жестко заданным порогом. Возможно в Raspberry Pi есть такой детектор? С SD-картами по-моему всё несколько сложнее чем с SPI-флешками — у них похоже есть внутренний кэш страницы с задержанной записью. Причём в тех открытых версиях стандарта, что мне попадались, команда принудительной выгрузки кэша не описаны, но она должна существовать, и её нужно выдавать при просадке питания.
teleghost
18.12.2016 02:35+1благодарю, неплохо описано; я так понимаю, на рынке МК описанные внутренности просто must have, чтобы этот рынок не прое#@ть :)
пока же у меня создалось ощущение, что на рынке любительских платформ для Вещей дела обстоят по-детски наивно; а что там с питанием SD-ридера в МалинПроге, я даже боюсь подуматьFloppyFormator
18.12.2016 15:23Так это относится к питанию изделия в целом. В той же Pi в цепи питания наверняка есть конденсаторы, а если нет — их можно добавить.
В худшем случае, если нет возможности измерить напряжение на входе, можно поставить там компаратор с выходом на одну из ног GPIO: как только напряжение упадёт, ОС получит сигнал, на который отреагирует командой sync && mount / -o remount,ro.LynXzp
19.12.2016 21:24+1Жирный понадобится конденсатор, возможно даже Li-Ion, с учетом медлительности RP и потребления почти 5Вт.
teleghost
21.12.2016 05:00+1нагруженная по ЦП и увешанная периферией USB модель 3 может и 10Вт потреблять: стандартная рекомендация — блок питания 5В 2.5А
конечно, всё это в железе должно быть, но есть или нет — я пока не знаю, в руки взял RPi меньше месяца назад, чисто попробовать; вот и напробовал на статьюFloppyFormator
21.12.2016 10:24Да, с таким потреблением ионистор на 1,5Ф даст примерно 0,75с, в течение которых напряжение питания упадёт до 4В. Обработка bash-команды может затупить, но если сэмулировать Alt+SysRq+U, ядро должно успеть.
x893
18.12.2016 01:58+2Лет 8 назад развлекался с read-only centos для небольших телефонных станций на asterisk. Помню, что монтировалось в read-only и так же в памяти всякая временная хрень. Работали по года 2 без проблем. Использовался переходник с IDE на SD. Графики конечно не было никакой.
Но потанцевать с бубном много пришлось. Практически академию бубна закончил.electronus
18.12.2016 08:59+1Да, эксперименты с астериском на малине быстро вернули меня в опенврт и роутерное железо, где ридонли фс — норма жизни. Теперь до этого додумались на малине…
Sauron
18.12.2016 03:26Кстати, нашел тут кое-что по поводу RAM disk-а для Pi: https://www.domoticz.com/wiki/Setting_up_a_RAM_drive_on_Raspberry_Pi
Люди запускают не инфотабло/слайдшоу а domoticz (решение для «умного дома»), но проблему решают ту же — смерть SD при продолжительном использовании. Правда не так радикально — в RAM диске всего одна папка.
Возможно есть вариант расширить это на home папку пользователя (а также и на swap и что там еще), и при старте заполнять ее заранее заготовленной копией с SD карты.Sauron
18.12.2016 03:35+ тема на форуме Распбери: https://www.raspberrypi.org/forums/viewtopic.php?f=37&t=63996
+ вариант переноса большей части FS на USB носитель (SD карта все равно требуется, т.к. Распбери загружается ислючительно с SD, но писать на SD он уже не будет, насколько я понял): http://www.instructables.com/id/Boot-the-Raspberry-Pi-from-USB/
teleghost
18.12.2016 03:42про swap шутка, видимо;)
Sauron
18.12.2016 03:44Я на ночь глядя уже не соображу — вроде ж есть swap файл у raspbian: http://raspberrypi.stackexchange.com/questions/70/how-to-set-up-swap-space
P.S. Пишут что есть, включен по умолчанию
http://raspberrypimaker.com/adding-swap-to-the-raspberrypi/
Raspian uses a script dphys-swapfile to manage swap. The standard image includes this turned on by default. The configuration files is located at /etc/dphys-swapfile. Theonly parameter in the file is CONF_SWAPSIZE=100 which creates a 100MB swapfile in /var/swap.
teleghost
18.12.2016 03:47да, но не в RAM же его
Sauron
18.12.2016 03:49Хм, вроде как да — куда в RAM когда swap нужен когда RAM-а не хватает. Но и на SD ж не надо писать. Chicken and egg?
Но если еще подумать — допустим половину RAM-а мы отрезаем под RAM disk. Когда вторая половина (та, которая так сказать «RAM RAM») переолняется — пусть свопит в первую (ту, которая «RAM disk»), чего уж там. Так что таки swap в RAM, и «это норма» :D
Иначе прийдется совсем отключить swap. Вероятно наиболее логичный вариант, но надо нагуглить как.teleghost
18.12.2016 13:48отключить swap очень просто: в /boot/cmdline.txt добавить
noswap
и снестиdphys-swapfile
Fox_exe
18.12.2016 15:04+1Ещё вариант для безумцев — zRam (Тотже рамдиск, куда можно всунуть Swap, но при этом с сжатием-на-лету).
nlykl
18.12.2016 18:48+1Хороший вариант, на старом телефоне с Android 4.0.3 и 512 МБ памяти только им и спасался.
teleghost
18.12.2016 21:35да, компрессия — это единственная причина делать swap в ОЗУ; медленно и энергоёмко, но хоть как-то
Deerenaros
24.12.2016 11:10-1Ни чё се медленно. Очень даже быстро, компрессия к слову используется в графических платах для увеличения пропускной способности. А там гигабиты в секунду, пуская и энтропия чрезвычайно невелика. У самого archlinux и 8 гигов RAM, так половину в zram отправил, компрессия хрома достигает 10%, что практически снимает вопрос о его прожорливости.
teleghost
24.12.2016 11:55Deerenaros, если верить примитивным тестам на Doom и Quake 2 и сопоставлять их с официальным источником, то производительность загруженного по всем ядрам ARM Cortex A53 получится в 2-3 раза меньше, чем у старого десктопного Core i3 3220 (выпуска 2012 года). А если работает одно ядро, то Model 3 примерно в десять раз медленнее 4-летнего десктопа нижнего ценового ряда.
Когда я запустил слайд-шоу feh на фотках с паузой 7 секунд, сперва не мог понять, почему слайды меняются непредсказуемо каждые 10-12 секунд. Пока не глягул на загрузку ЦП: подгонка каждого фото профессиональной зеркалки под Full HD у BCM2837 как раз и занимает эти несколько секунд. Одно ядро пашет, три других курят, но это feh.
Вы тут упоминаете 8 гигов RAM, но у десктопа только на один ЦП подводится 50..100Вт мощности, а на видео может подводиться вообще сколько угодно. Компрессия в графических ускорителях? Видимо, даже 16-рядный PCI Express является бутылочным горлышком, в которое дешевле закачивать поток под давлением, ибо электрическая мощность в избытке. Про энтропию не буду комментировать.
У нас на весь одноплатный компьютер где-то 12Вт. Поэтому да, это будет медленнее, чем на десктопе, и когда у нас только 1Гб ОЗУ без возможности расширения, надо хорошо подумать, сколько на что отводить.
Но за 10-кратное сжатие расхода Chrome спасибо, кому-то пригодится.Deerenaros
24.12.2016 16:28+1Про энтропию я имею в виду, что сжимать текстуры проще, тем более с потерями, чем любую информацию. И нет, не 16-разрядный PCI Express является горлышком. А высокая стоимость hispeed памяти неоправданно дорогой. Топовые карточки и без сжатия хорошо играются, а вот middle сегмент очень ограничен в пропускных возможностях.
У малинки есть классный видеоускоритель, который можно использовать для быстрой работы с изображениями. Ясное дело, feh такого не умеет.
Тут надо уточнить, что свапуется всё подряд, и отправить конкретно хром в свап не так то просто. Но в целом, хотя бы 40%-60% сжатие стабильно присутствует, что по сути как минимум удваивает количество RAM. А в случае интенсивного использования хрома, zram вероятнее утраивает, а порой даже удесятеряет. Меня порой удивляет, почему сами разработчики chromium не могут сами сжимать память различными методами, более эффективными.
ilmarin77
21.12.2016 01:40Кстати, у малинки swapiness пи умолчанию стоит 60, т.e когда занято 40% RAM малинка начинает подумывать о сбросе данных в свап. Если поставить swapiness в 0, то он будет использоватся только когда по-другому никак.
( https://help.ubuntu.com/community/SwapFaq/#What_is_swappiness_and_how_do_I_change_it.3F )teleghost
21.12.2016 02:11спасибо за комментарий, но лично я считаю, что без SLC-памяти swap лучше отключить совсем, прописав
noswap
в/boot/cmdline.txt
т.е. если без swap никак, надо сразу покупать HPE Flash Media Kit или аналог, в противном случае система может и полгода не протянутьilmarin77
21.12.2016 02:44+1эта комманда по идее вляет только на автоматическое использование swap раздела из fstab — смотри код init.d/checkroot.sh
А в малинке используется swap в файл /var/swap ( пакет dphys-swapfile ).
teleghost
18.12.2016 15:58Sauron, благодарю за Domoticz, посмотрите вот это: Setting up overlayFS on Raspberry Pi
sisaenkov
18.12.2016 16:43Использую Domoticz, и несчастная SD-карта от SanDisk рушилась чуть ли ни каждую неделю.
Купил Transcend, перевел ее в read-only по этой статье и всё стало отлично.
Единственное, надо для некоторых служб создавать логи на ram-диске до их загрузки.teleghost
18.12.2016 17:01да, спасибо, но это чуть улучшенная версия варианта «без графики» в моих ссылках; тем не менее, я добавил Вашу ссылку, она полезна
напомню, у меня-то идея как раз с графикой заставить работать
по поводу же Domoticz — а не пробовали с OverlayFS? я ссылку на их wiki чуть выше уже далsisaenkov
18.12.2016 19:00Пока не дошел до OverlayFS. Статью в вики видел еще когда только перешел на Domoticz.
Исхожу из принципа: работает — не трогай. Тем более, что Domoticz живет на USB-флешке, на которую и производится вся запись. SD-карта целиком read-only.
av0000
19.12.2016 10:04Похожая картина с OpenHAB.
Использование под, собственно, OpenHAB плюс самописный скрипт для записи с двух видеокамер. Jpeg-и с камер писались в память (tmpfs), склеивались аппаратным кодеком и кидались на внешний HDD. Для системных логов был сделан самописный скрипт по типу ramLog, только под systemd.
Через примерно 5 месяцев начались глюки. Думал, умирает внешний SSD (из древних, что-то типа kingston/x25 40Gb). Оказалось, openHAB так «гадит» в свои логи, что всему raspbian-у и не снилось. Итог — «пафосный» sandisk на 32Гб от Юлмарта запилен до read-only
Сейчас: загрузка с sd, запуск ramLog-а, перемонтирование /var/{cache,lib/mosquitto} и бо?льшей части openHAB-а на внешний HDD и запуск xeoma с него же. Соответственно, /tmp, /run, /var/log — в tmpfs. Месяц отработало. За 20 дней 10Мб прочитано, 3.8Мб записано, если верить iostat
Jaromir
18.12.2016 05:02+4С августа 5 малин показывают браузер круглосуточно. Пока все живы. Из настроек только отключение в конфиге journald записи логов на диск и запуск браузера surf без кеширования. Когда одна из малин помрет, буду делать как у вас, unionfs. Спасибо за статью
У себя обошелся без дисплейного менеджера. Добавил файл /etc/systemd/system/getty@tty1.service.d/override.conf с таким содержанием:
[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --autologin user --noclear %I $TERM
Ну и мышь оставил, т.к. иногда нужно поуправлять работающей малиной напрямую. Программа unclutter скрывает указатель если его пару секунд не теребить
Все изменения в управляющих скриптах подготавливаю в виде deb-пакета на большой машине, затем массово заливаю и инсталирую по ssh. ssh-agent рулитteleghost
18.12.2016 14:00спасибо, уважаемый читатель! а всё-таки чем собственно X-сервер запускается?
sens_boston
18.12.2016 09:13+1У меня RPi уже больше двух лет живет под Raspbian; сначала управлял роботом (пока не надоело), потом просто прозябает в виде веб-камеры через M-JPEG streamer (впрочем, еще использовал как сервер недолго, для эксперимента). Периодически апдейчу и апгрейжу (раз в квартал); все работает, как часы. Да, все с дешевой 4GB карточки (даже не помню, что туда засунул). Ничего в конфигах не отключал; X-ами не пользуюсь, все через ssh.
Что я делаю не так, зачем мне read-only file system, и когда оно таки «сдохнет»? ;)teleghost
18.12.2016 13:22теоретически без swap и (особенно) без графики энтропия значительно ниже, но и модель карточки тоже интересно было бы узнать; у меня акцент на использовании графических приложений, именно они (в среднем) больший вклад в износ дают
sens_boston
18.12.2016 18:27Посмотрел специально: SONY, 16GB, 10 класса. Помню, были проблемы с более большей и скоростной карточкой (из-за какого-то бага в RPi или софте).
Да, весьма возможно, что при моем сценарии swap сильно не используется, потому и живет долго.teleghost
21.12.2016 02:15sens_boston, если Вас не затруднит, что скажут эти две команды (без root)?
uptime -p cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB written: %.3f MiB\n", $3*512/1048576, $7*512/1048576}'
sens_boston
22.12.2016 04:28pi@raspberrypi ~ $ uptime -p uptime: invalid option -- 'p' Usage: uptime [options] Options: -h, --help display this help and exit -V, --version output version information and exit For more details see uptime(1). pi@raspberrypi ~ $ cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB written: %.3f MiB\n", $3*512/1048576, $7*512/1048576}' Uptime read: 40.826MiB written: 0.484 MiB pi@raspberrypi ~ $
ValdikSS
18.12.2016 11:53+1Вместо UnionFS можно использовать OverlayFS, он новее. Можно монтировать корень read-only, а поверх него монтировать OverlayFS в tmpfs, чтобы не приходилось монтировать отдельные директории.
И вообще, в Debian уже есть пакет для этого — live-boot и live-boot-initramfs-toolsteleghost
18.12.2016 14:51+2Респект, ValdikSS! OverlayFS вошёл в ядро Linux уже после того «погибшего» немецкого поста про UnionFS, что не отменяет ценности OverlayFS сегодня. Но меня удивляет (и немного раздражает) молчание официальной команды Raspberry Pi по теме read-only root. К сожалению, комментарии читателей (не все!) и статистика опроса по среднему времени жизни Малиновых Прогов пока подтверждает мои опасения. Либо мы дружно смотрим не туда:)
Кстати, поисковики на запрос raspberry overlayfs выдают гораздо больше полезного, чем наraspberry read only root, в этом тоже есть профит от OverlayFS:)
Из того, что можно считать «пошаговой инструкцией», я нашёл только проект Domoticz и вот эту форумную ветку. Есть ещё что-то, достойное внимания?
Благодарю за ценный комментарий!Spider55
18.12.2016 16:14Я кстати тоже на OverlayFS построил свой read-only.
Опирался в настройке на Domoticz, но немного иначе построил древо папок, запихав их все в /overlays, а не в корень как у автора. Ну ипо скриптам там есть изъяны.
Spider55
18.12.2016 12:05+2Полезно, надо бы и мне такое написать, а то уже забываю что да как у себя делал. И начал делать именно по этому же, что умирают microSD карточки.
У меня пирожки используются в качестве «мозгов» для информационных табло на базе HDMI мониторов/телевизоров. По сути там тольок Chrome выводящий страничку, которая по средствам JS обновляет внутри себя данные. Так вот эта, казалось бы тривиальная, задача убивает QUMO карточки на 8Gb (меньше в продаже у нас уже и не найти, да и эти стоили 400р.) в среднем за 2-3 месяца. Установка SNMP монитора (внешний сервер сбора статитика «Кактус») сразу открыла глаза на ситуацию. Raspberrian убивает карточку постоянной записью журнала и прочей ерунды типа логов и много чего ещё. При этом отключение журналирования не помогает, об этом есть целая ветка на linux.org.ru
С переходом на RO файловую систему всё стало шикарным! Не нарадуюсь. rsync'ом синхрю «изменения» которые делаю в конфигах, кэши броузера и темпы в память, логи на внешний сервер с небольшим буфером в память. Работает уже 6 мес, тфу тфу тфу со 100% аптаймом.
От текущеко решения отличатся разве, что тем, что я отказался от LightDM и поставил noDM, легче, проще, интуитивнее.
gsaw
18.12.2016 13:28Я потому банану пи взял. У нее есть сата разьем. Я подключил жесткий диск и вот уже пол года все работает. До этого была расберри и проработала год без проблем. Я даже логгирование не отключал.
NikitaE
18.12.2016 13:54+1Read only системный диск — это же liveCD в чистом виде! Быть может, самым простым решением окажется просто эмуляция LiveCD с соответствующими дебиановскими либами?
teleghost
18.12.2016 16:33+1спасибо за комментарий, тогда уже SquashFS, с соотв. последствиями, я ответил в публикации, см. UPD: SquashFS
Vooon
18.12.2016 14:08Посмотрите как делает OpenWRT: системный образ в squashfs, настройки поверх через overlayfs.
Его можно собрать для малины, хотя я не пробовал. Не уверен, что squash нужен на SD, места то полно, но будет точно RO.teleghost
18.12.2016 16:31благодарю, ответил Вам и другим читателям в тексте публикации, см. UPD: SquashFS
YemSalat
18.12.2016 14:21+1Раз уж подвернулась такая подходящая статья — расскажу свой «анекдот»
Была у меня малинка с установленной на ней RaspbianLite (без графики), и на ней маленькая программа, написанная на ноде, которая парсила некоторые сайты и отправляла результаты по сети в БД на удаленном сервере. Программа эта запускалась по крону каждый час.
Стояла себе моя малинка и работала себе, с почти полутора-годовым аптаймом.
В итоге в один прекрасный день я решил зайти на нее по ssh и проверить как у нее дела. Пробую зайти — нифига.
В итоге выяснилось что карта памяти полетела больше года назад (после e2fsck починилась), да еще и из разъема вылезла немного (он разболтан слегка был)
При этом служила мне верой и правдой все это время — просыпалась по крону, ходила в сеть и т.д.
В линуксе/юниксе я довольно-таки нуб, поэтому описать в техническом плане что именно там происходило не могу.
Но зато какой надежный девайс получился :)teleghost
18.12.2016 17:19У меня похожая ситуация с FreeNAS послужила поводом к написанию статьи на хабре, система тоже жила себе на «сдохшей» флэшке около недели. Я прекрасно отдавал себе отчёт, что это до первой перезагрузки, и в случае с файл-сервером вмешался почти сразу, как только узнал, от греха подальше.
Однако обе мини-флэшки я не выбросил, а просто записал по-новой. Одна до сих пор в автомагнитоле прекрасно служит MP3-архивом, воспроизводя мне эфиры давно закрытых, но до боли любимых радиостанций. Вторая трудится (ха-ха) загрузчиком тестового FreeNAS, на котором я отрабатываю проброс аппаратных USB-ключей жёлтой программы через jail и virtualbox прямо в установленный тут же Windows. И хорошо работает, но я так скажу: слава богу, что это хобби:)
ilmarin77
18.12.2016 14:21Наверное, еще можно адаптироватъ старый способ создания Live CD: http://www.linuxfromscratch.org/hints/downloads/files/OLD/bootcd-2.6-udev-nptl.txt
gattopazzo83
18.12.2016 14:21+2Использую Flash Media Kits от HPE для загрузки ESXi и OpenIndiana.
Эти SD и microSD рассчитаны на большее количество циклов перезаписи (до 100 000) чем обычные консьюмерские флешки.
Стоимость — в несколько раз дороже, но для долгосрочного (обычно — 2-4 года) использования в продакшене оправдана.teleghost
18.12.2016 15:00вот, в том числе ради таких комментариев я и пишу свои публикации:)
теперь я знаю, под каким брэндом можно найти промышленную SLC-память в формате microSD, огромное спасибо!doga
18.12.2016 18:18+1зашел по Вашей ссылке ниже: разница в цене — 10+ раз для варианта 32 ГБ.
Если железка не будет расположена в каком-то труднообслуживаемом месте,
то имхо дешевле по регламенту менять дешевые карты чаще, чем надеяться на обещанную надежность такого дорогого варианта.
Причем память б0льшего размера позволит размазывать износ дольше и дальше — еще и поэтому меньший размер менее выгоден, а не только сами по себе мелкие карточки выходят дороже в пересчете на единицу памяти.
doga
18.12.2016 14:22+1износ флэша даже в режиме ридонли — это потемки, например http://habrahabr.ru/post/214803/
Также интересуюсь командой TRIM для не-SSD.
У некоторых eMMC уже стал появляться SMART http://4pda.ru/forum/index.php?showtopic=170318&view=findpost&p=42683000
Заранее благодарю за любую информацию по этим темам.teleghost
18.12.2016 15:27Здравствуйте, дорогой читатель! Я очень хорошо знаю автора той статьи на хабре (это я и есть:)
На наше с Вами счастье буквально за минуту до Вашего комментария сюда зашёл пользователь gattopazzo83 и рассказал про SLC-память в формате microSD, которая является промышленной по своему назначению. А это означает, что подобных эффектов износа через read-only там быть не должно просто по определению. Конечно, космический корабль на этом не запустишь (радиация, вибрация, и всё такое), но для гражданских проектов вполне.doga
18.12.2016 18:00спасибо за пропуск АКА модерацию.
Если обе статьи за Вашим авторством, то странно, что никто больше не заметил странностей с таким режимом ридонли, который все равно приводит именно к быстрому износу флэша.
имхо SLC-память в формате microSD — не панацея до тех пор, пока не будет неких дополнительных гарантий в ее надежности, кроме ломовой цены и пафосного ценника.
Например, для андроида есть много бесплатных программ, которые показывают много «скрытой» инфы про внутреннюю и внешнюю память — интересно было бы применить этот визуализатор к тем дорогим картам.
И повторюсь насчет TRIM:
не попалось мне никаких намеков на то, что не любой контроллер не у всякой флеш поддерживает команду fstrim, которая появилась у Андроида 4.3
хотя про «взрослые» SSD море инфы о том, что многие ранние SSD не поддерживали эту фичу и требовали полного стирания для восстановления былых скоростей.
Буду благодарен за любые ссылки для чтения по всем этим смежным темам.teleghost
18.12.2016 20:03к Вашему комментарию выше про x10+ ценник да, всё в конечном итоге определяет экономика процесса обслуживания, дома дешевле перезалить систему, в бизнесе дешевле купить SLC-память
странно, что никто больше не заметил странностей с таким режимом ридонли, который все равно приводит именно к быстрому износу флэша
По моей теории, порча данных при чтении в результате read disturb возможна в результате слабого алгоритма расчёта контрольных сумм или багов в микроконтроллере, при этом флэшка остаётся работоспособной, т.е. перезапись восстанавливает «повреждённый» участок. Это вроде бы не противоречит тезисам доклада Jim Cooke в 2007г, но у меня нет ни оборудования, ни времени, ни навыков, чтобы доказать это на практическом примере.
Когда я смотрю на характеристики памяти и вижу 100,000 циклов записи, второе место, куда я смотрю — это информация о длине контрольной суммы. И если она декларируется, это о многом говорит. А принятие решения о правдивости всей этой информации проще при наличии брэнда, которому репутационные издержки утопят выгоду от вранья. Поэтому если новый HP начал продавать такие флэшки, то я охрененно рад, если честно:) И да, износ 32Гб при прочих равных должен идти в четыре раза медленнее, чем 8Гб.
Вижу, Вам TRIM на SD просто не даёт покоя:) Даже если команды Линукса что-то там отрабатывают и показывают на SD-карточке, это не SSD, тут наличие реального физического процесса вызывает гораздо больше сомнений, чем обещанная надёжность изделий от HPE. Искали, кстати, «fstrim sd card»? Вот, например: https://www.raspberrypi.org/forums/viewtopic.php?t=19554. Народ сходится на том, что отправка на запись полного нулей блока должна иметь только эффект ERASE, т.е. без записи самих нулей. Микроконтроллер понимает, что это затёртый блок, и в следующий раз при чтении быстро «напечатает» порцию нулей и выдаст хосту. Я в это готов поверить, тем более, что логика гипервизоров аналогична. Например, VMware с thin-provisioned дисками работает именно так. Но, поскольку это прошивка микроконтроллера, что происходит на самом деле, зависит от честности вендора, т.е. приходим к тому же выводу, что и в моей публикации 2014г.
So even if the SDHC cards don't support the trim command the erase block command of the SDHC card might actually do quite the same, since it's too fast for a real physical erase procedure but it still results in a block being reread as zero.
Note that this might well be device and or vendor specific behaviour, its what i saw while working with sandisc SDHC cards on a dataloggger project with a microcontroller using SPI protocoll for communication.doga
18.12.2016 20:19> порча данных при чтении в результате read disturb возможна в результате…
а я не понимаю самого обмана:
либо в режиме ридонли все равно что-то пишется — и это Ваша же гипотеза про ехт4,
либо описание «механизма износа» флэша в паблике не раскрывает всех тонкостей этого самого износа.
Например, про литиевые батареи давно проталкивают мысль, что они изнашиваются даже лежа на складе при правильной температуре — просто от времени хранения. Но литий — это химия, а флэш — пока еще физика, вроде бы: вот это мне и непонятно.
TRIM на SD не даёт мне покоя по простой причине: это предельно наглядный метод проверки продвинутости или даже вообще наличия мозгов у контроллера.
Все же, для дешевых и левых флешей я бы предположил просто полное отсутствие алгоритмов размазывания износа: такой вариант легко объяснил бы обсуждаемый 2-месячный износ без привлечения излишних сущностей вроде SLC/MLC/TLC.
имхо ламера: логику гипервизоров неверно сравнивать с производством предельно дешевых флэш карт\свистков.
а «честность вендоров» давно подмочена подменой «1024 мегабайт» на «1000 мегабайт». Я тут выше уже приводил ссылку, что у некоторых еММС появился SMART — вот только в это можно будет как-то поверить…doga
18.12.2016 20:24* имхо ламера: логику гипервизоров неверно сравнивать с производством предельно дешевых флэш карт\свистков. Т.е., очевидно, что контроллер без размазывания износа выйдет драматически дешевле и проще, чем интеллектуальный. А ведь на таких масштабах производства и при таких ценах экономия даже долей цента оборачивается большими суммами.
teleghost
18.12.2016 21:32либо в режиме ридонли все равно что-то пишется — и это Ваша же гипотеза про ехт4,
NAND read disturb «на пальцах» — это постепенная порча данных в каком-то месте, вызванное чтением из «соседнего» участка, исправляется перезаписью, и следить за этим достаточно просто, чтобы обычный микроконтроллер справился (только прошивка нужна без багов, а это и есть интеллектуальная собственность корпораций). Для меня сочетание SLC, длинной контрольной суммы и хорошего брэнда как раз означает, что в прошивку залит достаточно продвинутый софт, чтобы флэшка даже с записью жила долго, а в режиме read-only — очень долго, без всяких намёков на read disturb…
либо описание «механизма износа» флэша в паблике не раскрывает всех тонкостей этого самого износа
Мы же с Вами ищем одно и то же, верно? Вы также пытаетесь оценивать «продвинутость» софта микроконтроллера, но только по критерию наличия TRIM, я правильно понял? В примитивном (относительно SSD) интерфейсе SD-карточек нет такой функции, так википедия утверждает:
The MultiMediaCard and SD ERASE (CMD38) command provides similar functionality to the ATA TRIM command, although it requires that erased blocks be overwritten with either zeroes or ones. eMMC 4.5 further defines a «discard» sub-operation that more closely matches ATA TRIM in that the contents of discarded blocks can be considered indeterminate (i.e., «don't care»).
Так что тут вопрос и к драйверам (ядру) Linux, и к железу, и к userland командам…
Как бы там ни было, причина, побудившая меня написать эту статью — наплевательское отношение к культуре использования ограниченного ресурса SD-карточек со стороны «готовых» образов систем для RPi. Проблему явно надо с двух концов решать.
У Вас есть МалинПрог под рукой? Можете поставить hdparm и запустить одну команду?hdparm -I /dev/mmcblk0
Я просто не хочу до нового года вообще трогать торговое оборудование…
Про гипервизоры: я имел в виду, что «раздутый» шлаком (стёртыми файлами) Thin Provisioned Disk VMware «сдувается» обратно при помощи записанных поверх стёртых файлов «нулей», блоки которых гипервизор считает пустыми. См. ссылку про vmkfstools --punchzero. У некоторых SD-карточек «нулевые» блоки означают для микроконтроллера то же самое, что «нулевые» блоки для команды vmkfstools. Просто неслучайная аналогия, для Thin Provisioned Disk команда TRIM была бы тоже полезна.doga
18.12.2016 22:30+1википедии нельзя верить в областях, где прогресс быстр, а инфа все еще не устоялась: даже про HDD с их черепичной записью и гелием нельзя верить вики, потому что такой опыт еще не наработан, а грабли не хожены.
Т.е., признание отсутствия TRIM лишь еще сильнее намекает и на полное отсутствие алгоритма размазывания износа, хотя для SD про последнее никто не пишет прямо ни «за», ни «против».
наплевательское отношение к культуре использования ограниченного ресурса SD-карточек со стороны «готовых» образов систем для RPi — имхо явное следствие дешевизны карт памяти и тупости основного контингента, которые приучены к этому фреймворками и прочими улучшателями и упрощателями.
вопросы и к драйверам (ядру) Linux, и к железу, и к userland командам хотя бы имеют ответы, а вот про кишки карт памяти неизвестно ничего, например
https://habrahabr.ru/post/273425/
> во встроенном в eMMC уровне FTL тоже реализованы алгоритмы выравнивания износа, но это «черный ящик».
> у некоторых SD-карточек «нулевые» блоки означают для микроконтроллера
да, кроме неафишируемого использования SLC, также возможно, что некоторые карты не рекламируют но имеют и продвинутые контроллеры
у меня нет МалинПрог под рукой — я ламер и просто собираю инфу по некоторым волнующим меня темам.
infernadium
19.12.2016 16:40RPi B+, Raspbian jessie: hdparm не хочет показывать информацию об SD-карте:
# hdparm -I /dev/mmcblk0 /dev/mmcblk0: HDIO_DRIVE_CMD(identify) failed: Invalid argument
teleghost
19.12.2016 16:42всё верно, SD-карточка не диск, я был неправ, вот команда:
udevadm info -a -n /dev/mmcblk0
см. также спойлер в публикацииinfernadium
19.12.2016 19:38Raspi B+, Transcend 8GB class 10# udevadm info -a -n /dev/mmcblk0 Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/platform/soc/20202000.sdhost/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0': KERNEL=="mmcblk0" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="15523840" ATTR{stat}==" 4491 1914 202850 16300 1386 1625 24289 26390 0 13340 42620" ATTR{range}=="32" ATTR{discard_alignment}=="0" ATTR{force_ro}=="0" ATTR{ext_range}=="32" ATTR{alignment_offset}=="0" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/platform/soc/20202000.sdhost/mmc_host/mmc0/mmc0:aaaa': KERNELS=="mmc0:aaaa" SUBSYSTEMS=="mmc" DRIVERS=="mmcblk" ATTRS{cid}=="035344534c303847803da92ee4010481" ATTRS{csd}=="400e00325b5900003b377f800a4040af" ATTRS{scr}=="0235800100000000" ATTRS{date}=="04/2016" ATTRS{name}=="SL08G" ATTRS{type}=="SD" ATTRS{preferred_erase_size}=="4194304" ATTRS{fwrev}=="0x0" ATTRS{hwrev}=="0x8" ATTRS{oemid}=="0x5344" ATTRS{manfid}=="0x000003" ATTRS{serial}=="0x3da92ee4" ATTRS{erase_size}=="512" looking at parent device '/devices/platform/soc/20202000.sdhost/mmc_host/mmc0': KERNELS=="mmc0" SUBSYSTEMS=="mmc_host" DRIVERS=="" looking at parent device '/devices/platform/soc/20202000.sdhost': KERNELS=="20202000.sdhost" SUBSYSTEMS=="platform" DRIVERS=="sdhost-bcm2835" ATTRS{driver_override}=="(null)" looking at parent device '/devices/platform/soc': KERNELS=="soc" SUBSYSTEMS=="platform" DRIVERS=="" ATTRS{driver_override}=="(null)" looking at parent device '/devices/platform': KERNELS=="platform" SUBSYSTEMS=="" DRIVERS==""
teleghost
19.12.2016 21:37Raspi B+, Transcend 8GB class 10
если верить CID, память производена SanDisk в апреле 2016
с момента запуска системы прочитано 202850 блоков, записано 24289 (соотношение 8:1)
Olimex A13, SanDisk Ultra 8GB class 10
если верить CID, память произведена SanDisk в июле 2016
с момента запуска системы прочитано 327488 блоков, записано 17850 (соотношение 18:1)
обе файловых системы явно работают в режиме read-write (у меня на «read-only» соотношение 3000:1)
Можно выполнить uptime -p и разделить записанные блоки на часы (точнее, сутки), получите средесуточный износ флэшки. Умножаете на количество дней работы устройства. Предел у MLC памяти 3000..5000 циклов записи, т.е. примерно после 32Тб записанных данных флэшка должна сдохнуть. Блок 512 байт, с момента запуска системы записали 11Мб на первую флэшку и 8Мб на вторую.
Вот если бы скомпилировать утилиты для IOCTL-вызовов, из SanDisk можно было бы вытащить аналог S.M.A.R.T., см. ссылку пользователя doga. Мой МалинПрог трудится в production, я второй пока не завёл:) Вы работаете с исходным кодом? Умеете пакеты под Debian собирать?
Vcoderlab
18.12.2016 14:22А почему не SquashFS?
teleghost
18.12.2016 16:31благодарю за комментарий, ответил Вам и другим читателям в публикации, см. UPD: SquashFS
Vcoderlab
18.12.2016 21:26Благодарю за ответ. Согласен, невозможность изменить внутренности SquashFS может затруднить устранение ошибок на этапе эксплуатации.
Но можно взглянуть на это и с другой стороны: неизменимость образа SquashFS может быть и достоинством — никакой вирус или троян не сможет закрепиться в системе, после перезагрузки система гарантированно вернётся в исходное состояние. Обновления же можно распространять в виде готового squashfs-образа. В тех же роутерах, например, новую прошивку тоже в виде целого образа распространяют. Не берусь утверждать, возможно ли подменить образ из загруженной с него системы, но полагаю, что даже если и нет, можно что-нибудь придумать.teleghost
18.12.2016 21:37полностью согласен, я это и имел в виду, когда писал публикацию:
Обновления безопасности накатывать на такую систему довольно неудобно. Но, опять же, взломать такую Вещь несколько сложнее, чем эксплуатировать уязвимость Adobe Flash в браузере обычного десктопа.
sskidan4
18.12.2016 14:23+2Занимаемся счетчиками пассажиров на транспорте, используются как раз малинки (1,2.3). Есть с аптаймом по полгода, есть такие, которые перезагружаются каждые несколько минут (в таком режиме сдох роутер, малина с системой жива). Считают пассажиров, объявляют остановки, выполняют функции бортового компьютера. Вся ОС грузится в память, карточка не смонтирована совсем, потому что даже при монтировании в рид-онли система жила не больше месяца
teleghost
18.12.2016 15:17Приветствую, очень приятно видеть здесь представителей отраслей! По поводу износа через чтение я как-то писал статью на хабре, смысл которой сводится к простой рекомендации: с учётом «физики» NAND-памяти не стоит использовать бытовые изделия для промышленных задач, потому что сэкономить можно и на софте для управляющего микроконтроллера флэшки. И mount read-only не означает, что драйвер файловой системы не попытается отметить дату и время последнего успешного монтажа. Отучить его от этой привычки можно, пожалуй, только аппаратным переключателем записи, но вот где на microSD он встречается?
Тем не менее, благодаря пользователю gattopazzo83 я теперь знаю про флэшки Flash Media Kit пр-ва известной фирмы Харлампий-Панкрат (Эдуардович), и для Ваших задач определённо их рекомендую. Стоят дорого, но зато это SLC microSD.doga
18.12.2016 18:12«аппаратный переключатель записи» расположен в слоте, а на карте если и есть, то только механический движок, не связанный ни с чем более
Rumlin
18.12.2016 19:20К слову эти «бытовые изделия для промышленных задач» используются несколько лет компанией FlightAware http://flightaware.com/adsb/flightfeeder/
Софт тут — https://github.com/flightawareteleghost
18.12.2016 20:39я про "бытовые" флэшки в смысле consumer product
у самого же Прога рабочий диапазон 0..70 с Ethenet (или -40..85 без него), плюс сторожевой таймер — это уже черты пром. изделия, так что рад за flightaware:)
Rumlin
18.12.2016 20:51Флешки у них 32Гб, вроде бы SanDisk.
teleghost
18.12.2016 21:53+1Как говорил мне один продавец пару лет назад, SanDisk — это вендор, который полученные деньги полностью отрабатывает. Я у Cruzer Contour за 8 лет даже механический «затвор» не смог сломать. Щелкает, блин, как зажигалка Zippo, хоть бы что ему:)
SanDisk Cruzer Contour (2008)
High durability item:)
Meklon
18.12.2016 14:38+2Блин. У меня openELEC с KODI пару месяцев работает. Тоже сдохнет?
teleghost
18.12.2016 16:37может, вот так прямо и не сдохнет, особенно если Вы установили это на дорогую флэшку типа HPE Flash Media Kit
но зато какая интрига! :))Meklon
18.12.2016 21:13Transcend на 16 ГБ. Из приличных вроде. Буду смотреть) в openELEC все гвоздями изрядно прибито. У них даже apt-get закрыт. Образ не трогал)
teleghost
19.12.2016 21:57Уважаемый Meklon, можете отдать две команды из-под root и показать нам результат?
Надо, чтобы система была на ходу несколько дней, с Вашей штатной нагрузкой, без резких бросков.
udevadm info -a -n /dev/mmcblk0 uptime -p
Можете ответ в личку отправить, если сюда — то обязательно в спойлер.
Я попробую оценить суточный износ и остаток ресурса, на большее пока не готов:)Meklon
21.12.2016 00:00udevadm info -a -n /dev/mmcblk0Meklon-Kitchen:~ # udevadm info -a -n /dev/mmcblk0 Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/platform/soc/3f202000.sdhost/mmc_host/mmc0/mmc0:59b4/block/mmcblk0': KERNEL=="mmcblk0" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="31586304" ATTR{stat}==" 2250 740 147420 8920 8963 7499 134874 273290 0 49473 282233" ATTR{range}=="32" ATTR{discard_alignment}=="0" ATTR{force_ro}=="0" ATTR{ext_range}=="32" ATTR{alignment_offset}=="0" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/platform/soc/3f202000.sdhost/mmc_host/mmc0/mmc0:59b4': KERNELS=="mmc0:59b4" SUBSYSTEMS=="mmc" DRIVERS=="mmcblk" ATTRS{cid}=="744a605553445531203ba13fbd00f573" ATTRS{csd}=="400e00325b590000787d7f800a400005" ATTRS{scr}=="0235800300000000" ATTRS{date}=="05/2015" ATTRS{name}=="USDU1" ATTRS{type}=="SD" ATTRS{preferred_erase_size}=="4194304" ATTRS{fwrev}=="0x0" ATTRS{hwrev}=="0x2" ATTRS{oemid}=="0x4a60" ATTRS{manfid}=="0x000074" ATTRS{serial}=="0x3ba13fbd" ATTRS{erase_size}=="512" looking at parent device '/devices/platform/soc/3f202000.sdhost/mmc_host/mmc0': KERNELS=="mmc0" SUBSYSTEMS=="mmc_host" DRIVERS=="" looking at parent device '/devices/platform/soc/3f202000.sdhost': KERNELS=="3f202000.sdhost" SUBSYSTEMS=="platform" DRIVERS=="sdhost-bcm2835" ATTRS{driver_override}=="(null)" looking at parent device '/devices/platform/soc': KERNELS=="soc" SUBSYSTEMS=="platform" DRIVERS=="" ATTRS{driver_override}=="(null)" looking at parent device '/devices/platform': KERNELS=="platform" SUBSYSTEMS=="" DRIVERS==""
teleghost
21.12.2016 01:03+1Meklon, Ваш кухонный прибор за 158 часов прочитал примерно 71Мб и записал около 66Мб, т.е. он подпиливал SD-карточку со скоростью порядка 10Мб/сутки, это *на порядки* меньше, чем автомобильный регистратор. Если такой режим записи сохраняется всегда, то карточка должна прослужить достаточно долго, панику можно отложить:) Но недельная статистика может врать, попробуйте продержать систему месяц без перезагрузки и выполнить команду:
У Вас получилось бы так:cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB written: %.3f MiB\n", $3*512/1048576, $7*512/1048576}'
Uptime read: 71.982 MiB written: 65.856 MiB
Делите на количество дней (часов), получаете среднесуточный износ, всё просто.
Я ещё обратил внимание, что соотношение чтение/запись почти 1:1 (т.е. карта «почти» не читается), что я считаю признаком SquashFS (она загружает содержимое ф/с в ОЗУ). У классических систем без SquashFS, как я понял из общения с другими читателями, соотношение где-то от 5:1 до 10:1. Чем бы там девайс не был занят на кухне, желаю приятного аппетита;))Meklon
21.12.2016 08:47Благодарю. Постараюсь позже запустить. Девайс Джейми Оливера крутит и Гордона Рамзи) фон для готовки.
av0000
20.12.2016 10:10Из приличных вроде
что-то последнее время хочется им добавить «не-». По крайней мере, купленным в более-менее крупных торговых сетях :(
На предмет «прибивания»: Консоль/root доступны? Для своего openHAB-а решил проблему через
mount --bind /opt/openhab/logs /mnt/sda/oh-logs
точнее — аналог этой строчки в fstab. Ну или симлинков наделать, но по мне, это менее надёжно при «отваливании» внешнего диска. Если памяти много и хранить не надо — tmpfs плюс пред-создание нужной структуры папокMeklon
20.12.2016 10:27Консоль доступна. fstab допилю, наверное. Логи я могу и в /dev/null, в принципе отправить. Это же не мой основной домашний сервер)
av0000
20.12.2016 11:05/dev/null хорошо для выбрасывания лишних логов.
Некоторые же утилиты хотят видеть конкретный файл и/или структуру папок на момент старта и начинают «чудить», если это не так.
у меня логи хранятся (не знаю зачем, привычка наверно), но /var/log живет на tmpfs с периодическим архивированием на флешку…
как-то таксам «сервис»
#!/bin/sh . /lib/lsb/init-functions start() { log_begin_msg "RAMLOG: Read files from disk.." tar xfz /var/ram_log.tar.gz -C / log_end_msg 0 } stop() { log_begin_msg "RAMLOG: Write files to disk.." tar cfz /var/ram_log.tar.gz --directory=/ var/log/ log_end_msg 0 } case "$1" in start) start ;; stop) stop ;; flush) stop ;; *) echo "Usage: $0 {start|stop|flush}" exit 1 esac
запускалка для systemd
[Unit] Description=Ramlog After=local-fs.target Before=cron.service syslog.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/opt/bin/ramlog start ExecStop=/opt/bin/ramlog stop [Install] WantedBy=multi-user.target
Ну и в кроне (ещё не сподобился научиться крону от systemd)
0 */6 * * /opt/bin/ramlog flush &> /dev/null
#fstab
tmpfs /var/log tmpfs relatime,mode=1777
teleghost
21.12.2016 02:59Спасибо за комментарий, он навёл меня на мысль о том, куда лучше скидывать информацию, если не на флэшку:)
Скидывать лучше в облако, причём опытный ниндзя не будет использовать свой основной почтовый аккаунт. Конфиденциальные файлы (бэкапы настроек) перед отправкой в облако лучше зашифровать ассиметричным ключём, используя, например, команду openssl как-то так. Это позволит безопасно хранить публичную половину ключаkey.pub
на каждом устройстве, не боясь, что кто-то сможет им вскрыть информацию (для этого нужен закрытый ключ;-)
Ну а по поводу облака есть GDriveFS вообще и How to mount your google drive on Raspbian RPI with GDriveFS в частности.
Если информация достаточно безопасна, можно слать «периодику» по почте, но тогда желательно, чтобы её можно было читать сразу в почтовом клиенте, т.е. закладывать открытым текстом, без вложений. Искать гораздо удобнее, я пользуюсь для архивов S.M.A.R.T (у меня двенадцать 3.5" дисков в башне FreeNAS, и по каждому life time history в почте, это иногда очень выручает).
Meklon
21.12.2016 00:13А. Не, еще интереснее.
openelec uses a squashfs filesystem and is read-only at run time
av0000
21.12.2016 09:57Всё уже украдено до нас! © Root уже r/o — полдела сделано :)
А юзерские настройки он как-то хранит? Та же убунта замечательно хранит изменения поверх squashfs (casper-persistent кажется).
Не, уберджедаи могут «разобрать» squashfs, поправить и собрать обратно — как в кастомизации LiveCD.
Если есть откуда автоматом запустить скрипт, то остается «sudo mount --[r]bind /...»Meklon
21.12.2016 10:13Надо покопаться. Но, по факту, он всего 10 мегабайт в сутки пишет. Флеш на 16 ГБ. Должно надолго хватить.
wadeg
18.12.2016 17:20Если флешка не китайское гуано — несколько лет
помучаетсяпоработает без проблем. Моя три года прожила именно на openELEC+XBMC/KODI в ежедневноактивном режиме, пока не сдохла.
and7ey
18.12.2016 23:44OpenELEC — довольно популярный дистрибутив. Может, кто посмотрит, что он на карту пишет :)
Arcanum7
18.12.2016 15:05Может покажусь дилетантом, но:
внешний cd-rom с live-cd дистрибутивом?teleghost
18.12.2016 17:31+2оптический привод по габаритам существенно превосходит одноплатный компьютер, не любит вибрации, нелепо выглядит, медленный, механический; но это близко к направлению SquashFS, которое я прокомментировал прямо в публикации, не стоит забывать о накладных расходах на изготовление образа firmware и обновлениях безопасности. Нужен адекватный community-проект, который будет публиковать обновления firmware и позволять их обновлять по сети, как это делают, например, OpenWRT и коммерческие производители. Это дорого.
commanderxo
18.12.2016 17:56+2Огромное спасибо за статью! У нас Raspberry используются вместе с висящими на стенами телевизорами для показа статуса Build-сервера, мониторинга и т.п. Каждые 8-12 месяцев приходится менять запиленную файловой системой SD-карточку.
Думается я 100% попадаю в целевую аудиторию Raspberry — деньги мы зарабатываем на технологиях далёких от Linux, и к Малинке обращаемся пару раз в год с дилетантскими задачами вроде «а как бы при старте автоматически запустить полноэкранный Chromium и открыть вот этот Url». Linux, увы, так и не выучил, а для малинки на любой вопрос можно выгуглить точный рецепт, причём из-за маленького зоопарка моделей рецепты четырёхлетней давности для Raspberry 1 обычно подходят и для Raspberry 3 (с GPIO чуть сложнее, но по сути надо различать всего две модели).
Особое спасибо за структуру статьи: описание проблемы/как будем решать/пошаговая инструкция. Это как раз на уровень знаний типичного пользователя малинки.
Пишите дальше в том же стиле, очень вам благодарен!
mr_brain1979
18.12.2016 20:07Не знаю, что я делаю не так, у меня малинка работает как торрентокачалка на большой диск, в качестве сервера стоит Transmission, около двух лет работает. Я, правда, ее редко трогаю, но все же…
P.S. спаибо за статью, порадовался, что ГТ все еще ГТ.teleghost
18.12.2016 20:47без графики и swap пара лет на нормальной флэшке — это вроде норма, как раз пора менять, может скоро сдохнуть:)
и благодарю за комплимент;)
mr_brain1979
18.12.2016 20:55Так в том то и дело! там все включено и иксы запущены! Трансмишен постоянно что-то раздает/получает.
teleghost
18.12.2016 21:56а как флэшку зовут? есть возможность посмотреть
hdparm -I /dev/mmcblk0
mr_brain1979
18.12.2016 22:22Флешка smartbuy на 8 гигов а hdparm говорит invalid argument… Я не линуксоид, поэтому не знаю, что есть сие и как починить :)
teleghost
18.12.2016 22:57прошу прощения, чинить ничего не надо
похоже, достаточноudevadm info -a -n /dev/mmcblk0
с правами root
там, правда, всё равно не понять ни рожна:)mr_brain1979
18.12.2016 23:06Действительно, непонять ни рожна… Судя по дате, работает, все же не два года, а с 07/15
как-то такlooking at device '/devices/platform/soc/3f300000.mmc/mmc_host/mmc0/mmc0:59b4/block/mmcblk0':
KERNEL==«mmcblk0»
SUBSYSTEM==«block»
DRIVER==""
ATTR{ro}==«0»
ATTR{size}==«15693824»
ATTR{stat}==" 608935 111823 59031459 11015680 753422 705684 13380833 23508600 0 6669180 34541880"
ATTR{range}==«32»
ATTR{discard_alignment}==«0»
ATTR{force_ro}==«0»
ATTR{ext_range}==«32»
ATTR{alignment_offset}==«0»
ATTR{inflight}==" 0 0"
ATTR{removable}==«0»
ATTR{capability}==«10»
looking at parent device '/devices/platform/soc/3f300000.mmc/mmc_host/mmc0/mmc0:59b4':
KERNELS==«mmc0:59b4»
SUBSYSTEMS==«mmc»
DRIVERS==«mmcblk»
ATTRS{cid}==«834e434e4361726402c2f10ca900f700»
ATTRS{csd}==«400e00325b5900003bdd7f800a400000»
ATTRS{scr}==«0235800300000000»
ATTRS{date}==«07/2015»
ATTRS{name}==«NCard»
ATTRS{type}==«SD»
ATTRS{preferred_erase_size}==«4194304»
ATTRS{fwrev}==«0x2»
ATTRS{hwrev}==«0x0»
ATTRS{oemid}==«0x4e43»
ATTRS{manfid}==«0x000083»
ATTRS{serial}==«0xc2f10ca9»
ATTRS{erase_size}==«512»
looking at parent device '/devices/platform/soc/3f300000.mmc/mmc_host/mmc0':
KERNELS==«mmc0»
SUBSYSTEMS==«mmc_host»
DRIVERS==""
looking at parent device '/devices/platform/soc/3f300000.mmc':
KERNELS==«3f300000.mmc»
SUBSYSTEMS==«platform»
DRIVERS==«mmc-bcm2835»
ATTRS{driver_override}=="(null)"
looking at parent device '/devices/platform/soc':
KERNELS==«soc»
SUBSYSTEMS==«platform»
DRIVERS==""
ATTRS{driver_override}=="(null)"
looking at parent device '/devices/platform':
KERNELS==«platform»
SUBSYSTEMS==""
DRIVERS==""teleghost
19.12.2016 02:59какой uptime у системы?
только что научился читать атрибут stat
статистика с момента загрузки системыread I/Os 608935 (requests) number of read I/Os processed
read merges 111823 (requests) number of read I/Os merged with in-queue I/O
read sectors 59031459 (sectors) number of sectors read
read ticks 11015680 (milliseconds) total wait time for read requests
write I/Os 753422 (requests) number of write I/Os processed
write merges 705684 (requests) number of write I/Os merged with in-queue I/O
write sectors 13380833 (sectors) number of sectors written
write ticks 23508600 (milliseconds) total wait time for write requests
in_flight 0 (requests) number of I/Os currently in flight
io_ticks 6669180 (milliseconds) total time this block device has been active
time_in_queue 34541880 (milliseconds) total wait time for all requests
mihmig
18.12.2016 21:06просто закомментировать его запуск в файле ~/.config/lxsession/LXDE/autostart. Если это не помогает, можно повесить по cron(8) с интервалом 718 минут команду xscreensaver-command -deactivate.
Т.е. мы отключили запуск скринсейвера вообще, но на всякий случай периодически его деактивируем?
Это как так???teleghost
18.12.2016 22:04Это стёб, дорогой читатель:) Вы же видите, как народ на полном серьёзе аппаратные USB-имитаторы мыши использует, вот я для таких ребят софтверный вариант предлагаю:)
В реальности же кто-то может ухитриться либо случайно запустить xscreensaver, либо отредактировать не тот файл, а завтра завозить оборудоание на выставку, в такой горячке сам кроном станешь. Я его, кстати, в пошаговой инструкции удаляю из системы, если заметили:
apt-get remove --purge wolfram-engine triggerhappy cron anacron logrotate dphys-swapfile fake-hwclock
nlykl
18.12.2016 21:50Даже и не думал, что при использовании графики флешки летят так быстро. У меня Raspberry работает уже пару лет с флешкой, которая до этого стояла в телефоне, и никаких проблем нет. Постоянно запущены TOR, I2P, OpenVPN и XMPP-сервер Prosody. В феврале перевел её на f2fs, что дало ощутимый прирост в скорости работы всей системы.
teleghost
18.12.2016 22:06прикольно, я даже не знал, что такая есть:)
спасибо, я добавлю в раздел «альтернативы»doga
18.12.2016 22:43+1мне очень интересно мнение реальных практиков про f2fs, потому что там https://xakep.ru/2016/10/10/f2fs-mythology/
ее описывают как очередной миф:
> мало кто задумывается о том, почему родившая на свет это чудо Samsung сама не использует F2FS даже в своих последних флагманах.nlykl
19.12.2016 02:45Использую F2FS на Raspberry и на смартфоне. На малине после форматирования в F2FS и копирования всех старых файлов обратно система стала гораздо отзывчевее. На телефоне разницу не видно, но хуже точно не стало, поэтому если есть выбор, советую попробовать, минусов у этой ФС я не нашёл.
Wicron
18.12.2016 22:06SD карта — блочное устройство. Внутри в полноразмерной версии стоит NAND и контроллер, в микроверсии скорее всего чип, объединяющий обе функции, как eMMC. Контроллер скорее всего тоже в той или иной степени в зависимости от качества заточен под контроль степени износа. Возможно, даже, может использовать аналог мини файловой системы, обладающей качеством F2FS. Если бы карты делало добротно — то стандарт позволяет делать внутри значительный слой абстракций и решать проблему долгосрочной работы. Однако, наевшись последние несколько лет этой темы, я вижу, что в значительной степени большая часть карт — откровенный шлак, возможно даже контрафакт. Качественной карты практически не найти. Когда я отдельно закупал eMMC в Тайване, то скорость и долговечность работы отличались в несколько раз. Попытки использовать такое решение в режиме только на чтение — тогда уже лучше по старинке использовать NOR память, которая давно зарекомендовала себя в таком амплуа. Видя все это, я давно замечаю, как авторы «малинки» стабильно ложат болт в плане добавить в железо и в комплект то, что позволит повысить в этом месте надежность
teleghost
18.12.2016 22:25Боюсь, Вы правы, дорогой читатель. Тот продавец, у которого я покупал пару лет назад TS2GUFM-V, именно такую грустную картину и пересказал: на онлайн-площадках один сплошной контрафакт. Такая версия хорошо бы объяснила, почему у одних система живёт два года, а у других два месяца, но практически это подтвердить тяжело в т.ч. из-за отсутствия аналога S.M.A.R.T и полной непрозрачности происходящего внутри SD-карточки. Именно поэтому я так обрадовался HPE Flash Media Kit.
И я тоже как-то прошёлся по данной теме в статье на хабре.doga
18.12.2016 22:46СМАРТ мало у кого есть, но для андроида есть куча программ, которые показывают доп.инфо про внутреннюю и внешнюю флэш-память. Если предположить(!), что «шлак» и контрафакт не подделывают эту инфу, то на нее можно было бы опираться в выборе — но для этого нужно собирать статистику по отказам с учетом этой «скрытой» инфы.
teleghost
18.12.2016 23:01я тут нашёл кое-какую команду:
udevadm info -a -n /dev/mmcblk0
но от неё немного пользы, она просто проходит по/sys/block/mmcblk0
и показывает всё, что нашла; однако что из этого относится к самой флэшке, а что является «ядерным суррогатом», я не могу сказать
у меня microSD SanDisk 32Гб 04/2014
интересный атрибут preferred_erase_size=4194304 и erase_size=512doga
18.12.2016 23:42+1далее — только цитаты по ссылкам
http://4pda.ru/forum/index.php?showtopic=712411
SD Insight
Последнее обновление 21.12.2015
Проверка параметров SD карты через SPI
Программа показывает производителя, серийный номер, дату производства, ёмкость и некоторую другую информацию, прописанную в контроллере SD карты. Также проверяется соответствие заявленных данных реальным (нужен доступ в интернет), что позволяет сделать приблизительные выводы об оригинальности карты.
http://4pda.ru/forum/index.php?showtopic=170318&view=findpost&p=42683000
Программа DiskInfo получает расширенную информацию о накопителе из директорий (для QCOM платформы):
/sys/devices/msm_sdcc.1/mmc_host/mmc0/mmc0:0001/
/sys/devices/msm_sdcc.2/mmc_host/mmc1/mmc1:aaaa/
В этой директории представлены следующие основные параметры: CID, CSD, date, fwrev, hwrev, manfid, name, oemid, serial, type.
для iNAND чипов информация об износе содержится в EXTCSD структуре, которую Android ядро не отображает в указанных директориях. Для получения данной структуры необходимо производить IOCTL запрос к устройству (к примеру /dev/block/mmcblk0), для чего требуются ROOT права.
Но с нуля писать код для считывания EXTCSD не нужно, т.к. этот функционал реализован в консольной утилите mmc-utils. Данную утилиту я уже дополнил командой, по которой структура EXTCSD выводится в сыром виде (просто 512 байтиков).
Исполняемый файл: mmc.zip ( 17,09 КБ ) — для скачивания надо залогиниться на 4пдаteleghost
19.12.2016 02:10ещё более интересная инфа содержится в первоисточнике: https://www.sdcard.org раздел загрузок, Simplified Specifications, Part 1 Simplified, Physical Layer Simplified Specification.
doga
19.12.2016 13:31а еще есть не менее известный чем 4пда ресурс — далее привожу прямую ссылку на коммерческие «боксы»(тм) для самсунговских еММС\еМСР
http://www.gsmforum.ru/threads/193588-Общий-ликбез-по-eMMC-moviNAND-проблемам-(-в-разработке-)
teleghost
19.12.2016 02:39объект
stat
: https://www.kernel.org/doc/Documentation/block/stat.txtdoga
19.12.2016 13:23раз мои ссылки вызвали интерес, то осмелюсь заявить, что при наличии «прямого доступа к диску» достаточно записать несколько коротких (а не в размер всей флэши) файлов, чтобы проверить наличие в контроллере и алгоритма размазывания, и TRIM.
Но я тут на птичьих правах и сама эта тема — все же почти оффтопик.
Т.е., если кто-то умеет программировать под чем угодно, умеет «прямой доступ к диску» и имеет там слот для SD card, то можно обсудить алгоритм такой простой(!) утилиты диагностики.
Т.е., я сам этого ничего не умею, научиться такому неспособен, а размещать подобные идеи в соотв. разделе 4пда смысла нет: опыт про СМАРТ на еММС по ссылке выше тому доказательство.doga
27.12.2016 02:44+1… все уже украдено\сделано до нас!.. (с)
http://files.thecybershadow.net/trimcheck/
цитата:
TrimCheck provides an easy way to test whether TRIM works.
This program was written by Vladimir Panteleev.
You can find more information on the program's GitHub project page:
https://github.com/CyberShadow/trimcheck
Wicron
19.12.2016 00:20Для меня HPE Flash Media Kit — что-то новое, с виду очень интересное, надо обязательно попробовать
teleghost
19.12.2016 01:38Wicron, Вы в курсе принципа работы SD Insight?
Это не серебряная пуля, но если выяснить, откуда она берёт инфу и как сравнивает, можно получить профит.Wicron
19.12.2016 12:47Интересная прога. Я так понимаю, с помощью нее можно как-то классифицировать по производителю и делать выборку. Я попробую.
Что касается обсуждения дальше, я заметил доводы про каскадно-объединенное монтирование. Была статья на тут, как решали схожую проблему с помощью UnionFS (AUFS в перспективе)doga
19.12.2016 13:27извините за настырность, но таких прог на плей-маркете — навалом. Если Вам самому влом шерстить — я с удовольствием накидаю список.
roller
18.12.2016 23:30Изменяемая FS поверх неизменяемого имаджа — это то, что делает Docker. Надо гуглить в сторону AUFS и btrfs
Loki3000
19.12.2016 12:04Затем закомментируйте в fstab(5) строки, начинающиеся со слова mount_unionfs
Дилетантский вопрос: а не проще ли при обновлениях копировать содержимое /var в /var.orig? В этом случае ничего не надо перемонтировать, перезагружать, лазить в конфигурационные файлы и вообще можно не прерывать работы. Создать скриптик savechanges.sh, который будет скидывать данные с виртуальных дисков на реальные и вызывать его при обновлениях. Разве так нельзя сделать?teleghost
19.12.2016 17:00Предлагаемая мною имитация жизни в режиме read-write «с чистого листа» — перестраховка для тех, кто на «вы» с линуксами. Думаю, что можно обойтись и без неё, особенно, если устройство нежелательно перезагружать.
Но тогда и вся накопленная энтропия вместе с логами хлынет на SD-карточку и останется там условно навсегда. Я не исключаю также, что некоторый софт попытается сразу прописаться и в /etc, и в /home, и в /var, а если что-то не совпадёт, то надоедать ошибками. «Подложка» уже будет запорчена, придётся возиться.
Подкованный пользователь, конечно, выберет только самое необходимое из «нашлёпки» (и даже напишет скрипт для селективного сохранения в «подложке»), но для обычного пользователя это возня;)
st1373
19.12.2016 16:46Если малинке нужен RTS то DS3231 на ebay где-то 1,5$, а если руками платку делать, то вероятно будет еще дешевле
teleghost
19.12.2016 17:05о, спасибо, что напомнили, у меня их как раз валяется без дела две штуки, купленные по €0.73 (т.е. $1.5 за пару:)
готовое HOWTO можете порекомендовать для RPi? я понимаю, там ничего сложного вроде нет, но всё жеst1373
20.12.2016 04:44конечно http://raspberrypi.ru/blog/598.html
st1373
20.12.2016 04:51конечно, Подключение RTC (часы реального времени) к Raspberry Pi
При каждой загрузке системы необходимо в качестве системного времени, устанавливать время, сохранённое в RTC. Для этого пропишите в /etc/rc.local перед exit0 следующие команды:
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s
Опционально можно отключить синхронизацию системного времени через Интернет:
sudo update-rc.d ntp disable
Установить время в RTC:
date --set=”20140125 09:17:00”
hwclock -wteleghost
21.12.2016 03:15+1ну вот, теперь я
купилбыл просто вынужден купить второй Прог для опытов:) а как иначе, если часы уже год валяются на полке, а первый Прог работает витриной в ТРЦ? Ладно, будем считать это запасным торговым оборудованием… Спасибо, одним словом! :)
evillexus
19.12.2016 16:46использую малину для управления насосами отопления в доме. Система отработала с сентября 2015 по июнь 2016 и с сентября 2016 работает по н.в.
Режим -раз в минуту считывает данные с ds18b20, включает-выключает насосы при необходимости, пишет все, что произошло, в лог. Раз в 3 часа записывается строка в файл со статистикой и файл отсылается по почте. Ну и по мере надобности, по команде через Телеграм, меняет целевые значения температур.
Графический режим не запускается.
Карта на 4 Гб, не помню какого производителя и класса, скорее всего Кингстон.teleghost
21.12.2016 02:30Приветствую, evillexus! Судя по всему, Ваши отношения с различной пром. электроникой можно считать долгими и успешными, и система работает без графики, которая вынесена на смартфон:) Вы можете подержать систему без перезагрузки подольше и выполнить пару команд (root не требует):
uptime -p cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB written: %.3f MiB\n", $3*512/1048576, $7*512/1048576}'
Интересно, что скажет?
ustas33
19.12.2016 16:46Спасибо за статью.
Пилю тонкий клиент на Pi 3.
Хочется нормальный человеческий android для Pi 3 с поддержкой.teleghost
21.12.2016 02:36На здоровье, дорогой читатель. К слову: команда МалинПрога от Android открестилась, написав об этом FAQ на оф. сайте. Конечно, нет ничего невозможного, но стоит ли оно того?
6. WILL IT RUN ANDROID?
Дескать, Android — потребительская платформа, а не дизайнерско-креативная игрушка для инженеров и энтузиастов. Пожалуй, да, хотя Google официально в этом не признается.
No. While a version of Android can be found in the forum, it is not stable enough for everyday use. There are no plans to continue working on it, as Android does not provide any enhancement to educational purposes that are not already fulfilled more readily with existing software – we see it as a platform for consumption, not creation.
Googlist
19.12.2016 16:46Еще вот в єтом линухе так сделано хорошо.
Я сталкивался с єтой бордой, там, правда, не микро сд, а компакт флеш, но принцип тот же. Инструментарий єтого линуха "/" монтирует в rо, все папки для записи монтирует в ram, и оттуда, при вьіключении девайса, записьівает на флеш один раз за аптайм, так что и данньіе сохраняются, если нормально вьіключать.
После єтого, впервьіе столкнувшись с бананой, а потом и с малиной, бьіл очень-очень сильно удивлен, что все у них устроено не так, и флеш там пишут как у себя дома на блиньі хдд.teleghost
19.12.2016 17:29+3Здравствуйте, дорогой читатель! Какой интересный и богатый у Вас орфографический стиль! Глядя на 'ы', я уж думал, у меня пиксел битый:) Сразу почему-то вспомнил печатную машинку «Адлер», приобретённую Остапом Бендером на базаре. У неё не хватало буквы 'е', и потому все переписка приобрела турецкий акцент (великий комбинатор использовал 'э' вместо 'е'). Я помню, под впечатлением от творчества Ильфа и Петрова даже вторгся в локализацию Windows 3.1 и заменил 'е' на 'э' во всех элементах GUI Program Manager. Бонус +15% к хорошему настроению на несколько дней получил (пэчать, отмэна, да/нэт, и т.д.). Тогда мир был другой, конечно.
Борда, кстати, неплоха: PoE, miniPCI, да и к Compact Flash у меня больше доверия. Но 256Мб ОЗУ сейчас маловато. А что касается встраиваемого линукса из Гонконга, то разработка, похоже, остановилась 1 мая 2015 года на версии 0.10.0. Жаль.
infernadium
19.12.2016 18:45+2Годная статья, спасибо автору. Поделюсь своей скромной статистикой. Собрал две торговых машины на мини-ПК от Olimex (того же плана пирожки, что и Raspberry). Поставил MicroSD карты Transcend 4GB. ОС — адаптированный Debian, c GUI. Никаких твиков по снижению износа карт не делал. Торговый софт на Python, на карту пишет логи (несколько десятков килобайт в сутки). В первой машинке карта продержалась год: система перестала загружаться, показывая чёрный экран малевича. Заменил карту на такую же. Замена прожила полгода: перестал запускаться торговый софт, при старте падал с ошибкой segmentation fault. Заменил на SanDisk Ultra 8GB на днях. Во второй машинке карта проработала полтора года, но я её для профилактики тоже заменил на SanDisk.
Ещё одна карта Transcend 4GB из той же партии умерла в Raspberry, который я дома время от времени использую для разработки. Система перестала загружаться, бесконечно плевалась сообщениями от fsck при загрузке. Выполнил запись нулей во все блоки виндовой утилитой flashnul, ею же прогнал полный тест — всё хорошо вроде бы. Перезалил образ. Система загрузилась, но развалилась через полчаса. Выбросил.teleghost
19.12.2016 21:49+1Спасибо, дорогой читатель. SanDisk — хороший выбор, если не контрафакт, конечно:)
Мне интересно, мои расчёты поstat
(выше) совпадают с Вашей оценкой записи в сутки? Какой был uptime на устройствах в момент снятия udevadm info?
Я чувствую, нужно сделать утилиту для вытаскивания EXTCSD из SanDisk и написать отдельную статью про мониторинг износа SD-карточки для линукса вообще и RPi в частности. Интернет вещей грядёт, пораточить мечоттачивать инструментарий.
DarkByte
21.12.2016 10:10Спасибо за статью, заглянул в /sys/block/mmcblk0/stat и удивился, за месяц набежало 6гб записи, хотя логи и все изменения пишутся в tmpfs. Решил от греха подальше перемонтировать корень в ro, а в ответ получил "/ is busy", и неожиданно обнаружил виновника — /var/swap. Не смотря на настройку vm.swappiness=0 и то, что меньше, чем 400мб свободной памяти в системе за всё время с момента запуска системы не наблюдалось. swapoff решил проблему занятости корня, а fstab закрепил изменения.
Кстати, в таких условиях работы одна флешка умерла примерно за месяц работы. Можно сказать, что это личный антирекорд по времени жизни флешки.Meklon
21.12.2016 10:16Убить флеш за 6 ГБ как-то не очень. Совсем дохлая.
DarkByte
21.12.2016 10:29Согласен, но у меня был случай, когда за две недели убился 3Тб жёсткий диск WD Green (резко начала рости показатель Reallocated Sector Count, а потом диск просто исчез из системы), на него объём записи был ещё меньше. В магазине поменяли на такой же, лет 5 уже крутится 24/7, по smart выглядит живым. Флешка была SanDisk 8Gb class 10, сейчас Kingston с теми же цифрами установлен.
teleghost
21.12.2016 12:41+1Meklon, мне только что пришла в голову одна (немного) тревожная мысль: я наивно упустил тот факт, что внутри флэшки пишется целиком *страница*, а не блок 512 байт. Поэтому при большом разбросе операций записи (в отличие от видеорегистратора, кстати) фактический расход ресурса будет кратный. Это заодно объясняет, почему при сбое питания всё может быть так плохо — микроконтроллер перед «закреплением» страницы ещё ждёт некоторое время (кэш на запись).
Параметрpreferred erase block size
на 16Гб флэшках имеет размер 4Мб, но это (слава богу) не размер страницы, это размер «вычищаемого» под запись участка. Размер страницы неизвестен, но я, посмотрев видео (внизу), предполагаю его 32кБ на современных карточках. Это даёт уже другую математику. При самом неблагоприятном раскладе (100% разброс) фактически записалось не 6Гб, а 384Гб (6Гб x 32кб/512б = 6Гб x 64). Реальную степень «разброса» записи по страницам понять очень сложно, разве что смотреть на долю «writes merged», который в Вашем случае составил 7499/8963 = 84% (чем больше, тем запись «кучнее»).
Набрёл на интересное видео по поводу внутренностей «дешевых» флэшек: http://free-electrons.com/blog/elce-2011-videos/, см. доклад Arnd Bergmann, Optimizations for Cheap Flash Media
Но если 384Гб за месяц ушатывают флэшку до невменяемого состояния… Значит, просто износ очень неравномерный. А почему нет?Meklon
21.12.2016 13:00В принципе, там действительно может быть очень тупой контроллер, который дырку протирает в одном месте.
teleghost
21.12.2016 23:57из-за ограничений механизмов сборки мусора очень рандомная запись потенциально расходует целиком весь erase block (т.е. все 8Мб), а не одну страницу, т.е. при определённых (реальных) раскладах получается даже 1000-кратный расход ресурса записи:) это могло бы объяснить, почему за два месяца логи и swap способны ушатать даже аутентичную карточку SanDisk
см. https://wiki.linaro.org/WorkingGroups/KernelArchived/Projects/FlashCardSurvey
кошмарикипостарался не вырывать фразы из контекста, но лучше, конечно, читать целиком
Writing to random addresses on the medium will result in read-modify-write operation being performed on a whole allocation group, because each write access requires a garbage collection. For instance on a typical SDHC card with 4 MB erase blocks, a workload writing 4 KB file system blocks to completely random locations results in a write amplification factor of 1024.
и далее:Only a small number of allocation groups is kept open at a time, on many SD cards only a single one, the largest observed number of open erase blocks was ten. Writing data to another allocation unit while having multiple units open causes the least recently used one to go through garbage collection. In the worst case, this can lead to the card writing a full allocation unit of multiple megabytes for each 512 byte block that gets written by the file system. All authentic Sandisk cards tested so far can write to six allocation units, and keep the most commonly written ones open, while most cheap cards have a smaller number and also use a simple one-stage least-recently-used algorithm for deciding with AU to clean up.
Карточки оптимизируют логику под FAT32, но если используется EXT3/EXT4, всё не так хорошо:
The cards take advantage of this knowledge by optimizing for the access patterns that are observed on FAT32, which unfortunately can lead to worst-case access patterns when using ext3 or other Linux file systems.
а вот это вообще бомба:However, some CF cards are known to do static wear leveling in a way that leads to data loss when the supply voltage gets lost while the card is doing static wear leveling. This is even the case for read-only cards, since the static wear leveling can get triggered by read accesses on those cards.
я так понимаю, что static wear leveling вроде как анахронизм ужеa5b
21.12.2016 19:57Еще Bergmann (2010-2011) — http://elinux.org/images/4/49/Elc2011_bergmann.pdf https://lwn.net/Articles/428584/
teleghost
21.12.2016 22:57a5b, спасибо за статью! хорошо бы ещё понять, какие метрики можно снять из того же sysfs, как добраться до внутренних показателей карточки, не обвалив работающую с неё систему, и как это всё правильно трактовать
a5b
22.12.2016 04:06Некоторые подробности о контроллерах (в т.ч. фото) microsd — http://bunniefoo.com/bunnie/sdcard-30c3-pub.pdf http://www.bunniestudios.com/blog/?p=918 https://www.youtube.com/watch?v=CPEzLNh5YIo
Small embedded controller in every “managed Flash” device
– 8051 or ARM7 CPU
– 4-8mm^2 silicon = ~$0.15-$0.30 cost add-on
TLC/MLC Flash price is < 0.1nano$/bit
– Only achievable because every piece of silicon fabricated is sold, regardless of fabrication errors – nothing is thrown away
– Work around: bad block remapping
? In some cases, over 80% of blocks are bad (e.g. 16GiB chip sold as 2GiB)
– Also, blocks go bad with P/E cycles
Flash geometry changes every 12-18 mos
? New ECC rules
? New page size, block mapping
? Intensely cost-sensitive market
? Lowest cost, highest performing Flash chips are proprietary
What runs on the microcontroller? Can it be hacked? Can I trust my Flash memory?
… Fuzzing knock sequence
? 64 possible commands – Only 4 “manufacturer” commands – 2^32 possible arguments — No success
… Writing a debugger
… SD cards contain fully programmable microcontrollers
? Controller program modifiable via special host commands
teleghost
21.12.2016 11:49DarkByte, приветствую! кстати,ilmarin77 уже комментировал выше параметр vm.swappiness, после чего мы обсудили noswap в /boot/cmdline.txt и снос dphys-swapfile
Rumlin
23.12.2016 14:22Может кому интересно — попалось упоминание про гибнущие карточки.
I now have 2 corrupted Transcend cards due to some unknown weird oPi issue. I have a rPi3 coming today and the oPi is going to be relegated to some other benign use. I'm hoping Transcend will RMA these cards.
Are you sure it is due to Orange Pi? Lot of people having RPi also have complaint of corrupted/worn out cards. I dont think this issue is related to make or model of Pi.
I have Pi B+, Pi 2, and OPi PC. None of my microSD cards have corrupted or worn out, though each card has several times faced formatting and fresh install.
One card came out of a Pi 2, the other was brand new. The Pi2 with an old card is still trucking and that is feeding to LiveATC.net 100% of the time with pretty good load. I think the oPi is also getting taxed when the reports/sec get above 400.
teleghost
27.12.2016 14:59Благодарю за комментарий, но это относится к узкоспециальному софту FlightAware (который представляет собой в моём понимании телеметрическую линукс-обвязку к проекту dump1090 с добавлением графики). Износ SD-карточек определяется именно софтом: как и что именно записывается, в каком порядке, с каким разбросом, в каких объёмах, и т.д. Т.е. простая скалярная метрика «кол-во записанных блоков в сутки» характеризует износ не больше, чем средняя температура по больнице описывает здоровье пациентов, а при использовании другого софта (например, OpenELEC) картина фактического износа может быть совершенно другой, даже при одинаковой «плотности» записи в сутки.
ilmarin77
27.12.2016 17:23Кстати, RPi3 официально поддерживает загрузку по USB: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
И, что актуально для этой статьи, загрузку через сеть: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net.md
sleeply4cat
Печально это всё. У нас за два месяца работы над, вероятно, схожим проектом в трёх малинах подохли две карточки. Одна покрылась бэдами, вторая перешла в ридонли. С содроганием ожидаю момента, когда оно релизнется и будет работать автономно D:
teleghost
всего два месяца?? я даже не подозревал, что всё настолько фигово, добавлю-ка пункт в голосовалку
maxp
У меня жили по 2-3 месяца, даже без граф.обоочек.
С readonly-root живут на улице уже более года, некоторые станции слеланы на «малине» — http://meteo38.ru/
LynXzp
Вот оно что, а я думал что это упавшее питание убивает карточки, и волосы на голове рвал с чего бы это.
Т.е. работает оно пару месяцев, все ок, может какие-то проблемы пошли, но ОС загружена, а после выключения уже не поднимается. И естественно думал что раз выключение питания убивает карту, то никакое readonly не поможет. Никогда не знаешь каким боком баг вылезет.
teleghost
Я так представляю процесс: размер записываемого блока 512 байт кратно меньше страницы NAND-памяти, которую микроконтроллер флэшки вынужден сперва «взять» целиком, заменить в ней эти 512 байт, после чего «пристроить» на новое место (всё происходит внутри флэшки, драйвер файловой системы ничего этого не видит). Причём сперва это новое место нужно ещё найти и очистить током (flash erase).
Сбой питания вряд ли убьёт карточку, но может не дать закончиться транзакции записи, о чём драйвер файловой системы так и не узнает. Вероятность «битой» транзакции зависит ещё и от того, насколько хорошо сделана прошивка микроконтроллера флэшки. У контрафактных продуктов с китайских онлайн-площадок
в качествевместо «мозгов» может быть вообще всё, что угодно, включая черновые варианты украденных исходных кодов, примеры из поставок профессиональных средств для разработчиков (тоже украденных) и т.д. Это целый мир, скрытый в маленьком кусочке пластика.Поэтому с точки зрения сбоя питания регулярная запись на флэшку резко увеличивает вероятность непокрываемой журналом файловой системы потери данных, однако не делает эту вероятность 100%. Но даже если карточка по-честному произведена, например, SanDisk, и имеет идеальные мозги, остаётся неконтролируемый электрический износ, который пока можно отслеживать только вручную (я поместил пару простых команд Linux в публикацию). Ждём новые отраслевые стандарты и аналоги HDD SMART для Интернета Вещей.
Переход на read-only должен решать обе проблемы: при отсутствии записи не должно быть ни электрического износа NAND-памяти, ни «битых» транзакций. И даже на контрафактных носителях система будет себя вести гораздо стабильнее, но всё равно недолго:)