Введение

Итак, в интернете можно найти статьи о том что в Raspberry флешки «живут» 2-3 месяца, после чего приходят в негодность. Предложенные решения — заменить стандартную microSD карточку на USB HDD. Решение простое, надёжное, плюс повышается скорость чтения/записи. Но почему флешки так быстро «умирают»? Могут ли те же факторы навредить жёсткому диску? И так приступим!

Матчасть
У флеш-накопителей есть ограниченное количество циклов записи. Значит если linux будет постоянно что то на неё писать — она может выйти из строя раньше времени. Жёсткие диски работают по другому принципу. Но для них мелкие операции чтения/записи тоже не особо полезны. Головка жёсткого диска может парковаться если он не используется определённый промежуток времени, это может делать система, а так же может быть заложенно в железе. В случае мелких операций чтения/записи, жёсткий диск постоянно не может запарковать головку (не критично) или паркует головку, и тут же начаинает что то читать/писать (вот это уже хуже).

Информация пишется страницами. Обычный размер страниы 4 кБ. Так что если мы хотим записать один байт, то или он поместится в буфер, или будет записанно 4 кБ. Если буфер заполнен, то страница записывается и дальнейшая запись идёт в следующую страницу, которая находится в ОЗУ.

Запись маленьких порций информации используется при журналировании файловой системы (даёт возможность не потерять информацию при сбое, например выключении питания), а так же функции логирования (сохрняют информацию о тех или иных системных событиях, или событиях программ). В raspberry логирование выполняет rsyslog[1]

В Raspbian есть два демона, которые можно отключить для уменьшения нагрузки на корневой носитель информации. Отключив их можно выиграть в операциях записи, но проиграть в надёжности и возможности востановления. Это демон журналирования файловой системы и rsyslog. Так что если есть ценные данные которые будут храниться в корневом диске, то службу журналирования лучше не отключать. Если же raspberry используется как игрушка или есть возможность быстро заменить основной диск, то журналирование файловой системы можно отключить. Насчёт логирования аналогично, если вы не знаете зачем оно нужно, то достаточно сказать что если что то не работает, то неисправность нужно искать изначально в логах. Если захотите задать вопрос кому то на форуме, то скорее всего попросят скинуть логи. Так что если всё работает или вам проще переустановить систему чем разбираться что «посыпалось» — можете смело отключать логи.

Для просмотра обращений к накопителям можно использовать утилиту iotop. Для этого нужно запустить её с параметрами:

sudo iotop -o -a

Установка iotop
sudo apt-get install iotop

Отключение логирования

Для отключения логирования открываем:

sudo nano /etc/rsyslog.conf

и комментируем в нём две сткроки в секции MODULES:

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support

Должно получиться так:

#  /etc/rsyslog.conf	Configuration file for rsyslog.
#
#			For more information see
#			/usr/share/doc/rsyslog-doc/html/rsyslog_conf.html


#################
#### MODULES ####
#################

#$ModLoad imuxsock # provides support for local system logging
#$ModLoad imklog   # provides kernel logging support
#$ModLoad immark  # provides --MARK-- message capability

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf


###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
#cron.*				/var/log/cron.log
daemon.*			-/var/log/daemon.log
kern.*				-/var/log/kern.log
lpr.*				-/var/log/lpr.log
mail.*				-/var/log/mail.log
user.*				-/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info			-/var/log/mail.info
mail.warn			-/var/log/mail.warn
mail.err			/var/log/mail.err

#
# Logging for INN news system.
#
news.crit			/var/log/news/news.crit
news.err			/var/log/news/news.err
news.notice			-/var/log/news/news.notice

#
# Some "catch-all" log files.
#
*.=debug;	auth,authpriv.none;	news.none;mail.none	-/var/log/debug
*.=info;*.=notice;*.=warn;	auth,authpriv.none;	cron,daemon.none;	mail,news.none		-/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg				:omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;#	news.=crit;news.=err;news.=notice;#	*.=debug;*.=info;#	*.=notice;*.=warn	/dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
# 
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;	news.err;	*.=debug;*.=info;	*.=notice;*.=warn	|/dev/xconsole



После перезагрузки система прекратит логирование. Проверяем:

sudo iotop -o -a

В выводе больше нет rsyslog.

Отключение журналирования

Тут есть небольшая сложность — раздел должен быть отмонтирован. Для этого можно использовать:

  • другой компьютер с линуксом
  • другой накопитель в качестве основного (например обычную флешку)
  • другой компьютер + LifeCD с линуксом

В случае когда у вас microSD карта — раздел на котором стоит система будет определятся как mmcblk0p2.

Тут mmcblk0 — это сама карточка, а p2 — второй раздел на ней (первый по умолчанию boot). Eсли же вы используете USB накопитель, то раздел определиться как sda2. Если вы загружаетесь с другого компьютера то скорее всего он определиться как sdb2.

Далее выполняем:

sudo umount /dev/sdb2
sudo tune2fs -O ^has_journal /dev/sdb2
sudo e2fsck -f /dev/sdb2

После этого проверяем:

dmesg | grep EXT4

Выдаёт:

[ 5890.967580] EXT4-fs (sdb2): mounted filesystem without journal. Opts: (null)

Загружаемся с нашего накопителя, вводим:

sudo iotop -o -a

И видим что к жёсткому диску только изредка обращается LXDE. В виду того что эти обращения не систематичны (понаблюдаем минут 5-10) можно сказать что нагрузка на накопитель уменьшилась практически до нуля.
Поделиться с друзьями
-->

Комментарии (9)


  1. Spider55
    04.06.2017 07:38
    +2

    Всё вышеперечисленное не очень спасает SD. Велосипед уже изобретён и протюнен как только можно ранее в https://geektimes.ru/post/283802/


    1. Anarhist2017
      06.06.2017 13:58

      В данном случае целью было немного снизить нагрузку. В статье всё же предлагают сделать read only систему. Это даст большой плюс к продолжительности жизни, но всё же наложит органичение на запись в ФС. В случае домашнего сервера, который будет складировать показания датчиков, read only — не самое простое решение.


  1. MikalaiR
    04.06.2017 10:39

    Может вместо отключения журнала в ext4 стоит использовать f2fs? Она как раз для этого и задумана.


    1. Spider55
      04.06.2017 14:29

      прочитайте статью по ссылке https://xakep.ru/2016/10/10/f2fs-mythology/
      смысла почти нет…


      1. mickvav
        04.06.2017 15:52

        А на btrfs или на jffs2 кто-нибудь пробовал держать корень?


    1. Andronas
      05.06.2017 11:17

      А что скажете про использование ext2 она нежурналируемая


    1. Anarhist2017
      06.06.2017 13:50

      В данном случае был использован этот образ. Он был распакован под Windows и файловая система уже была.


  1. GrafDL
    05.06.2017 05:33

    Какую такую надежность дает журналирование, если флешка внезапно помирает через 3 месяца?


    1. 3ap
      05.06.2017 07:18
      +1

      Надёжность не в том плане, что запас прочности устройство-носителя контролируется (это делает физический контроллер флешек), а в том, что данные не потеряются и не закорраптятся в случае внезапной потери питания или при каких-то непридвиденных обстоятельствах (при kernel panic, например).