Советы для работы в Linux с флешки

Автор оригинала: David Härdeman
  • Перевод
После покупки Asus eeePC и установки туда линукса я задумался о продлении срока службы встроенных ssd-дисков. В поисках по интернету я нашел интересную статью, в которой описано как это можно сделать. Статья мне очень понравилась и я решил сделать ее перевод.

Если Вы работает в линуксе с флешки, то есть несколько вещей, которые Вы могли бы захотеть сделать с целью уменьшить износ используемой флешки (так как она имеет ограниченное число циклов перезаписи).
  • Файловая система ext3 по умолчанию записывает изменения метаданных на диск каждые 5 секунд. Этот период может быть увеличен путем монтирования файловой системы с параметром commit=N, который говорит ядру задерживать запись на N секунд.
  • Ядро записывает новое время доступа для каждого файла, который был прочитан, что генерирует одну операцию записи на каждое чтение. Это может быть отключено путем монтирования файловой системы с опцией noatime.
  • Оба вышеперечисленных действия могут быть установлены добавлением опций noatime,commit=120,… в файл /etc/fstab. Так же это можно сделать для уже смонтированных файловых систем путем выполнения команды:

    mount -o remount,noatime,commit=120 /

  • Система будет запускать updatedb каждый день, который создает базу данных для всех файлов в системе для использования в команде locate. Это будет также негативно сказываться на файловой системе, поэтому Вы можете захотеть отключить это добавив:

    exit 0

    ранее в скрипт /etc/cron.daily/find.
  • syslogd при установке по умолчанию будет синхронизировать большое количество логов на диск сразу же после добавления новой информации. Вы можете захотеть изменить /etc/syslog.conf так, что каждое имя файла начиналось бы со знака «-» (минус), что означает что файлы не синхронизируются мгновенно (это повышает риск что некоторые сообщения будут потеряны если ваша система зависнет). Например, такая линия как:

    kern.* /var/log/kern.log

    Может быть изменена на:

    kern.* -/var/log/kern.log

  • Вы так же можете захотеть отключить некоторые классы сообщений вообще, записывая их в /dev/null вместо файла, смотрите syslog.conf(5) для дополнительной информации.
  • Так же syslogd любит писать линии — MARK — в лог каждые 20 минут что бы показать что система все еще работает. Это может быть отключено изменением опции SYSLOGD в /etc/default/syslogd таким образом:
    SYSLOGD="-m 0"

    После того как Вы сделаете данные изменения Вам потребуется перезапустить syslogd выполнив команду:

    /etc/init.d/syslogd restart

  • Если у Вас есть раздел подкачки или файл подкачки на флешке, Вы можете захотеть постоянно перемещать его на другую часть диска что бы убедиться что разные части диска изнашиваются одинаково из-за частых записей, которые он генерирует. Для файла подкачки это может быть сделано путем создания нового файла подкачки перед удалением старого.
  • Если у Вас есть раздел подкачки или файл подкачки хранимый на флешке, Вы можете убедиться что он используется как можно меньше установив /proc/sys/vm/swappiness в 0.
  • Ядро также имеет настройку известную как laptop_mode (режим ноутбука), которая заставляет его откладывать запись на диск (изначально создавалась с намерением позволить диску ноутбука останавливаться пока он не используется, отсюда и название). Несколько файлов в директории /proc/sys/vm/ контролируют его (режима) работу:
    • /proc/sys/vm/laptop_mode: Через сколько секунд после чтения данных должна начаться запись измененных файлов (это основано на предположении о том, что чтение вызовет раскрутку ранее остановленного диска).
    • /proc/sys/vm/dirty_writeback_centisecs: Как часто ядро должно проверять есть ли «грязные» (измененные) данные для записи на диск (в сантисекундах).
    • /proc/sys/vm/dirty_expire_centisecs: Насколько «грязны» должны быть данные, что бы ядро решило что они достаточно стары для записи на диск. В общем случае, это хорошая идея установить для этой опции такое же значение как и для dirty_writeback_centisecs выше.
    • /proc/sys/vm/dirty_ratio: Максимальный размер памяти (в процентах), для хранения грязных данных прежде чем процесс, их сгенерировавший, будет принужден записать их. Установка этому параметру высокого значения не должно быть проблемой, так как запись будет так же происходить если в системе закончится память.
    • /proc/sys/vm/dirty_background_ratio: Минимальное число памяти (в процентах), где позволено хранить гразные данные вместо записи на диск. Этот параметр должен быть намного меньше чем dirty_ratio что бы позволить записывать куски грязных данных за один проход.

Все вышеперечисленные параметры ядра могут быть настроены используя собственных загрузочный скрипт, как в этом примере. Сохраните его, например, в /etc/init.d/kernel-params, сделайте его исполняемым с помощью команды

chmod a+x /etc/init.d/kernel-params

и убедитесь что он выполняется с помощью команды

update-rc.d kernel-params defaults

Замечание. Большинство из этих настроек уменьшают число записей на диск путем увеличения использования памяти. Это увеличивает риск ситуации нехватки памяти (что может запустить «убийцу процессов» в ядре). Это может произойти даже если есть доступная свободная память (например, когда ядру требуется выделить более чем одну непрерывную страницу, но доступны только фрагментированные страницы).
Таким образом, с любыми настройками рекомендуется приглядывать за объемом свободной памяти и изменять эти настройки (используя менее агрессивное кэширование и увеличение подкачки) в зависимости от рабочей загрузки.
Поделиться публикацией

Комментарии 35

    +2
    отличная подборка! полезна не только пользователям нетбуков.
    а почему нет совета по использованию специализированных для флешек файловых систем?
      +1
      Возможно это будет тема для отдельной статьи. К тому же стоит отметить, что у современных ssd-дисков число циклов перезаписи увеличено, поэтому необходимость в специализированных файловых системах снижается. Лимит циклов перезаписи для eeePC подсчитали вот тут.
        +1
        Специальные системы нужны на «голых» флешек, когда проц общается непосредственно с флешкой, без контроллера. А для «умных», у которых есть контроллер, поддерживающий wear levelling и прочие фишки, специализированные системы не требуются.
        0
        Можно вопрос? При обычном использовании, на сколько хватит SSD диска. Год? Два?
          +2
          Судя по расчетам, которые я упоминал выше, срок службы такого диска исчисляется годами. Точную цифру назвать сложно, но думаю что ноутбуки, которые используют современные SSD-диски, будут устаревать раньше, чем их диск выйдет из строя.
          Вот перевод заключения из этих расчетов:
          С SSD установленной в eeePC, обычный пользователь (работает 6 часов в день, 10% уровень записи) будет записывать 36 минут в день, что в результате дает срок службы ~25 лет в худшем случае. Другими словами я не собираюсь беспокоиться по этому поводу
            0
            А если немножко по другому посчитать…

            Каждые 5 секунд ext3 будет мне записывать метаданные на диск. Значит в минуту — 12 раз, в час — 720. Если считать что человек будет работать по 5 часов в день, а количество перезаписей ssd диска по словам википедии ~100 000 раз, то выходит. что 100000/(720*5) = ~месяц???

            Объясните мне моё заблуждение пожалуйста…
              0
              100000 раз можно писать в одну и ту же ячейку. После этого она перестает работать. Метаданные пишутся в разные ячейки на флешке а не в одну и ту же, поэтому срок службы гораздо выше.
                0
                Получается в месте где лежат конфиги и т.д. что часто открыто будет идти постоянный износ ячейки каждый месяц.
              0
              Вот и мне кажется, что игра с настройками в данном случае не совсем стоит свеч.
                0
                А это считали для MLC или SLC?
                  0
                  не думаю что в eeePC стоит SLC )
                  0
                  ? каким это образом вы перевели время работы во время записи, а время записи в ресурс?! ресур зависит от количества записей а никак не от времени. Если я буду со скоростью 8 MB/s писать равномерно по всем диску, то это могут быть годы непрерывной записи. А если долбить в один сектор, то убью флэшку за три часа.
                0
                Спасибо за подборку.

                >Этот период может быть увеличен путем монтирования файловой системы с параметром commit=N

                А как выбрать оптимальное N?
                  0
                  Зависит от стабильности системы и объема свободной памяти. Чем больше N, тем больше рис потери данных при зависании компьютера и больше оперативной памяти требуется. Для себя я выбрал N равным 60
                    0
                    на вики странице проекта Debian for eeePC написано. что этот параметр хорошо бы выставить равным 15.
                      0
                      Вы перепутали его с параметром vm.dirty_writeback_centisecs:
                      Open /etc/sysctl.conf and set vm.dirty_writeback_centisecs = 1500. This will prolong the life of your SSD by writing to the disk every 15 seconds instead of 5.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Я держал Debian Lenny на одной старой 2-х гиговой usb-флешке где какие-либо встроенные контроллеры отсутствуют в течении месяца. В качестве файловой системы я использовал ext3fs. И с ней ничего плохого не случилось.
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Зачем же тогда для них разрабатывают специальные файловые системы?
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            Я никогда не задумывался над вопросом о формфакторах накопителей
                              +6
                              В большинстве USB-флэшек всё тупо пишется в одни и те же места. В большинстве SSD есть есть контроллер, который выравнивает износ. На самом деле — разница видна невообружонным глазом. Если вы хотите получить равномерный износ, то нужно организовать что-то вроде циклического буффера на флэше, но тогда, когда буфер переполнится, свободное место придётся стирать (флэш не допускает запись «по-верх», каждая страница должна быть преварительно стёрта). Большинство SSD страдает неравномерной скорость доступа — диск может «зависнуть» на некоторое относительно небольшой врмея (от 100 Мс до секунд) в течении которого он стирает неиспользуемое место циклического буфера (это кстати создаёт некоторое проблеммы в приложениях, где нужно гарантированое время доступа к диску). Проверить практичеески можно построив график скосрости записи на диск с объёмом записываемых данных, больше чем ёмоксть диска — на графике будут значительные провалы в скороси через равные промежутки данных.
                              В общем ещё раз — большинство USB/CF/SD не обеспечивабт равномерный износ. Правда, у них и ресурс по-выше — до 1'000'000 перезаписей. Большинство SSD пытается обеспечить равномерный износ флэша (но и ресурс, как правило, меньше). Если контроллер флэша обеспечиввает равномерный износ, то об этом обязательно пишут в даташите, так как в этом случае он не обеспечиват равномерной скорости доступа. Убить USB-флэшку можно за время от месяца до полугода, и таких пример достаточно. Продлить ресурс USB-флэша на один-два порядка, можно включив отложенную запись и отключив запись врменеи доступа к фалу (причём, как под Windows, так и под Linux).
                              Всё это проверялось на практике в ходе одного НИОКРа. В резульате для системного диска получили ресурс обычной флэшки без контроллера ~6 мес. Ресурс SSD с контроллером ~ 2года. При отключеном обновлении времён доступа и включённом кэшировании записи: без контроллера ~2..3 года, с контроллером 5 лет и больше. Кстати, не стоит заполнять SSD на 100% — это сильно продлевает ресурс (желательно деражать свободным в восемь раз больше чем объём всех часто изменяющихся данных на дискею Сюда входит размер всех метаданных + средний размер всех логов + размер свопа). Опять же, русурс флэшки под Linux Debian Sarge ext3 получался ниже чем ресурс под WinXP NTFS. Но под Windows можно только свопом, стратегией выделения свопа, временим доступа и кэшированием управлять (грамотно настроенное продлевает ресурс от 5 раз), а под Linux удалось его практически до бесконечности продлить — собственно крутили то, что этом посте написано (написали назначеный срок службы 5 лет и успокоились).
                              Немного не в тему, но — пользователи windows, которые активно используют флэш — включайте кэширование записи для флэшек и по-возможность пользуйте NTFS!!!
                              Правда, если у вас есть тупая софтина, которая пишет в одно и тоже место диска (много кто в этом замечен был), то флэшку без контроллера она, таки, убёт за несколько месяцев. SSD продержится дольше (зависит от кол-ва свободного места).
                                +2
                                вам нужно было не коммент писать, а отдельно статью :)
                      0
                      Респект автору за перевод! Вот сфишкой перезаписывания ext3 я пользовался когда заливал BackTrack на флэшку. Очень значительно увеличивает жизнь маленькому другу(флэшке)! Еще раз огромное спосибо
                        0
                        Спасибо за хорошую статью. Я правильно понимаю, что ограничивать себя использованием ext2 на SSD особого смысла нет?
                          0
                          Да, можно смело использовать ext3
                          0
                          Насколько помню, также советуют использовать reiserFS, вместо ext3.
                            0
                            Ну холивары по поводу этих файловых систем до сих пор не утихают, поэтому объективно сказать какая из этих файловых систем лучше сложно.
                            0
                            Ещё очень помогает использование ramfs для /tmp, /var/log, /var/tmp
                            На ноутбуке обычно не требуется длительно хранить логи
                              0
                              вот это самый толковый совет. пользы от него будет побольше чем от всей той статьи. хотя и в ней есть пара строк полезной информации.
                                0
                                Совсем позабыл, что это «Linux для всех».
                                … для этого нужно в файл /etc/fstab добавить следующие строки:
                                tmpfs /var/log tmpfs defaults,size=50M 0 0
                                tmpfs /tmp tmpfs defaults,size=50M 0 0
                                tmpfs /var/tmp tmpfs defaults,size=10M 0 0
                                0
                                > После покупки Asus eeePC и установки туда линукса я задумался о продлении срока службы встроенных ssd-дисков.

                                И тогда ваш eeePC даже десять лет спустя будет продолжать радовать вас своей работой!
                                  0
                                  Советы, думается, имеют смысл.
                                  Но перед приобретением подобных железяк с SSD накопителем, думаю, стоит подумать, нужно ли оно вам?
                                  Да, оно нынче модно, но стоит ли гоняться за модой, если оно будет требовать заморочек?

                                  Как обычно, сначала думаем, потом приобретаем.
                                    0
                                    Параметры, которые устанавливаются через /proc/sys, так же можно прописать в /etc/sysctl.conf. Например вместо выполнения при загрузке
                                    echo -n 0 >> /proc/sys/vm/swappiness

                                    можно один раз добавить в /etc/sysctl.conf строчку
                                    vm.swappiness=0

                                    И не придется писать какие-то дополнительные init скрипты.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое