04.05.2012, Первая загрузка linux'а на AM3517

Материал из SRNS
Перейти к: навигация, поиск
(Первые программы)
(Первые программы)
Строка 343: Строка 343:
  
 
Листинг Си++ с использованием Qt:
 
Листинг Си++ с использованием Qt:
<source lang="C++">
+
<source lang="Cpp">
 
#include <QApplication>
 
#include <QApplication>
 
#include <QPushButton>
 
#include <QPushButton>

Версия 20:31, 4 мая 2012

Ядро пришлось компилировать заново, из репозитория. Результат:

Первая загрузка linux

Texas Instruments X-Loader 1.46 (May 11 2011 - 19:45:24)


U-Boot 2009.11 (May 30 2011 - 22:50:27)

OMAP34xx/35xx-GP ES1.0, CPU-OPP2 L3-165MHz
VAR-SOM-AM35xx Board + LPDDR/NAND
I2C:   ready
DRAM:  256 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Die ID #2f5000010000000001685a201101d012
Net:   davinci_emac_initialize
Ethernet PHY: GENERIC @ 0x00
DaVinci EMAC
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x280000, size 0x300000
 3145728 bytes read: OK
## Booting kernel from Legacy Image at 80000000 ...
   Image Name:   Linux-2.6.37+
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2592380 Bytes =  2.5 MB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Linux version 2.6.37+ (ofei@Korogodin-Notebook) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #1 Fri May 4 18:43:19 MSK 2012
CPU: ARMv7 Processor [411fc087] revision 7 (ARMv7), cr=10c53c7f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: VARISCITE VAR-SOM-AM35
Reserving 4194304 bytes SDRAM for VRAM
Memory policy: ECC disabled, Data cache writeback
AM3517 ES1.1 (l2cache sgx neon isp )
SRAM: Mapped pa 0x40200000 to va 0xfe400000 size: 0x10000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 64000
Kernel command line: mem=256M console=ttyO2,115200n8 noinitrd root=/dev/mtdblock4 rw rootfstype=jffs2 ethaddr=F8:DC:7A:00:00:00 ip=192.168.0.105::192.168.0.1:255.255.255.0 consoleblank=0
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 252MB = 252MB total
Memory: 250560k/250560k available, 11584k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xd0800000 - 0xf8000000   ( 632 MB)
    lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc0034000   ( 176 kB)
      .text : 0xc0034000 - 0xc04b480c   (4611 kB)
      .data : 0xc04b6000 - 0xc04f9760   ( 270 kB)
NR_IRQS:375
Clocking rate (Crystal/Core/MPU): 26.0/332/600 MHz
IRQ: Found an INTC at 0xfa200000 (revision 4.0) with 96 interrupts
Total of 96 interrupts on 1 active controller
GPMC revision 5.0
Trying to install interrupt handler for IRQ368
Trying to install interrupt handler for IRQ369
Trying to install interrupt handler for IRQ370
Trying to install interrupt handler for IRQ371
Trying to install interrupt handler for IRQ372
Trying to install interrupt handler for IRQ373
Trying to install interrupt handler for IRQ374
Trying to install type control for IRQ375
Trying to set irq flags for IRQ375
OMAP clockevent source: GPTIMER1 at 13000000 Hz
Console: colour dummy device 80x30
Calibrating delay loop... 598.01 BogoMIPS (lpj=2990080)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
regulator: core version 0.5
regulator: dummy:
NET: Registered protocol family 16
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
omap_mux_init: Add partition: #1: core, flags: 0
error: no MAC address on cmd. line, set to F8:DC:7A:00:00:00
OMAP DMA hardware revision 4.0
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
omap_i2c omap_i2c.1: bus 1 rev3.12 at 400 kHz
omap_i2c omap_i2c.2: bus 2 rev3.12 at 400 kHz
omap_i2c omap_i2c.3: bus 3 rev3.12 at 400 kHz
Advanced Linux Sound Architecture Driver Version 1.0.23.
Switching to clocksource gp timer
musb-hdrc: version 6.0, otg (peripheral+host), debug=0
musb-hdrc musb-hdrc.0: dma type: dma-cppi41
<6>Waiting for PHY clock good...
musb-hdrc musb-hdrc.0: USB OTG mode controller at d0810000 using DMA, IRQ 71
NET: Registered protocol family 2
IP route cache hash table entries: 2048 (order: 1, 8192 bytes)
TCP established hash table entries: 8192 (order: 4, 65536 bytes)
TCP bind hash table entries: 8192 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NetWinder Floating Point Emulator V0.97 (double precision)
omap_init_opp_table: no hwmod or odev for iva, [9] cannot add OPPs.
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
msgmni has been set to 489
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
OMAP DSS rev 2.0
omapdss supply vdds_dsi not found, using dummy regulator
OMAP DISPC rev 3.0
omapdss supply vdda_dac not found, using dummy regulator
OMAP VENC rev 2
OMAP DSI rev 1.0
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
omap_uart.0: ttyO0 at MMIO 0x4806a000 (irq = 72) is a OMAP UART0
omap_uart.1: ttyO1 at MMIO 0x4806c000 (irq = 73) is a OMAP UART1
omap_uart.2: ttyO2 at MMIO 0x49020000 (irq = 74) is a OMAP UART2
console [ttyO2] enabled
brd: module loaded
loop: module loaded
omap2-nand driver initializing
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xca (Micron )
Creating 5 MTD partitions on "omap2-nand.0":
0x000000000000-0x000000080000 : "xloader-nand"
0x000000080000-0x000000240000 : "uboot-nand"
0x000000240000-0x000000280000 : "params-nand"
0x000000280000-0x000000780000 : "linux-nand"
0x000000780000-0x000010000000 : "jffs2-nand"
davinci_mdio davinci_mdio: davinci mdio revision 1.5
davinci_mdio davinci_mdio: detected phy mask fffffffc
davinci_mdio: probed
davinci_mdio davinci_mdio: phy[0]: device ffffffff:00, driver Micrel KS8041
davinci_mdio davinci_mdio: phy[1]: device ffffffff:01, driver Micrel KS8041
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-omap.0 supply hsusb0 not found, using dummy regulator
ehci-omap.0 supply hsusb1 not found, using dummy regulator
ehci-omap ehci-omap.0: OMAP-EHCI Host Controller
ehci-omap ehci-omap.0: new USB bus registered, assigned bus number 1
ehci-omap ehci-omap.0: irq 77, io mem 0x48064800
ehci-omap ehci-omap.0: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: OMAP-EHCI Host Controller
usb usb1: Manufacturer: Linux 2.6.37+ ehci_hcd
usb usb1: SerialNumber: ehci-omap.0
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 3 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver usbtest
g_ether gadget: using random self ethernet address
g_ether gadget: using random host ethernet address
usb0: MAC ce:13:d4:2d:8e:4b
usb0: HOST MAC c2:5f:8b:50:0b:6c
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
g_ether gadget: g_ether ready
musb-hdrc musb-hdrc.0: MUSB HDRC host driver
musb-hdrc musb-hdrc.0: new USB bus registered, assigned bus number 2
usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: MUSB HDRC host driver
usb usb2: Manufacturer: Linux 2.6.37+ musb-hcd
usb usb2: SerialNumber: musb-hdrc.0
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
mice: PS/2 mouse device common for all mice
spi1.0 supply vcc not found, using dummy regulator
ads7846 spi1.0: touchscreen, irq 217
input: ADS7846 Touchscreen as /devices/platform/omap2_mcspi.1/spi1.0/input/input0
rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
rtc-ds1307 1-0068: 56 bytes nvram
lirc_dev: IR Remote Control driver registered, major 252
IR NEC protocol handler initialized
IR RC5(x) protocol handler initialized
IR RC6 protocol handler initialized
IR JVC protocol handler initialized
IR Sony protocol handler initialized
IR RC5 (streamzap) protocol handler initialized
IR LIRC bridge handler initialized
Linux video capture interface: v2.00
usbcore: registered new interface driver uvcvideo
USB Video Class driver (v1.0.0)
vpfe_init
OMAP Watchdog Timer Rev 0x31: initial timeout 60 sec
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
usbcore: registered new interface driver snd-usb-audio
OMAP3517 / AM3517 EVM SoC init
AIC23 Audio Codec 0.1
asoc: tlv320aic23-hifi <-> omap-mcbsp-dai.0 mapping ok
ALSA device list:
  #0: am3517evm
TCP cubic registered
NET: Registered protocol family 17
NET: Registered protocol family 15
Registering the dns_resolver key type
VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 1
Power Management for TI OMAP3.
clock: disabling unused clocks to save power
mmc0: new SD card at address b368
mmcblk0: mmc0:b368 SDC   244 MiB
 mmcblk0: p1
rtc-ds1307 1-0068: setting system clock to 2000-01-01 00:11:42 UTC (946685502)
omap_vout omap_vout: Buffer Size = 3686400
omap_vout omap_vout: : registered and initialized video device 0
omap_vout omap_vout: Buffer Size = 3686400
omap_vout omap_vout: : registered and initialized video device 1
usb 1-1: new high speed USB device using ehci-omap and address 2
usb 1-1: New USB device found, idVendor=0424, idProduct=2514
usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 3 ports detected
net eth0: attached PHY driver [Micrel KS8041] (mii_bus:phy_addr=ffffffff:00, id=221537)
davinci_mdio davinci_mdio: resetting idled controller
Sending DHCP and RARP requests .
PHY: ffffffff:00 - Link is Up - 100/Full
..... timed out!
IP-Config: Reopening network devices...
net eth0: attached PHY driver [Micrel KS8041] (mii_bus:phy_addr=ffffffff:00, id=221537)
davinci_mdio davinci_mdio: resetting idled controller
Sending DHCP and RARP requests .
PHY: ffffffff:00 - Link is Up - 100/Full
..... timed out!
IP-Config: Auto-configuration of network failed.
VFS: Mounted root (jffs2 filesystem) on device 31:4.
Freeing init memory: 176K
INIT: version 2.86 booting
Please wait: booting...
Starting udev
WARNING: -e needs -E or -F
udevd (601): /proc/601/oom_adj is deprecated, please use /proc/601/oom_score_adj instead.
FAT: bogus number of reserved sectors
VFS: Can't find a valid FAT filesystem on dev mmcblk0.
EXT3-fs (mmcblk0): error: can'
t find ext3 filesystem on dev mmcblk0.
EXT2-fs (mmcblk0): error: can't find an ext2 filesystem on dev mmcblk0.
FAT: bogus number of reserved sectors
VFS: Can'
t find a valid FAT filesystem on dev mmcblk0.
Remounting root file system...
Caching udev devnodes
Populating dev cachemv: cannot rename '/tmp/devices': No such file or directory
ALSA: Restoring mixer settings...
Configuring network interfaces... done.
Setting up IP spoofing protection: rp_filter.
Thu Jul  7 16:04:00 UTC 2011
INIT: Entering runlevel: 5
Starting system message bus: dbus.
Starting Hardware abstraction layer hald
Starting Dropbear SSH server: dropbear.
Starting telnet daemon.
Starting syslogd/klogd: done
Starting thttpd.
Starting PVR
Usage: insmod filename [args]
FATAL: Module omaplfb not found.
bufferclass_ti: Unknown symbol PVRGetBufferClassJTable (err 0)
insmod: error inserting '/lib/modules/2.6.37/kernel/drivers/char/bufferclass_ti.ko': -1 Unknown symbol in module
BusyBox v1.13.2 (2011-07-05 21:30:53 CDT) multi-call binary

Usage: mknod [OPTIONS] NAME TYPE MAJOR MINOR

Create a special file (block, character, or pipe)

Options:
        -m      Create the special file using the specified mode (default a=rw)
TYPEs include:
        b:      Make a block device
        c or u: Make a character device
        p:      Make a named pipe (MAJOR and MINOR are ignored)

chmod: /dev/pvrsrvkm: No such file or directory
Starting Matrix GUI application.

 _____                    _____           _         _  
|  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_
|     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
|__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|  
              |___|                    |___|            

Arago Project http://arago-project.org am3517-evm ttyO2

Arago 2011.06 am3517-evm ttyO2

am3517-evm login:

Пока в качестве rootfs залил старый jffs2 файл с ftp сервера. Видимо ошибки из-за этого. Надо разбираться, как собрать rootfs в jffs2 виде.

Первые программы

