Трюки UNIX
Перенос содержимого каталога /usr на другой накопитель
Вариант ниже рассматривает перенос содержимого каталога /usr на карту miniSDHC в условиях жесточайшей нехватки дискового пространства.
Пропустив эмоции, об аргументах можно почитать здесь:
http://forum.altlinux.org/index.php/topic,33151.msg236597.htmlhttp://forum.altlinux.org/index.php/topic,33146.msg236707.html#msg236707С небольшими изменениями в действиях, вы можете выполнить перенос на любой накопитель работающий в режиме rw - Read/Write, - чтение/запись
В свете сегодняшних новомодных веяний, нижеописанный функционал, о котором рядовой пользователь должен знать, и который придаёт системе невероятную гибкость, типичен для классических UNIX-подобных систем.
В каких случаях может применяться этот трюк?
Первый вариант, это нехватка дискового пространства на SSD-накопителе малой ёмкости, о котором упомянуто по ссылкам выше.
Второй вариант, это старый компьютер с винчестером малой ёмкости. В этом случае вы получаете ещё одно преимущество:
- при IDE-винчестерах расположенных на разных каналах, вы получите не программное, а аппаратное распараллеливание при чтении данных с носителя - своеобразный прирост скорости. Этот прирост вы получите даже при двух каналах и трёх винчестерах, поскольку на перемещение головок тоже затрачивается время при интенсивном чтении/записи данных из разных каталогов, данные в которых могут быть расположены в разных зонах HDD.
Все нижеописанные действия, чтобы привести команды с выбросами в терминал, выполнялись на установленной на винчестер системе с образа:
http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/images/starterkits/altlinux-p7-xfce-20140312-i586.isoс дополнительно установленными пакетами:
# apt-get install thunar-shares-plugin thunar-archive-plugin \
mozilla-plugin-adobe-flash firefox-adblock_plus firefox-flashblock smplayer leafpad bc
Все нижеописанные действия помеченные маркером ***, потенциально опасны для ваших данных! Ошибка может привести к необратимой потере данных. Вы должны понимать какие команды вы выполняете и к каким результатам они приведут.В данном случае, для будущего содержимого каталога /usr, используется кардридер с miniSDHC-картой объёмом
# fdisk -l /dev/sdb|head -n 4
Disk /dev/sdb: 1973 MB, 1973420032 bytes, 3854336 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
*** Уничтожаем содержимое карты
# dd if=/dev/zero of=/dev/sdb bs=1M count=1
1+0 записей получено
1+0 записей отправлено
скопировано 1048576 байт (1,0 MB), 0,617429 c, 1,7 MB/c
Убедитесь, что файловая система карты не смонтирована
# mount|grep sdb1
#
Если это не так, размонтируйте её.
*** Создаём раздел для содержимого будущего /usr
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.22.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4596bb31.
Команда (m для справки):
Команда (m для справки): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Номер раздела (1-4, по умолчанию 1):
Используется значение по умолчанию 1
Первый sector (2048-3854335, по умолчанию 2048):
Используется значение по умолчанию 2048
Last sector, +sectors or +size{K,M,G} (2048-3854335, по умолчанию 3854335):
Используется значение по умолчанию 3854335
Partition 1 of type Linux and of size 1,9 GiB is set
Команда (m для справки): t
Выбранный раздел 1
Шестнадцатеричный код (введите L для получения списка кодов): 83
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.
*** Создаём файловую систему ext4 на этом разделе
# mkfs.ext4 -L CardReader /dev/sdb1
mke2fs 1.42.7 (21-Jan-2013)
Filesystem label=CardReader
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
120480 inodes, 481536 blocks
24076 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=494927872
15 block groups
32768 blocks per group, 32768 fragments per group
8032 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
Файловая система расположенная на разделе карты не смонтирована
# mount|grep sdb1
#
Смонтируем её
# udisksctl mount -b /dev/sdb1
Mounted /dev/sdb1 at /run/media/root/CardReader.
Синхронизируем на карту всё содержимое каталога /usr
# rsync -av /usr/ /run/media/root/CardReader/
...
share/zsh/scripts/
share/zsh/scripts/newuser
src/
src/debug/
sent 1470547800 bytes received 902919 bytes -140532.99 bytes/sec
total size is 1467082087 speedup is 1.00
Аналогичным образом вы можете сделать резервную копию каталога /usr на любом другом носителе.
Теперь для карты
# blkid|grep sdb1
/dev/sdb1: LABEL="CardReader" UUID="1f1f50e5-dbee-4401-bc93-aee79d23f46d" TYPE="ext4"
на которой расположена файловая система, которая должна монтироваться на старте системы
вызовем на редактирование файл /etc/fstab
# mcedit /etc/fstab
и добавим в этот файл строку с параметрами монтирования
# cat /etc/fstab | grep usr
UUID=1f1f50e5-dbee-4401-bc93-aee79d23f46d /usr ext4 relatime 1 2
Здесь указан UUID устройства, но вы можете использовать и абсолютное имя устройства - например /dev/sdb1 как в используемом примере. Соответствие UUID и имени устройства, выше показала команда blkid.
Выполнив всю необходимую подготовку, закройте все приложения кроме терминала и подайте команду для перехода в 'runlevel 1' - singleuser mode, - однопользовательский режим
# init 1
Это необходимо для того, чтобы свести количество процессов запущенных в системе к минимуму.
*** Введя пароль root в приглашении и получив доступ к терминалу, выполните команду, которая уничтожит всё содержимое каталога /usr расположенного на HDD на котором установлена система, освободив дисковое пространство, каталог /usr которой переносится на другой носитель
# rm -rf /usr/*
Подайте команду для перезагрузки системы (кардридер с картой на которой находится содержимое /usr должна быть вставлена в usb-порт)
# reboot
После загрузки системы, можно убедиться, что файловая система на разделе карты, с содержимым каталога /usr, смонтирована
$ mount|grep -E 'sdb1|on / '
/dev/sda2 on / type ext4 (rw,relatime,data=ordered)
/dev/sdb1 on /usr type ext4 (rw,relatime,data=ordered)
И убедиться, что для этой цели действительно использовался кардридер с картой
$ ll /dev/disk/by-id/ | grep sd[ab]1
lrwxrwxrwx 1 root root 10 сен 10 23:26 ata-SAMSUNG_HM160HC_S1QAJD0Q900848-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 сен 10 23:26 wwn-0x50f0000001900848-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 сен 10 23:26 usb-Multiple_Card_Reader_058F63666433-0:0-part1 -> ../../sdb1
В реальности, объём содержимого каталога /usr может быть в 2-3 раза больше.
Истинный объём может варьироваться в довольно широких пределах, которые зависят от ваших предпочтений и количества установленных пакетов.
Приведённый объём занятого пространства справедлив для условий описанных выше
$ df -m /dev/sdb1
Файловая система 1M-blocks Использовано Доступно Использовано% Cмонтировано в
/dev/sdb1 1820 1539 172 90% /usr
Возврат содержимого /usr с другого накопителя в /usr на накопитель с корневой fsВ дефолтной ситуации в системе с systemd это невозможно из-за невозможности размонтировать /usr
Подробности с эмоциями здесь:
http://forum.altlinux.org/index.php/topic,33146.msg236806.html#msg236806Для этой цели вы должны использовать live-системы rescue/live-cd или другую установленную на hdd Linux-систему.
В заключение остаётся добавить, что все выбросы в терминал от первого до последнего, сделаны на реальной системе и все действия выполнялись вживую.