LINUX.ORG.RU

Монтирование образа без разделов? Как добавить разделы?

 , , ,


0

2

Есть одноплатник luckfox pico pro max. Для него есит SDK, который собирает linux. В дальнейшем можно собрать образ для sd-карты, отдельный скриптом. Я поковырял скрипт, он делает следующее:

dd if=env.img of=disk.img bs=1k seek=0
dd if=idblock.img of=disk.img bs=1k seek=32
dd if=uboot.img of=disk.img bs=1k seek=544
dd if=boot.img of=disk.img bs=1k seek=800
dd if=oem.img of=disk.img bs=1k seek=33568
dd if=userdata.img of=disk.img bs=1k seek=557856
dd if=rootfs.img of=disk.img bs=1k seek=820000

А затем можно disk.img залить на sd-карту:

dd if=disk.img of=/dev/sdX bs=1M

И оно будет работать.

Как в образ disk.img добавить таблицу разделов?

Как в образ disk.img добавить таблицу разделов?

чтобы что? :)

ну, измени убут, чтобы он енв хранил в файле - можно будет перенести на раздел. остальное-то зачем в разделах?

aol ★★★★★
()
Ответ на: комментарий от aol

чтобы что? :)

Вставить sd-карту в компьютер и спокойно смонтировать раздел, {за,вы}грузить файлы.

чтобы он енв хранил в файле - можно будет перенести на раздел

Не понимаю. Куда env?

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

Не понимаю. Куда env?

куда угодно. опций море - в корень, на отдельный фат-раздел… остальные в убуте смотри…

aol ★★★★★
()

никак :) данная прошивка не работает с таблицей разделов. местоположение разделов захардкорено в прошивку (??)

pfg ★★★★★
()

Можно конечно извратиться, взять старенькую MSDOS таблицу разделов и разместить в ней разделы так, чтобы их и девайс понимал без изменений (при условии что в env.img не используются первые 512 байт, в чем я глубоко сомневаюсь), и в комп вставить можно было.

Другой вариант – переконфигурить u-boot чтобы env он брал из другого места, там в этом плане полная свобода действий. Заодно можно и в u-boot включить опцию на парсинг таблицы разделов и отвязаться от хардкода.

a1ba ★★★★
()
Последнее исправление: a1ba (всего исправлений: 1)
Ответ на: комментарий от a1ba

переконфигурить u-boot

Это приемлемый вариант.

Подскажете в каком направлении двигаться? Я предполагаю, что надо поковырять config файл uboot и, наверное, изменить bootargs в device-tree, но могу ошибаться.

Jullyfish ★★
() автор топика

Как-то странно всё это в скрипте сделано. Но вообще для разметки разделов на файле образа можно использовать утилиты losetup и затем fdisk (или любое другое, что в принципе может размечать).

apt_install_lrzsz ★★★★
()
Ответ на: комментарий от apt_install_lrzsz

Как-то странно всё это в скрипте сделано.

Это не первый SDK связанный с rockchip, который я ковыряю. Там много странного (скорее даже «сомнительного»). ИМХО, конкретно в данном случае вполне неплохо сделано, ибо в этом возможно разобраться.

Jullyfish ★★
() автор топика
Ответ на: комментарий от cobold

Сделай скрипт для монтирования да залей на свой гитхаб. Вроде же очевидное решение

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

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

Выглядит очень непривычно, я скорее к этому.

А там прям точно-точно нет разметки разделов? Странно, что скрипт вроде как готовит образ ПЗУ, но не делает разметку.

apt_install_lrzsz ★★★★
()
dd if=env.img of=disk.img bs=1k seek=0

Избавиться от этого пересобрав U-Boot для хранения переменных в нормальном месте.

Тогда можно GPT использовать для разметки.

dd if=idblock.img of=disk.img bs=1k seek=32

Стартовая позиция для загрузчика в камне.

Можно зафиксировать как раздел или резервная область в GPT.

Вместо разбиения на несколько кусков, можно объединить в один результирующий файл U-Boot.