Использовался Ангстромовский кросскомпилятор.

am3517-evm login: root
root@am3517-evm:/# cd /media/mmcblk0p1/
root@am3517-evm:/media/mmcblk0p1# ls -a
.            ..           HelloARM     MLO          qte-example  u-boot.bin
root@am3517-evm:/media/mmcblk0p1# ./HelloARM
Hello world!
root@am3517-evm:/media/mmcblk0p1# ./qte-example
Hello, C++ world!

root@am3517-evm:/media/mmcblk0p1# ls -a
.            HelloARM     myfile.txt   u-boot.bin
..           MLO          qte-example
root@am3517-evm:/media/mmcblk0p1# cat ./myfile.txt
Hello world in file


Листинг Си:

#include <stdio.h>

int main(void)
{
    printf("Hello world! \n");
        return 0;
}


Листинг Си++ с использованием Qt:

#include <QApplication>
#include <QPushButton>
#include <stdio.h>
#include <iostream>

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    std::cout << "Hello, C++ world!" << std::endl;
   
    FILE * pFile;
    pFile = fopen ("myfile.txt","w");
    if (pFile!=NULL)
    {
      fputs ("Hello world in file",pFile);
      fclose (pFile);
    }
 
    QPushButton btn("Hello World");
    btn.show();
    btn.showMaximized();

    return app.exec();
   
}

[ Хронологический вид ]Комментарии

Ну, самое главное, ядро загрузилось, а дальше - дело понятное, что дело ясное ;)

В логе он пытается подмонтировать файловую систему из mmcblk0. Судя по названию, это карточка mmc, которой нет. А ведь rootfs в соответствии с параметрами ядра должна лежать в /dev/mtdblock4.

Похоже, ядро игнорирует параметры, которые ему передаются. В логах написано: error: no MAC address on cmd. line, set to F8:DC:7A:00:00:00 хотя в параметрах ядра указано: ethaddr=F8:DC:7A:00:00:00 Может, там должно быть macaddr?

rootfs должен быть записан в nand, вот сюда: 0x000000780000-0x000010000000 : "jffs2-nand" Так пишет ядро. rootfs удалось записать в nand по этому адресу?

Да, туда закинуты 70 метров Angstrom root fs. Но не от этого ядра, а pre-build jffs2 файл с FTP'шника Veriscite'a. Я пока не разобрался, как собрать root fs.

Из лога:

NAND device: Manufacturer ID: 0x2c, Chip ID: 0xca (Micron )

Creating 5 MTD partitions on "omap2-nand.0":

0x000000000000-0x000000080000 : "xloader-nand"

0x000000080000-0x000000240000 : "uboot-nand"

0x000000240000-0x000000280000 : "params-nand"

0x000000280000-0x000000780000 : "linux-nand"

0x000000780000-0x000010000000 : "jffs2-nand"

Т. е. в параметрах ядра указано правильно, rootfs лежит в /dev/mtdblock4. mtd - memory technology devices, разделы нумеруются с нуля, поэтому наш раздел как раз четвёртый.

Вообще, рута он новерное подмонтировал: VFS: Mounted root (jffs2 filesystem) on device 31:4. Обращаю внимание на последнюю цифру - это номер раздела (4), minor number устройства /dev/mtdblock4. 31, стало быть, major number.

То, что дальше - относится к карточке SD/MMC, нам это сейчас неинтересно. Впрочем, можешь попробовать карточку вставить и посмотреть, что он напишет, но это просто так, ради любопытства, проблему это не решит.

Самое главное здесь: FATAL: Module omaplfb not found. Т.е. на rootfs где-то в каталоге /lib/modules/2.6.37/, но его там нет.

Надо посмотреть, что есть в образе rootfs!!!

root fs у нас от 2.6.37, а ядро теперь 2.6.37+. Добавил в текст содержимое каталогов. У тебя есть идеи как посмотреть кишки jffs2 файла?

Дай команду

>> uname -r

она выдаст точное название ядра. Может быть, она ищет файлы в каталоге /lib/modules/2.6.27+, или ещё где. Должно совпадать с выводом uname -r

root@am3517-evm:~# uname -r
2.6.37+
Тот модуль, что он ищет, находится в 2.6.37. См. выше

Ну, так и есть, modprobe ищет модули в неправильном месте.

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

А ещё, если rootfs у тебя доступен для записи, можно сделать ссылку из 2.6.37+ в 2.6.37. Или вообще просто каталог переименовать.

Но если модули от одного ядра, а само ядро - другое - может начать ругаться, будет писать UNKNOWN SYMBOL ...

Надо честно ядро вместе с модулями собрать, сделать свой rootfs. Все файлы можно взять от старого, а поменять только модули ядра. Если с JFFS2 работать не получится, никто не запрещает rootfs в обычном ext2 сделать.

root@am3517-evm:~# insmod /lib/modules/2.6.37/kernel/drivers/char/omaplfb.ko 
omaplfb: Unknown symbol PVRGetDisplayClassJTable (err 0)
insmod: error inserting '/lib/modules/2.6.37/kernel/drivers/char/omaplfb.ko': -1 Unknown symbol in module

Ну, теперь точно нужны исходники ядра для этой системы, надо собрать ядро и модули. Образ ядра перевести в формат u-boot/PPC (не знаю, как, надо искать утилиту). Модули закинуть в образ rootfs.

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

Можно подмонировать образ rootfs, как я описывал ниже, и записать туда модули ядра, а все остальне оставить прежним.

Только стоит ли бодаться из-за этого? omapfb - модуль framebuffer, он бесполезен, пока мы работаем через uart, он может понадобиться (не обязательно), если к этой плате графический дисплей подключить, по HDMI, например, или телевизор тот же. Там просто больше символов на экране помещаться будет и шрифны погламурнее, а в остальном то же самое.

Или ты сейчас так и работаешь? Клавиатуру и монитор подцепил? Ведь сначала порт был неправильный.

Работаю через UART, посредством kermit'a

Забей тогда на omapfb. Попробуй что-нибудь ещё. Hello world уже работает, это главное.

Попробуй сетку, что-ли поднять.

>> ifconfig -a

Эта команда выдаст все сетевые устройства. Должно быть eth0.

>> ifconfig eth0 192.168.0.15 netmask 255.255.255.0 up

Эта команда запускает сетевой интерфейс.

>> route add default gw 192.168.0.1 eth0

Эта команда добавляет путь к шлюзу 192.168.0.1 (если он у тебя есть, конечно)

>> echo nameserver 8.8.8.8 > /etc/resolv.conf

Эта команда задаёт адрес сервера имён.

>> ping www.ya.ru

Может и заработать! По крайней мере, у нас в центре.

Заработает, куда он денется) Только до роутера надо кабелек кинуть от платы.

Для просмотра образа нужно на настольном компьютере:

1) пересбрать ядро (не в AM35, в твоём компьютере) с поддержкой JFFS2

  Для этого нужны рабочие исходники ядра настольной системы, нужно перейти в их каталог и запустить 
  >> make menuconfig
  Там выбрать:
  Device drivers -> Memory Technology device (MTD) support <M>
  File systems -> Miscellaneous filesystems [*] -> Journalling Flash File System v2 (JFFS2) <M>
  Затем пересобрать ядро:
  make && make modules install
  и загрузить модуль jffs2
  modprobe jffs2

2) Далее нужно подмонтировать образ rootfs куда-нибудь:

  >> mount -o loop <rootfs.img> /mnt/floppy -t jffs2
  В каталоге /mnt/floppy будет примонтирован образ системы из файла <rootfs.img>, можно посмотреть.

Немного извратил твой совет, результат выше. Давай туда переходить, в комментариях уже не разобрать что к чему. Как обычно - кнопка Правка сверху.

Я-то думал, у тебя в новой системе на AM35 нет возможности команды давать. А так всё будет совсем просто. Например, посмотреть rootfs можно так:

>> ls /

)

Я догадывался, но не был в этом уверен. Вдруг он создает какие-то файлы и каталоги во время загрузки...

Ну вот и сравни их для уверенности. Но всё должно быть правильно - сам он файлы никакие не создаёт. Обычно для этого initrd делают, это тоже своеобразный образ rootfs, но тут этого нет.

Короче говоря, раз так, пробуй грузить модули вручную через modprobe/insmod.

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты