LinuxForum.Fans
Тема

Мануал по оптимизации Linux для работы с флешки

Автор: r0ck3r 17 сообщений 7728 просмотров
#196148

Думаю, что ни для кого не секрет, что флеш-накопители имеет ограниченный ресурс перезаписей, поэтому, хотелось бы опубликовать небольшой мануал по оптимизации работы ОС, используя флешку только для чтения и записывать данные только один раз при завершении работы.
Дело в том, что мой вариант оптимизации был разработан и проверен на Russian Fedora Remix 15, поэтому я с радостью приму все пожелания и исправления, для создания 100% решения для всех дистрибутивов.

Первое, что нам необходимо сделать — это создать разделы на флешке, для возможности использования ее в Windows. Если этого не планируется, то этот шаг можно пропустить. Так как мной был использован накопитель, объемом 16 Гб, я решил создать общий раздел объемом в 10 Гб FAT32 и все остальное раздел для Linux Ext2, причем файловая система Ext2 выбрана тоже не с проста — ее преимуществом для использования на флешке является то, что она не является журналируемой.
Возможно, кто-то сделает замечание, что выносить этот шаг в отдельный пункт не требуется, но существует некоторая проблема, из-за которой установщик Fedora (наверное, только Fedora) делает корневой раздел первым, а это означает, что Windows не увидит раздела, который будет предназначен для нее.

Второй шаг — это установка дистрибутива. При установке дистрибутива ничего особенного нам не требуется, главное что нужно сделать — это выбрать созданный нами раздел Ext2 на флешке для монтирования его в корень и указать, что GRUB должен быть установлен на флешку (у меня это /dev/sdb). Ну а дальше как обычно — выбираем нужные пакеты и устанавливаем. После установки мне пришлось подправить /boot/grub/grub.conf и /etc/fstab чтобы удалить записи про swap, добавляющиеся при установке системы на компьютере, на котором уже стоит Linux и установщик подключает их как swap для новой системы

Примерно так в fstab:

text

UUID=0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86    /    ext4    defaults    1 1
#/dev/mapper/VolGroup-lv_swap swap    swap    defaults    0 0 #эту строку удаляем...
tmpfs    /dev/shm    tmpfs    defaults    0 0
devpts    /dev/pts    devpts  gid=5,mode=620  0 0
sysfs    /sys    sysfs    defaults    0 0
proc    /proc    proc    defaults    0 0

И примерно так в grub.conf:

text

kernel /boot/vmlinuz-2.6.38.6-27.fc15.x86_64 ro root=UUID=0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86 rd_LVM_LV=VolGroup/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=ru_RU.UTF-8 KEYTABLE=ru rhgb quiet

удалил строку rd_LVM_LV=VolGroup/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM

Здесь хотелось бы пояснить, что в GRUB и fstab необходимо прописывать не адреса устройств (типа /dev/sdb1), а через их UUID (root=UUID=0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86), чтобы система не была привязана к конкретным адресам устройств, если на компьютере на котором запускается флешка не установлено или установлено несколько жестких дисков. Установщик Fedora делает это сам.

В результате мы получили систему, которая успешно грузится на всех компьютерах, осталась лишь проблема с оптимизацией.

Теперь настраиваем системные сервисы и, если необходимо, обновляем ПО установленное с диска и можем смело перейти к следующему шагу — подключение корня в reanonly.
Для этого:

text

sudo rm -fr /etc/resolv.conf
touch /tmp/resolv.conf
ln -s /tmp/resolv.conf /etc/resolv.conf

Это нам нужно для того, чтобы NetworkManager мог прописывать DNS-сервера.
Уничтожаем /etc/resolv.conf
Создаем /tmp/resolv.conf
Создаем ссылку с /etc/resolv.conf на /tmp/resolv.conf

Переименовываем /sbin/shutdown в /sbin/shutdown2:

text

mv /sbin/shutdown /sbin/shutdown2

Создаем новый /sbin/shutdown

text

#!/bin/bash
tar -jcf /tmp/home.tar.bz2 /home
mount / -o remount,rw
mv -f /tmp/home.tar.bz2 /
mount / -o remount,ro
/sbin/shutdown2 $@

и не забыть chmod +x /sbin/shutdown
Этот скрипт архивирует /home, помещая ее в /tmp, затем перемонтирует корень в режим для записи, перемещает /tmp/home.tar.bz2 в /home.tar.bz2 и монтирует флешку в режим только для записи
Это нужно для того, чтобы данные из /home у нас не терялись

В файл /etc/rc.d/rc.local добавляем:

text

tar -jxf /home.tar.bz2 -C /
touch /tmp/resolv.conf

Этот шаг распакует архив /home.tar.bz2 в /home, которая у нас будет примонтирована как tmpfs
И создаст /tmp/resolv.conf на который будет ссылаться /etc/resolv.conf

Ну и последний момент — правка fstab для монтирования корня в readonly и изменяемых разделов в tmpfs:

не забываем поменять 0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86 на UUID Вашего раздела

text

меняем
UUID=0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86    /    ext4    defaults    1 1
на
UUID=0b9cab29-b7e1-4da7-b7dc-3e59ccdd3c86    /    ext4    defaults,ro    1 1
#ram disks
tmpfs   /home            tmpfs    defaults        0 0
tmpfs   /tmp               tmpfs   defaults        0 0
tmpfs   /var/tmp         tmpfs    defaults        0 0
tmpfs   /var/log          tmpfs    defaults        0 0
tmpfs   /var/db           tmpfs   defaults        0 0
tmpfs   /var/run          tmpfs   defaults        0 0
tmpfs   /var/lock        tmpfs   defaults        0 0

в результате:
корень в readonly
/home /tmp /var/tmp /var/log и /var/db примонтированы как tmpfs, то есть они хранятся в ОЗУ и при завершении работы они очищаются

На этом все. Мы имеем систему, которая запускается с флешки на всех компьютерах и не тратит ресурс флешки попусту

#196169

r0ck3r, на будущее - есть кнопка "Изменить"
прикреплять не буду, ибо описываете элементарные вещи и костыли, которые лучше не повторять...

#196193
Fat-Zer написал:
r0ck3r, на будущее - есть кнопка "Изменить"
прикреплять не буду, ибо описываете элементарные вещи и костыли, которые лучше не повторять...

да, просто не знаю почему второй раз нажал ответить...а потом ушел...
ну вообще этот мануал был сделан для того чтобы его доработать так, чтобы он перестал быть костылем, а рабочим вариантом для любого дистрибутива...

#196251

Не в тот раздел тогда, если нормальный мануал, то наверное можно в http://linuxforum.ru/viewforum.php?id=14 - там прикрепить его, ну и доработать так чтобы всем понятно/доступно было.

#196275

я чего-то и забыл про тот раздел... сейчас перекину...

#196342

Fat-Zer, emlsch, посмотрел соседнюю тему, запинали бедного r0ck3r :lol: ... идея то у него хорошая, пусть мануал нормальный напишет именно в разделе Live USB.

#196493
newzenon написал:
Fat-Zer, emlsch, посмотрел соседнюю тему, запинали бедного r0ck3r :lol: ... идея то у него хорошая, пусть мануал нормальный напишет именно в разделе Live USB.

вроде подредактировал...хотелось бы узнать что именно не так, ибо я не имею опыта написания мануалов

#196500

r0ck3r, не вникал сильно, вроде нормально, кто-нибудь будет делать, вопросы возникнут, отрихтуешь.

#196528

из замечаний:

r0ck3r написал:
Переименовываем /sbin/shutdown в /sbin/shutdown2

вместо этого уместносделать скрипт и повесить выключение средствами дистрибутива.

r0ck3r написал:
tar -jcf /tmp/home.tar.bz2 /home

нафига тарить хоум? о_О

r0ck3r написал:
/sbin/shutdown2 $1 $2 $3 $4 $5 $6 $7 $8 $9

это записывается man bash и посмотрите, что такое $@

+ раз / всё равно монтируете ro, то вместо порева с ресолвконф и гаданием, что выносить в tmpfs, надо использовать связку Aufs+tmpfs...
в TODO: сквош корня.

#196560

огог! спасибо большое) я мало что в этом понимаю, а тут все четко)))

#196567

Fat-Zer, про это: ??

text
4. Usage
----------------------------------------
At first, make sure aufs-util are installed, and please read the aufs
manual, aufs.5 in aufs-util.git tree.
$ man -l aufs.5

And then, $ mkdir /tmp/rw /tmp/aufs # mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs

Here is another example. The result is equivalent. # mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs Or # mount -t aufs -o br:/tmp/rw none /tmp/aufs # mount -o remount,append:${HOME} /tmp/aufs

Then, you can see whole tree of your home dir through /tmp/aufs. If you modify a file under /tmp/aufs, the one on your home directory is not affected, instead the same named file will be newly created under /tmp/rw. And all of your modification to a file will be applied to the one under /tmp/rw. This is called the file based Copy on Write (COW) method. Aufs mount options are described in aufs.5. If you run chroot or something and make your aufs as a root directory, then you need to customize the shutdown script. See the aufs manual in detail.

Additionally, there are some sample usages of aufs which are a diskless system with network booting, and LiveCD over NFS. See sample dir in CVS tree on SourceForge.

#196568
Fat-Zer написал:
из замечаний:
вместо этого уместносделать скрипт и повесить выключение средствами дистрибутива.

насколько я понимаю этот метод не будет универсальным?

Fat-Zer написал:

нафига тарить хоум? о_О

Чтобы сохранить права на файлы...можно было бы и cp, но тогда права не сохранятся и надо было бы /etc/rc.d/rc.local дописать chown -R user:user /home/user

Fat-Zer написал:

это записывается man bash и посмотрите, что такое $@

Исправил)

Fat-Zer написал:

+ раз / всё равно монтируете ro, то вместо порева с ресолвконф и гаданием, что выносить в tmpfs, надо использовать связку Aufs+tmpfs...
в TODO: сквош корня.

никогда Aufs не пользовался..расскажите поподробней как или где об этом почитать?
squashfs? если я не ошибаюсь она readonly by design и изменение настроек/сохранение данных не станет возможным?

#196577

newzenon, оно самое, правда в стандартном ядре(покрайнемерь в ванильном и гентушном его нет), точно есть в zen'е... про остальные - не знаю...

#196591
r0ck3r написал:
насколько я понимаю этот метод не будет универсальным?

нет, но хотя бы сделайте ремарку, что правильно было бы не трогать шатдаун, а сделать скрипт...

r0ck3r написал:
Чтобы сохранить права на файлы...можно было бы и cp, но тогда права не сохранятся и надо было бы /etc/rc.d/rc.local дописать chown -R user:user /home/user

я не заметил просто, что вы его восстанавливаете...

r0ck3r написал:
никогда Aufs не пользовался..расскажите поподробней как или где об этом почитать?

я тоже пока не пользовался - руки никак до нетбука не доберутся... вики собственно страничка.

собственно в монтировании корня ro большого смысла нет... достаточно просто свести запись к минимуму + стандартные меры, типа таймаут на сброс грязных буферов побольше выставить... вы больше крови тасканиием /home туда-сюда себе и флешке попортит...
кстати ещё вы или не обмолвились или забыли... /var/run, /var/lock и /run(если есть) тоже в tmpfs загнать... а вот насчёт /var/db - это очень спорно...

r0ck3r написал:
squashfs? если я не ошибаюсь она readonly by design и изменение настроек/сохранение данных не станет возможным?

да, но можно сделать финт ушами: смонтировать сквош, на него изменяемую статическую часть и на неё tmpfs... если надо подправить параметры, то убираем tmpfs и правим... ещё хорошо бы сделать скрипт, который будет сливать изменения в образ, но это уже фантазии...

#196756

насчет squashfs вместе с tmpfs немного недопонял, а насчет aufs - она не включена в моем дистрибутиве...думаю как и во многих...соответственно универсальность отпадает....
кстати, насчет /var/run и /var/lock - странно, но ОС работает и без этого....хотя добавить, конечно, необходимо...

#196758
r0ck3r написал:
насчет squashfs вместе с tmpfs немного недопонял, а насчет aufs - она не включена в моем дистрибутиве...думаю как и во многих...соответственно универсальность отпадает....

Кто мешает поставить? Включить все равно надо. Тем более мы говорим об установке на флешку.

#200094

полезная информация как использовать squashfs и aufs

http://optimization.hardlinux.ru/?page_id=997
http://forum.agilialinux.ru/viewtopic.php?pid=8748

так же можно и home и все остальное сжимать в squashfs и подключать в режим для изменений, плюс там пишут как все это дело потом обратно сжимать в модуль squashfs.

кстати вроде UnionFS включена в ядро, поэтому можно как вариант использовать ее вместо aufs. Но вроде пишут что UnionFS чем-то хуже aufs.

Войдите или зарегистрируйтесь, чтобы ответить.