Пример разметки нормального человека: https://github.com/buildroot/buildroot/blob/master/board/radxa/rock5b/genimage.cfg

AlexVR ★★★★★
()
Ответ на: комментарий от andytux

Таблица разделов это не твоя прихоть. Её должно устройство понимать.

Устройству пофигу.

У него есть стартовая точка (в данном случае по смещению 32К) с которой оно считывает загрузчик (или информацию о нём).

Во всех хоть сколько-то актуальных микропроцессорах эта точка за пределами заголовка GPT.

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

GPT должен понимать U-Boot и Ядро Linux (что они и умеют).

MBR - нафиг не нужен.

В текущей ситуации - вообще идиотизм.

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

AlexVR ★★★★★
()
Ответ на: комментарий от a1ba

Увы.

00000000: 7dd9 f1c5 626c 6b64 6576 7061 7274 733d  }...blkdevparts=
00000010: 6d6d 6362 6c6b 313a 3332 4b28 656e 7629  mmcblk1:32K(env)
00000020: 2c35 3132 4b40 3332 4b28 6964 626c 6f63  ,512K@32K(idbloc
00000030: 6b29 2c32 3536 4b28 7562 6f6f 7429 2c33  k),256K(uboot),3
00000040: 324d 2862 6f6f 7429 2c35 3132 4d28 6f65  2M(boot),512M(oe
00000050: 6d29 2c32 3536 4d28 7573 6572 6461 7461  m),256M(userdata
00000060: 292c 3647 2872 6f6f 7466 7329 0073 7973  ),6G(rootfs).sys
00000070: 5f62 6f6f 7461 7267 733d 2072 6f6f 743d  _bootargs= root=
00000080: 2f64 6576 2f6d 6d63 626c 6b31 7037 2072  /dev/mmcblk1p7 r
00000090: 6f6f 7466 7374 7970 653d 6578 7434 2072  ootfstype=ext4 r
000000a0: 6b5f 646d 615f 6865 6170 5f63 6d61 3d36  k_dma_heap_cma=6
000000b0: 364d 0073 645f 7061 7274 733d 6d6d 6362  6M.sd_parts=mmcb
000000c0: 6c6b 303a 3136 4b40 3531 3228 656e 7629  lk0:16K@512(env)
000000d0: 2c35 3132 4b40 3332 4b28 6964 626c 6f63  ,512K@32K(idbloc
000000e0: 6b29 2c34 4d28 7562 6f6f 7429 0000 0000  k),4M(uboot)....

А далее уже нули.

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

Измени настройки U-Boot. Это переменные для него. Размести их за пределами. Должно быть что-то вроде:

+------------------+
| GPT table        |
+------------------+ 32K
| idblock + u-boot |
+------------------+
| U-Boot env       |
+------------------+
| rootfs           |
+------------------+
| GPT table        |
+------------------+
AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Избавиться от этого пересобрав U-Boot для хранения переменных в нормальном месте.

Благодарю, попробую.

Стартовая позиция для загрузчика в камне.

Благодарю, буду знать.

Можно зафиксировать как раздел или резервная область в GPT.

Не умею в GPT. :^)

По крайней мере пока…

Jullyfish ★★
() автор топика
Ответ на: комментарий от AlexVR

MBR - нафиг не нужен.

В текущей ситуации - вообще идиотизм.

Тут поясните, пожалуйста.

Я бы, может, этот env сдвинул бы на 1К и в начале MBR добавить (хотя бы в качестве факультатива).

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

MBR - прошлый век. Что ещё тут пояснять.

GPT спокойно даст

  • два корня для A/B обновления.
  • оверлей на /etc
  • отдельные /home, /var, /data
  • swap
  • recovery раздел
  • и т.д. что только в голову придёт.
AlexVR ★★★★★
()
Ответ на: комментарий от Jullyfish

чтобы что? :)

Вставить sd-карту в компьютер и спокойно смонтировать раздел, {за,вы}грузить файлы.

А потом вставить обратно и… оно не работает. Просто потому, что устройство не умеет работать с таблицей разделов, разделами и файлами.

