xandroskin blog | it or not it. Openwrt на флешку


OpenWRT — Подключение USB-флешки или USB-диска

Подготовка прошивки OpenWRT к подключению USB-диска

Поддержка USB прошивкой OpenWRT

Для поддержки USB-накопителей Вам необходимо либо собрать прошивку с включением следующих пакетов
  • kmod-usb-core
  • kmod-usb-ohci
  • kmod-usb-storage
  • kmod-usb2
либо доустановить их отдельно. Установка производится через веб-интерфейс на странице Система-Программное обеспечение, либо классическим способом через терминал (telnet/SSH):

opkg update

opkg install kmod-usb-core

opkg install kmod-usb-ohci

opkg install kmod-usb-storage

opkg install kmod-usb2

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

Поддержка файловых систем прошивкой OpenWRT

OpenWRT, в отличии от своего собрата DD-WRT в теории поддерживает все возможные файловые системы. Для этого служат пакеты, например:
  • kmod-fs-ext4 — поддержка файловых систем ext2, ext3 и ext4
  • kmod-fs-vfat — поддержка файловой системы fat32
и еще парочка других, но менее востребованных. Тут всё так же — либо через веб-интерфейс LuCI, либо через терминал, либо намертво запихать в ядро. Не буду углубляться — разберетесь на примере предыдущего пункта. всё так же.

Подготовка USB-флешки/диска

Если вы планируете использовать флешку как хранилище для файлов, то, в принципе, Вам подойдет любая файловая система. Однако будьте осторожны, в файловой системе Fat32 ограничение по максимальному размеру файла составляет около 4гб. Этого не всегда достаточно. У остальных перечисленных файловых систем это ограничение на несколько порядков выше, что уже не создаст проблем. Если Вы планируете использовать накопитель как место для установки дополнительных пакетов (samba, например), то вы должны ограничиться списком ext2, ext3, ext4. На остальные системы программы просто не установятся. Как разметить? Основываясь на личном опыте предлагаю Вам следующую схему. Наиболее оптимальный вариант: Раздел 1 / тип swap / размер 128 мб — раздел подкачки. Раздел 2 / тип ext4 / размер 1 гб — раздел для установки пакетов. Раздел 3 / тип ext4 / размер — вся оставшаяся область на диске — раздел для прочих файлов.

Разметка USB-флешки/диска в Linux

В OpenWRT есть проблема с монтированием дисков в некоторых случаях, когда они размечены не от имени пользователя root, по-этому используем sudo с флагом -i Подключаем флешку/диск к компьютеру и приступаем к разметке и форматированию. У меня флешка подключилась как /dev/sdf Запустившись fdisk просит Вас ввести команду. Последовательность команд примерно следующая.
  1. o — создаем новую таблицу разделов, удалив всё что было
  2. n — создаем первый раздел. тип primary — p, номер раздела — по умолчанию, первый сектор — по умолчанию, последний сектор смещен на 128мб — +128M
  3. n — создаем второй раздел. тип primary — p, номер раздела — по умолчанию, первый сектор — по умолчанию, последний сектор смещен на 1Гб — +1G
  4. n — создаем третий раздел. тип primary — p, номер раздела — по умолчанию, первый сектор — по умолчанию, последний сектор — по умолчанию
  5. w — сохраняем изменения

Создание файловых систем на USB-флешке/диске

Сначала завершим создание раздела подкачки: Теперь создадим файловые системы ext4 на втором и третьем разделе на флешке:

sudo -i mkfs.ext2 /dev/sdf2

sudo -i mkfs.ext4 /dev/sdf3

Ждем завершение процедуры форматирования и подключаем USB-носитель к роутеру.

Подготовка OpenWRT к работе с USB-носителями

Для монтирования USB-флешек и USB-жестких дисков в OpenWRT необходимо выполнить три условия
  1. Поддержка USB устройств ядром
  2. Поддержка файловых систем ядром
  3. Установлен пакет block-mount
О первых двух пунктах было сказано в начале статьи. По поводу третьего — всё просто:

opkg update

opkg install block-mount

Монтирование USB-флешек/дисков в OpenWRT

Монтировать можно через WEB-интерфейс LuCI, однако это скучно, неинтересно и, на данный момент, не дает всех возможностей. Дело в том, что с недавнего момента логика монтирования в overlay поменялась, а LuCI до сих пор поддерживает старый стандарт. Я Вам поведаю о монтирование через терминал. Итак, подключаемся к устройству через SSH или Telnet и приступаем.

Настройка fstab в OpenWRT

Настройки fstab в OpenWRT хранятся в файле /etc/config/fstab и, в отличии от десктопного Linux, придерживаются стандарта uci. Однако сложного в них ничего нет. Чтобы не создавать файл с нуля — воспользуемся утилитой block detect

block detect >> /etc/config/fstab

Посмотрим, что у нас создалось по умолчанию:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

config 'global'

        option  anon_swap       '0'

        option  anon_mount      '0'

        option  auto_swap       '1'

        option  auto_mount      '1'

        option  delay_root      '5'

        option  check_fs        '0'

config 'swap'

        option  device  '/dev/sda1'

        option  enabled '0'

config 'mount'

        option  target  '/mnt/sda2'

        option  uuid    '25f9a5d2-8743-4fe0-b91c-c1088887b637'

        option  enabled '0'

config 'mount'

        option  target  '/mnt/sda3'

        option  uuid    '7725b029-51ea-44e6-898f-2987e9b9bbd8'

        option  enabled '0'

Для начала включим автомонтирование swap-раздела на USB-HDD/USB-флешке. Для этого в блоке global присвоим опции auto_swap значение 1. А так же в блоке swap опции enabled значение 1.

1

2

3

4

5

6

config 'global'

        option  auto_swap       '1'

config 'swap'

        option  device  '/dev/sda1'

        option  enabled '1'

Далее настроим монтирование остальных разделов. Второй раздел — в точку монтирования /overlay, для расширения памяти устройства для установки пакетов и прочих манипуляций. Третий раздел — в точку монтирования /mnt/usb (вместо usb может быть что угодно, называйте как хотите), для хранения ваших файлов. Для этого в файл fstab вносим следующие правки

1

2

3

4

5

6

7

8

9

10

11

12

13

config 'global'

        option  auto_mount      '1'

        option  delay_root      '5'

config 'mount'

        option  target  '/overlay'

        option  uuid    '25f9a5d2-8743-4fe0-b91c-c1088887b637'

        option  enabled '1'

config 'mount'

        option  target  '/mnt/usb'

        option  uuid    '7725b029-51ea-44e6-898f-2987e9b9bbd8'

        option  enabled '1'

Сохраняем файл, но пока перезагружаться рано. Надо подготовить overlay-раздел на флешке.

Подготовка overlay-раздела на USB-диске

Итак, мы будем использовать второй раздел на нашем USB-диске/флешке. Для этого монтируем раздел во временный каталог

mkdir /mnt/sda2

mount /dev/sda2 /mnt/sda2

Переносим содержимое каталога /overlay на подготавливаемый раздел

tar -C /overlay -cvf - . | tar -C /mnt/sda2 -xf -

И теперь можем смело перезагружаться.

Проверка результатов работы fstab

Если вы настроили всё верно, то команда df -h должна выдать примерно следующие результаты

df -h

Filesystem                Size      Used Available Use% Mounted on

rootfs                  975.9M      1.4M    907.3M   0% /

/dev/root                 5.5M      5.5M         0 100% /rom

tmpfs                    14.4M    244.0K     14.2M   2% /tmp

/dev/sda2               975.9M      1.4M    907.3M   0% /overlay

overlayfs:/overlay      975.9M      1.4M    907.3M   0% /

tmpfs                   512.0K         0    512.0K   0% /dev

/dev/sda3                 6.2G     14.4M      5.8G   0% /mnt/usb

openwrtblog.blogspot.com

Расширяем дисковую память Chaos Calmer 15.05.1 OpenWRT на USB флешку

После установки скомпилированной разработчиками OpenWRT прошивки Chaos Calmer 15.05.1 на ваш роутер с 4мб дисковой памяти вы обнаружите, что у вас осталось всего навсего 300кб для прочих нужд. Для решения одной задачи этого может и хватит, как например, для организации принт-сервера посредством OpenWRT, но никак не более. Поэтому логично первым делом заняться увеличением дискового пространства для маневров. И все это без компиляции собственной прошивки и прочих танцев с бубном. Когда нужно решать задачу быстро из того что имеем.

Имея доступ в интернет с нашего роутера, авторизуемся на нем через SHH соединение при помощи программы PuTTY и последовательно начнем:

Сначала обновляем список пакетов

opkg update

Далее устанавливаем поддержку USB устройств на нашем роутере

opkg install kmod-usb-storage

Далее нам нужна флешка, где вы заранее cоздали бы хотя бы 2 раздела, основной (пока не важно какой файловой системы) и так называемый раздел подкачки (стандартный linux swap). На моей 16Gb флешке я создал 3 раздела: первый на 1gb без файловой системы для расширения встроенной памяти устройства - собственно под overlay, второй самый большой раздел на 13gb тоже пока без файловой системы буду монтировать как отдельный том, и третий раздел на сотню с лишним мегабайт как файл подкачки linux. Разбить флешку на разделы через fdisk роутера не получится - не хватит памяти для установки нужных пакетов пока, поэтому сделать это придется на другой Linux машине или из под Windows, например, при помощи программы Minitool Partition Wizard. 

После чего готовую к форматированию вставляем в usb разъем и вводим команду:

dmesg | grep sd

[ 2598.210000] usb 1-1.4: new high-speed USB device number 4 using ehci-platform[ 2598.330000] usb-storage 1-1.4:1.0: USB Mass Storage device detected [ 2598.340000] scsi host1: usb-storage 1-1.4:1.0 [ 2599.340000] scsi 1:0:0:0: Direct-Access SanDisk Ultra Fit 1.00 PQ: 0 ANSI: 6[ 2599.350000] sd 1:0:0:0: [sda] 30031250 512-byte logical blocks: (15.3 GB/14.3 GiB)[ 2599.350000] sd 1:0:0:0: [sda] Write Protect is off [ 2599.360000] sd 1:0:0:0: [sda] Mode Sense: 43 00 00 00[ 2599.360000] sd 1:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 2599.380000] sda: sda1 sda2 sda3 [ 2599.390000] sd 1:0:0:0: [sda] Attached SCSI removable disk

Флешка у меня определилась как sda1, sda2 и sda3. Все верно, 3 раздела. 

Ну есть одно НО, которое я еще решил стандартными средствами OpenWRT. Мы не можем создать разделы и отформатировать флешку в файловой системе f2fs при помощи утилит f2fs-tool –  mkfs.f2fs потому , что в прошивке не рабочая версия 1.4.0 данной программы. Некий бонус от сборщика прошивки так сказать. Поэтому создать разделы, отформатировать ее придется на другой Linux машине или приложении Windows.  

Далее устанавливаем собранный мной пакет f2fs-tools версии 1.4.1 для ветки 15.05.1, который поможет нам отформатировать флешку прямо с нашего роутера, вдруг даже виртуальной Linux машины нет под рукой. Cначала ставим утилиту форматирования в файловой системе F2FS:

opkg install http://openwrt.su/download/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/f2fs-tools_1.4.1-1_ar71xx.ipk

Затем обновленную библиотеку поддержки файловой системы F2FS. 

opkg install http://openwrt.su/download/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/libf2fs_1.4.1-1_ar71xx.ipk

Далее форматируем первый раздел нашей флешки в F2FS. 

mkfs.f2fs -l overlay /dev/sda1 

F2FS-tools: mkfs.f2fs Ver: 1.4.1 (2015-03-04)Info: Label = overlayInfo: sector size = 512Info: total sectors = 2045952 (in 512 bytes)Info: zone aligned segment0 blkaddr: 256Info: format version with"Linux version 3.18.23 ([email protected]) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r47269) ) #1 Sun Jan 31 18:39:35 CET 2016"Info: Discarding deviceInfo: This device doesn't support TRIMInfo: format successful

И в моем случае еще и второй раздел

mkfs.f2fs -l data /dev/sda2

F2FS-tools: mkfs.f2fs Ver: 1.4.1 (2015-03-04)Info: Label = dataInfo: sector size = 512Info: total sectors = 27645952 (in 512 bytes)Info: zone aligned segment0 blkaddr: 256Info: format version with"Linux version 3.18.23 ([email protected]) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r47269) ) #1 Sun Jan 31 18:39:35 CET 2016"Info: Discarding deviceInfo: This device doesn't support TRIMInfo: format successful

Далее удаляем не нужные нам теперь libf2fs f2fs-tools

opkg remove f2fs-tools libf2fs

Устанавливаем поддержку файловой системы F2FS ядра. Не то, чтобы я ее ярый фанат, но она единственная - установочный модуль которой весит всего ничего и не тянет за собой кучу зависимостей. И разработана была специально для флеш носителей информации. 

opkg install kmod-fs-f2fs

Уже можем проверить как она монтируемся

mount /dev/sda1 /mnt

df

Filesystem 1K-blocks Used Available Use% Mounted onrootfs 512 408 104 80% //dev/root 2304 2304 0 100% /romtmpfs 14288 640 13648 4% /tmp/dev/mtdblock3 512 408 104 80% /overlayoverlayfs:/overlay 512 408 104 80% /tmpfs 512 0 512 0% /dev/dev/sda1 1021952 143368 860152 14% /mnt

После того, как флешка смонтировалась, копируем на нее исходные данные для его последующего монтирования как доп память:

tar -C /overlay -cvf - . | tar -C /mnt -xf -

дабы не записалось ничего лишнего отмонтируемся

umount /mnt

Далее нам нужно установить пакет block-mount, который занимается монтированием дисков туда, куда ему укажут на этапе загрузки устройства. Но и тут подкралась вторая засада – пакет block-mount который предлагает репозитарий OpenWrt для ветки Chaos Calmer 15.05.1 – не поддерживает указание дисков в файловой системе f2fs как overlay устройств. Просто забыли прописать в данном пакете ее поддержку. Поэтому придется поставить усовершенствованную версию пакета block-mount, предоставленную мной, которая кстати сгодится для всех у кого ветка Chaos Calmer 15.05.1 и устройство на архитектуре ar71xx.

opkg install http://openwrt.su/download/chaos_calmer/15.05.1/ar71xx/generic/packages/base/block-mount_2016-01-10_ar71xx.ipk --force-checksum

block detect > /etc/config/fstab

У меня после команды block detect файл fstab выглядит так

config 'global'option anon_swap '0'option anon_mount '0'option auto_swap '1'option auto_mount '1'option delay_root '5'option check_fs '0'config 'mount'option target '/mnt/sda1'option uuid '4b41630a-8eb9-4380-84a9-fcc2e4295865'option enabled '0config 'mount'option target '/mnt/sda2'option uuid 'ade80f58-3666-4968-99bf-af1c02602771'option enabled '0'config 'swap'option device '/dev/sda3'option enabled '0

Открываем файл fstab в текстовом редакторе vi

vi /etc/config/fstab

Жмем букву i переходим в режим редактирования и приводим его к виду

config 'global'option anon_swap '0'option anon_mount '0'option auto_swap '1'option auto_mount '1'option delay_root '5'option check_fs '0'config 'mount'option target '/overlay'option uuid '4b41630a-8eb9-4380-84a9-fcc2e4295865'option enabled '1'config 'mount'option target '/mnt/sda2'option uuid 'ade80f58-3666-4968-99bf-af1c02602771'option enabled '1'config 'swap'option device '/dev/sda3'option enabled '1'

То есть мы включили монтирование разделов на этапе загрузки системы, а также подмену внутренней памяти ( /overlay) на 1 раздел на флеш накопителе по его уникальному uuid номеру. Дальше жмем ESC, вводим символы

:wq

Что в Vi означают выйти записав изменения и жмем enter. Файл fstab перезаписался. Перезагружаем конфиги fstab: 

/etc/init.d/fstab reload

/etc/init.d/fstab enable

Наконец-то перегружаем наш роутер

reboot

После перезагрузки смотрим команду

df

и если все прошло как надо вы увидите что-то наподобие

Filesystem 1K-blocks Used Available Use% Mounted onrootfs 1021952 144408 859112 14% //dev/root 2304 2304 0 100% /romtmpfs 14288 76 14212 1% /tmp/dev/sda1 1021952 144408 859112 14% /overlayoverlayfs:/overlay 1021952 144408 859112 14% /tmpfs 512 0 512 0% /dev

Где вы видим, что раздел /dev/sda1 теперь и есть наша дисковая память. То же самое можно проверить зайдя в Luci на вкладку Software и увидеть, что для дальнейших извращений мы теперь готовы:

Таким образом мы расширили дисковую память нашего 4 мб OpenWRT роутера без каких-либо компиляций собственной прошивки и без внешней Linux машины под рукой. 

Добавить комментарий

openwrt.su

Перенос корневой системы OpenWRT на флешку

Не секрет, что основной проблемой при пользовании OpenWRT является недостаток свободной памяти на роутере под программы, с которыми приходится работать. При превращении роутера в медиакомбайн первым шагом является подключение внешнего накопителя для системных и пользовательских файлов.Предположим, что произодитель был щедрым китайцем и порт USB распаян на плате (в противном случае начать следует с поисков следов наличия возможности сделать это собственноручно). Первым делом необходима поддержка USB ядром. Так как мы далеко в 21 веке, контроллер непременно USB2.0 (EHCI).

opkg update opkg install kmod-usb-core kmod-scsi-core kmod-usb2

Тут следует учесть что у нас будет не принтер или другое периферийное устройство, а накопитель. Поэтому добавим поддержку USB Mass Storage.

opkg install kmod-usb-storage

Теперь научим систему монтировать наши флешки/винчестеры и подхватывать их на лету, этот пакет необходим для работы fstab. Заодно добавим поддержку той файловой системы, которой будем пользоваться на накопителе.

opkg install block-mount kmod-fs-ext4

Включаем невключившиеся автоматически модули

insmod usbcore insmod ehci-hcd

В качестве дополнительного софта можно установить пакет usbutils, который позволит работать с lsusb и добавит прочий вспомогательный функционал. Также можно доставить e2fsprogs, позволяющий размечать накопители непосредственно из OpenWRT. Еще один полезный инструмент — blkid, показывающий список доступных блочных устройств в системе.

opkg install usbutils e2fsprogs blkid

Готовим накопитель на компьютере или прямо в консоли OpenWRT (кому как больше по душе, я предпочитаю GUI-шный Gparted).

# blkid|grep sda /dev/sda1: LABEL="system" UUID="5359cf76-00e2-4b82-bf0f-c51d6aca3713" TYPE="ext4" PARTUUID="0004a716-01" /dev/sda2: LABEL="swap" TYPE="swap" PARTUUID="0004a716-02" /dev/sda3: LABEL="data" UUID="bb922040-2b0c-47e4-a108-81de197b2424" TYPE="ext4" PARTUUID="0004a716-03"

Как видно из названий, первый выделен под системные файлы, второй — раздел подкачки и третий для всего остального.

Переносим все файлы на внешний накопитель

mkdir /mnt/sda1 mount /dev/sda1 /mnt/sda1 mkdir -p /tmp/cproot mount --bind / /tmp/cproot tar -C /tmp/cproot -cvf - . | tar -C /mnt/sda1 -x umount /tmp/cproot

Подключаем раздел для swap

mkswap /dev/sda2 swapon /dev/sda2

Создаем точку монтирования (например, /data) для третьего раздела и вносим изменения в /etc/config/fstab

config 'global' option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config swap option label 'swap' config mount option target / option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0 config mount option target /data option device /dev/sda3 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0

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

# df -h Filesystem Size Used Available Use% Mounted on rootfs 975.9M 35.8M 872.9M 4% / /dev/root 2.3M 2.3M 0 100% /rom tmpfs 29.9M 1.8M 28.1M 6% /tmp /dev/sda1 975.9M 35.8M 872.9M 4% / tmpfs 512.0K 0 512.0K 0% /dev /dev/sda3 291.8G 184.7G 92.2G 67% /data

Ссылки:

blog.xsk.in

Подключаем usb flash диск к роутеру с OpenWrt

usbВ роутерах обычно небольшой объем памяти и при установке дополнительного софта она быстро заканчивается. Но если подключить к usb разъему флэшку то тогда количество дополнительных программ будет ограничено только объемом usb накопителя.

Подключаем usb flash диск к роутеру с OpenWrt

Для того чтобы добавить поддержку usb-flash устанавливаем дополнительные модули

opkg update opkg install kmod-usb-storage kmod-fs-ext4 block-mount

Подготавливаем usb-flash, на роутере нет ни необходимых утилит ни места чтобы их установить  поэтому подключаем флэшку к компьютеру с linux.

Здесь и далее в качестве символьного имени диска я использую sdX. При выполнении команды надо подставить реальное имя диска.  Чтобы его узнать можно посмотреть вывод dmesg после подключения usb-flash.

Пример вывода команды dmesg:

[89065.876377] usb 5-1.2: new high-speed USB device number 11 using ehci_hcd [89065.970696] usb 5-1.2: New USB device found, idVendor=058f, idProduct=6387 [89065.970700] usb 5-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [89065.970703] usb 5-1.2: Product: Mass Storage Device [89065.970705] usb 5-1.2: Manufacturer: JetFlash [89065.970707] usb 5-1.2: SerialNumber: FYZ178A2 [89065.971283] scsi18 : usb-storage 5-1.2:1.0 [89066.968029] scsi 18:0:0:0: Direct-Access JetFlash Transcend 4GB 8.07 PQ: 0 ANSI: 2 [89066.969187] sd 18:0:0:0: Attached scsi generic sg1 type 0 [89066.970456] sd 18:0:0:0: [sdc] 7843840 512-byte logical blocks: (4.01 GB/3.74 GiB) [89066.971013] sd 18:0:0:0: [sdc] Write Protect is off [89066.971014] sd 18:0:0:0: [sdc] Mode Sense: 03 00 00 00 [89066.971602] sd 18:0:0:0: [sdc] No Caching mode page found

В этом пример диск определился как sdc.ВНИМАНИЕ!!! если указать имя неправильно, то можно потерять данные на жестком диске.

Отчищаем карту ( стираем таблицу разделов и т.д.)

dd if=/dev/zero of=/dev/sdX bs=512 count=100

Затем создаем первый раздел для файловой системы:

echo -e "n\np\n1\n\n\na\n1\nw" | fdisk /dev/sdX

Форматируем его в ext4

mkfs.ext4 -L rootfs /dev/sdX1

Теперь подключаем флэшку к роутеру.

Переносим систему на usb флеш накопитель. С этой целью монтируем  диск и копируем на него все необходимое:

Монтируем первый раздел в /mnt/sda1

mkdir /mnt/sda1 mount /dev/sda1 /mnt/sda1

Монтируем корневую файловую систему в /tmp/root

mkdir /tmp/root mount --bind / /tmp/root

Копируем все файлы

tar -C /tmp/root -cvf - . | tar -C /mnt/sda1 -xvf - sync

Далее создаем конфигурационный файл /etc/сonfig/fstab

block detect > /etc/config/fstab

После чего приводим его к следующему виду (uuid менять не надо)

config 'global' option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config 'mount' option target '/' option uuid '5807e2fb-05ae-4d94-b906-0330a84f2811' option enabled '1'

Презагружаемся и проверяем все ли у нас получилось командой df -h

Filesystem Size Used Available Use% Mounted on rootfs 3.5G 16.5M 3.3G 0% / /dev/root 2.3M 2.3M 0 100% /rom tmpfs 14.1M 56.0K 14.0M 0% /tmp /dev/sda1 3.5G 16.5M 3.3G 0% / tmpfs 512.0K 0 512.0K 0% /dev

Здесь видно что /dev/sda1 подмонтирован как корневой раздел «/» и используется как rootfs.

mainloop.ru