mord0d ★★★★★
()

А затем можно disk.img залить на sd-карту:

dd if=disk.img of=/dev/sdX bs=1M

Для этих целей давно уже есть bmaptool. Он и меньше запишет и sync вызовет.

Ну и вишенка:

sudo eject /dev/sdX
AlexVR ★★★★★
()

luckfox pico pro max

Что-то завалялась эта платка у меня. Пора вечерами начать делать человеческий br2 external для неё.

@Jullyfish вопрос: ты хочешь мучить NPU или просто плату?

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

вопрос: ты хочешь мучить NPU или просто плату?

Просто плату.

Хотя, на текущем этапе мы с камерами играемся, я к ней подключался, там из коробки (если из SDK собрать) есть какой-то (мега кривой) face recognition.

Jullyfish ★★
() автор топика
Ответ на: комментарий от AlexVR

З.Ы.: Ох уж эти китайские недо-sdk

Конкретно в этом SDK с помощью build.sh нельзя зайти в menuconfig uboot’а.

Jullyfish ★★
() автор топика
Ответ на: комментарий от AlexVR
DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
> ENVF: Primary 0x00000000 - 0x00008000
> ENVF: OK
Trying fit image at 0x440 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(7a82b051e5...) + sha256(db333376af...) + OK
## Checking fdt 0x00261170 ... sha256(9f596c5683...) + OK
Total: 243.154 ms

Похоже нашёл где задаётся расположение env. Это CONFIG_ENV_OFFSET и CONFIG_ENV_SIZE. Сейчас буду пробовать.

Jullyfish ★★
() автор топика
Ответ на: комментарий от AlexVR

Я залил env.img в другую часть:

dd if=env.img of=disk.img bs=1k seek=$(( 800-32 ))

В конфиг u-boot добавил CONFIG_ENV_OFFSET=0xC0000.

Увы:

DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
> Trying to boot from MMC2
> ENVF: !bad CRC @ 0x0 
> ENVF: !bad CRC @ 0x0 
> spl: partition error 
Trying to boot from MTD1
ENVF: Primary 0x00000000 - 0x00040000
ENVF: OK
Trying fit image at 0x400 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(8f1e014ce2...) + sha256(5352c83233...) + OK
## Checking fdt 0x0025bed0 ... sha256(51bba657c3...) + OK
Total: 258.582 ms

Jumping to U-Boot(0x00200000)
Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

В этом env описаны размеры разделов, их тоже надо править/смещать.

Насколько я помню в GPT начало как раз и не используется, обычно там нули. Первые 512 байт точно не используется GPT. Там может быть MBR. Если будет что-то другое то может будет работать, а может не распознает.

Предлагаю сделать пустой файл размера диска, разбить через gparted и потом скопировать только GPT в образ или на карту, не трогая env в начале. У GPT еще в самом конце диска есть копия и некоторым программам не понравится её отсутствие, но при монтировании gparted предложит это исправить.

P.S.: Совсем недавно Luckfox Pico Mini брал у знакомого посмотреть, отсутствие таблицы разделов лично меня не напрягает.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 2)
Ответ на: комментарий от jpegqs

В этом env описаны размеры разделов, их тоже надо править/смещать.

Поэтому я и запихал между uboot и boot, а остальное не двигал, чтобы как раз не править параметры.

Выглядят они так:

blkdevparts=mmcblk1:32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs) rootfstype=ext4

Хотя 32K(env) смущает, но вроде как хотя бы до загрузки kernel должно дойти. (Хотя я могу ошибаться).

Jullyfish ★★
() автор топика
Ответ на: комментарий от jpegqs

Может таки вообще ничего не двигать?

Может быть.

В GPT эта ситуация заранее предусмотрена, что в начале что-то будет.

В принципе, да, размер env меньше 256 байт. Так что можно уменьшить размер env до 1 сегмента, а всё остальное отдать под GPT.

На словах красиво, но как это сделать я не понимаю. :^)

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

На словах красиво, но как это сделать я не понимаю. :^)

Записать образ на карту, открыть в gparted или другом - создать GPT, добавить там разделы, не форматировать - посмотреть что будет. Если env в начале удалит, то вернуть через dd.

И размер env не трогать нигде, может и так будет работать с GPT в конце.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от Jullyfish

Попытался собрать этот SDK по инструкции… Свалился на depricated функциях при сборке host-утилит…

З.Ы.: пока сохраню сюда:

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Попытался собрать этот SDK по инструкции… Свалился на depricated функциях при сборке host-утилит…

А вы под какой системой собираете? Это не первый Rockchip SDK, с которым имею дело. Там обычно dependency hell и нужна прям конкретная Ubuntu. Я её качаю через debootstrap, а дальше chroot.

U-Boot, Ядро, rkbin и т.п. от Rockchip, на базе которых сделан SDK

Про эту репу знаю. Им ещё в конце года mpp заблокировали.

Документация на чип:

Про эту репу не знал, благодарю.

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

Это не первый Rockchip SDK, с которым имею дело. Там обычно dependency hell и нужна прям конкретная Ubuntu.

Ну это проблема старых buildroot в целом.

И один фиг, в прод это закидывать так себе идея. Куча старых дырявых пакетов + старые компиляторы. Предпочитаю, после демо запуска, переходить на актуальные buildroot/yocto.

Из последних порадовал RK3568. Всё нужное в Mainline.

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

AlexVR ★★★★★
()
Ответ на: комментарий от Jullyfish

Не знаю u-boot, но как-то странно. Вроде, размер блока env равен 32 кБайт, что по содержимому, что по выводу «ENVF: Primary», а вы пишете через dd всего 1 кБайт. Может у этого блока CRC посчитан для всех 32 кБайт, а у вас там на 769 килобайт какой-нибудь мусор, а не нули.

Вроде, вам нужно fw_printenv и fw_setenv, настроить их на этот disk.img и смотреть.

А разделы, в вашем случае, ИМХО, лучше создавать с помощью sgdisk, его в скрипт вставлять. Плюс, надо помнить, что у gpt есть копия в конце, то есть последний раздел не должен быть до конца sd-карточки.

mky ★★★★★
()
Ответ на: комментарий от jpegqs

Сейчас просто попробовал создать пустую GPT на sd-карте. fdisk затирает env, а вот gdisk – нет. Но, увы:

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
spl: partition error
Trying to boot from MTD1

Я посмотрел, gdisk добавляет какой-то «мусор» в первый сектор, поэтому я ещё сделал так:

dd if=env.img of=/dev/sda bs=512 count=1 ; sync

Также увы:

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: !bad CRC @ 0x0
ENVF: !bad CRC @ 0x0
spl: partition error

И размер env не трогать нигде

Попробую изменить размер в конфигурации u-boot. И попробую сначала так запустить. Если успех, попробую ещё пустую GPT добавить.

Jullyfish ★★
() автор топика
Ответ на: комментарий от AlexVR

Ну это проблема старых buildroot в целом.

Насколько старых? Если верить luckfoxSDK там версия Buildroot 2023.02.6.

И один фиг, в прод это закидывать так себе идея.

Ну-с, я это в прод запихивать не планирую (но знаю тех, кто так делает). И в идеале планировал с чистым buildroot это сделать.

Предпочитаю, после демо запуска

Я демо запуск провёл как с emmc, так и с sd-карты. :^)

переходить на актуальные buildroot/yocto

А это вообще тяжело? Как я понимаю, это dts надо переносить, мб драйверы какие. Что-то ещё?

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

Это Allwinner? Мне казалось, наоборот, у них там полный порядок. Чуть-чуть ковырял Orange Pi PC2 (Allwinner), там с документацией, как по мне, было гораздо лучше, чем у Orange Pi 3B (Rockchip). Но я Linux не собирал, я OpenBSD ставил поиграться.

Jullyfish ★★
() автор топика
Ответ на: комментарий от Jullyfish

Попробую изменить размер в конфигурации u-boot. И попробую сначала так запустить.

Попробовал, как я понимаю, зашло в u-boot на sd-карте:

DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: Primary 0x00000000 - 0x00008000
ENVF: OK
Trying fit image at 0x440 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(c49c7043f2...) + sha256(c4fa82749f...) + OK
## Checking fdt 0x00261178 ... sha256(9f596c5683...) + OK
Total: 242.540 ms

Jumping to U-Boot(0x00200000)


U-Boot 2017.09 (Jan 28 2026 - 13:44:31 +0000)

Model: Rockchip RV1106 EVB Board
MPIDR: 0xf00
PreSerial: 2, raw, 0xff4c0000
DRAM:  256 MiB
Sysmem: init
Relocation Offset: 0fd80000
Relocation fdt: 0edf9f58 - 0edfede0
CR: M/C/I
Using default environment

no mmc device at slot 1
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
mmc@ffa90000: 0, mmc@ffaa0000: 1 (SD)
Bootdev(atags): mmc 1
MMC1: Legacy, 52Mhz
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
## Unknown partition table type 0
PartType: <NULL>
ENVF: !bad CRC @ 0x200
DM: v2
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
No misc partition
boot mode: None
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
FIT: No boot partition
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Failed to load DTB, ret=-19
No valid DTB, ret=-22
Failed to get kernel dtb, ret=-22
Model: Rockchip RV1106 EVB Board
rockchip_set_serialno: could not find efuse/otp device
## retrieving sd_update.txt ...
bad MBR sector signature 0x0000
** Invalid partition 1 **
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
CLK: (sync kernel. arm: enter 816000 KHz, init 816000 KHz, kernel 0N/A)
  apll 816000 KHz
  dpll 924000 KHz
  gpll 1188000 KHz
  cpll 1000000 KHz
  aclk_peri_root 400000 KHz
  hclK_peri_root 200000 KHz
  pclk_peri_root 100000 KHz
  aclk_bus_root 300000 KHz
  pclk_top_root 100000 KHz
  pclk_pmu_root 100000 KHz
  hclk_pmu_root 200000 KHz
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
No misc partition
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Net:   eth0: ethernet@ffa80000
Hit key to stop autoboot('CTRL+C'):  0 
## Booting FIT Image ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
FIT: No boot partition
FIT: No fit blob
FIT: No FIT image
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Could not find misc partition
ANDROID: reboot reason: "(none)"
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
android_image_load_by_partname: Can't find part: boot
Android image load failed
Android boot failed, error -1.
=> env print
arch=arm
autoload=no
baudrate=115200
board=evb_rv1106
board_name=evb_rv1106
bootargs=storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal 
bootcmd=boot_fit;boot_android ${devtype} ${devnum};
bootdelay=0
cpu=armv7
devnum=1
devtype=mmc
eth1addr=f2:9f:dd:35:b2:06
ethaddr=ee:9f:dd:35:b2:06
fdt_addr_r=0x00c00000
kernel_addr_c=0x00808000
kernel_addr_r=0x00008000
pxefile_addr_r=0x00c00000
ramdisk_addr_r=0x000e00000
rkimg_bootdev=if mmc dev 1 && rkimgtest mmc 1; then setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;elif mmc dev 0; then setenv devtype mmc; setenv devnum 0;elif mtd_blk dev 0; then setenv devtype mtd; setenv devnum 0;elif mtd_blk dev 1; then setenv devtype mtd; setenv devnum 1;elif mtd_blk dev 2; then setenv devtype mtd; setenv devnum 2;elif rknand dev 0; then setenv devtype rknand; setenv devnum 0;elif rksfc dev 0; then setenv devtype spinand; setenv devnum 0;elif rksfc dev 1; then setenv devtype spinor; setenv devnum 1;else;setenv devtype ramdisk; setenv devnum 0;fi; 
scriptaddr=0x00b00000
soc=rockchip
stderr=serial
stdin=serial
stdout=serial
vendor=rockchip

Environment size: 1159/262140 bytes
=>

Интересно, SPL запускается с emmc или с sd…

Jullyfish ★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария