doc:appunti:hardware:qnap_ts-120
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| doc:appunti:hardware:qnap_ts-120 [2022/02/10 22:34] – [Upgrading to 4 Tb Hard Disk] niccolo | doc:appunti:hardware:qnap_ts-120 [2025/04/01 12:55] (current) – [Cooling Fan] niccolo | ||
|---|---|---|---|
| Line 95: | Line 95: | ||
| </ | </ | ||
| - | ===== Console | + | ===== The Serial |
| - | Vedere qui: [[http:// | + | {{ .: |
| + | {{ .: | ||
| + | On the circuit board of the QNAP TS-120 there is a JTAG connector for the serial console. I used an old CD-ROM audio cable because it had the right connector. I wired only the **GND**, **TX** and **RX** pins from to QNAP to a serial-to-USB adapter. The adapter was inserted intp a GNU/Linux computer running the **minicom** program. The speed of the serial line was set to **115200**. The connector pinout is documented in this page: [[http:// | ||
| - | ===== Tips ===== | + | ^ Console Pinout |
| + | ^ 1 | TX | | ||
| + | ^ 2 | VCC +3.3 | | ||
| + | ^ 3 | RX | | ||
| + | ^ 4 | GND | | ||
| + | |||
| + | This is the boot process captured from the serial line. At the end of the bootstrap you will get a **login prompt**. | ||
| + | |||
| + | < | ||
| + | | ||
| + | | \/ | __ _ _ ____ | ||
| + | | |\/| |/ _` | '__\ \ / / _ \ | | | ||
| + | | | | | (_| | | \ V / __/ | | | ||
| + | |_| |_|\__, | ||
| + | | ||
| + | | | | | | __ ) ___ ___ | |_ | ||
| + | | | | |___| _ \ / _ \ / _ \| __| | ||
| + | | |_| |___| |_) | (_) | (_) | |_ | ||
| + | | ||
| + | ** MARVELL BOARD: DB-88F6282A-BP LE TS-120 ,PHY=1.8v | ||
| + | |||
| + | U-Boot 1.1.4 (Nov 5 2012 - 17:39:47) Marvell version: 3.5.3 | ||
| + | |||
| + | U-Boot code: 00600000 -> 0067FFF0 | ||
| + | |||
| + | Soc: MV88F6282 Rev 1CPU running @ 1600Mhz L2 running @ 533Mhz | ||
| + | SysClock | ||
| + | </ | ||
| + | ===== Real Time Clock rtc0 ===== | ||
| + | |||
| + | Into the QNAP TS-120 there is a Real Time Clock. You can see the battery on the motherboard and the kernel will print this on the serial console: | ||
| + | |||
| + | < | ||
| + | [ 1.262622] hctosys: unable to open rtc device (rtc0) | ||
| + | [ 1.628724] rtc-s35390a 0-0030: rtc core: registered rtc-s35390a as rtc0 | ||
| + | </ | ||
| + | |||
| + | The problem is that kernel packages **%%linux-image-4.19.0-*-marvell%%** include the RTC driver **compiled as a module** and the kernel executes **hctosys** before the module is loaded, so before the **rtc0** device is available. When the **rtc0** device becomes available, the **udev** subsystem is triggered by the file **/ | ||
| + | |||
| + | Historically that script does nothing if **systemd** is running, because it assumes that the system clock was already set from the hardware clock. See Debian bug **[[https:// | ||
| + | |||
| + | A quick and dirty solution is to edit the script **/ | ||
| + | |||
| + | < | ||
| + | #if [ -e / | ||
| + | # exit 0 | ||
| + | #fi | ||
| + | </ | ||
| + | |||
| + | You should also comment-out the **hwclock** commands containing the **%%--systz%%** option, (from the man page: "//It is intended to be used in a startup script on systems with kernels above version 2.6 where you know the System Clock has been set from the Hardware Clock by the kernel during boot//" | ||
| + | |||
| + | < | ||
| + | #/ | ||
| + | ... | ||
| + | #/ | ||
| + | </ | ||
| + | |||
| + | ===== Problem with the I2C bus locked ===== | ||
| + | |||
| + | Booting the **4.9.0-17** kernel, the '' | ||
| + | |||
| + | < | ||
| + | i2c /dev entries driver | ||
| + | i2c i2c-0: mv64xxx_i2c_fsm: | ||
| + | rtc-s35390a 0-0030: error resetting chip | ||
| + | rtc-s35390a: | ||
| + | </ | ||
| + | |||
| + | Booting the **4.19.0-21** kernel, the error message is slightly different: | ||
| + | |||
| + | < | ||
| + | i2c /dev entries driver | ||
| + | i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0 | ||
| + | rtc-s35390a 0-0030: error resetting chip | ||
| + | rtc-s35390a: | ||
| + | </ | ||
| + | |||
| + | This means that the I2C bus is locked and the RTC kernel module cannot load properly: | ||
| + | |||
| + | < | ||
| + | modprobe rtc-s35390a | ||
| + | </ | ||
| + | |||
| + | again we can read the '' | ||
| + | |||
| + | < | ||
| + | i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0 | ||
| + | rtc-s35390a 0-0030: error resetting chip | ||
| + | rtc-s35390a: | ||
| + | </ | ||
| + | |||
| + | The **problem was solved** by powering off the QNAP, **unplugging the power** connector and removing the inside clock battery (this last operation may be not necessary). | ||
| + | |||
| + | If the module is loaded and working, you can read the pseudofile **/ | ||
| + | |||
| + | < | ||
| + | cat / | ||
| + | rtc_time | ||
| + | rtc_date | ||
| + | alrm_time | ||
| + | alrm_date | ||
| + | alarm_IRQ | ||
| + | alrm_pending | ||
| + | update IRQ enabled | ||
| + | periodic IRQ enabled | ||
| + | periodic IRQ frequency | ||
| + | max user IRQ frequency | ||
| + | 24hr : yes | ||
| + | </ | ||
| + | |||
| + | **NOTICE**: There is a problem with poweroff which results into a reboot, which is eventually related to the RTC, which is working on the I2C bus. See the following thread for some insight: **[[https:// | ||
| - | * FIXME C'è un clock RTC a bordo? | ||
| ===== Upgrading to 4 Tb Hard Disk ===== | ===== Upgrading to 4 Tb Hard Disk ===== | ||
| Line 116: | Line 227: | ||
| </ | </ | ||
| - | ==== Dump and restore ==== | + | ==== Partition, dump and restore ==== |
| - | To avoid a complete | + | To avoid a complete |
| - | ==== Keel the UUID of root filesystem | + | For partitioning I used **parted**, see above for the partition schema. I created the ext4 filesystem |
| - | Beware that the **kernel** installed | + | <code bash> |
| + | mkfs.ext4 /dev/sdb1 | ||
| + | mkswap /dev/sdb2 | ||
| + | blkid /dev/sdb1 | ||
| + | blkid /dev/sdb2 | ||
| + | # Take note of the UUIDs of new partitions. | ||
| + | mount /dev/sdb1 /mnt | ||
| + | cd /mnt | ||
| + | ssh root@qnap.lan 'dump -0 -a -b 64 -f - / | ||
| + | vi / | ||
| + | # Update the UUIDs in fstab. | ||
| + | </ | ||
| + | |||
| + | **WARNING**: It is advisable to change the UUID of the root filesystem to match the one on the old disk, this is beacuse the initramfs stored | ||
| + | |||
| + | Fortunately the hard disk was seen correctly both on the computer and later on the QNAP, I mean in particular the overall size and the logical/ | ||
| < | < | ||
| + | Model: WDC WD40PURZ-85AKKY0 | ||
| + | Type: Hard Disk | ||
| + | Supports 48-bit addressing | ||
| + | Capacity: 1718295.8 MB = 1678.0 GB (-775897424 x 512) | ||
| </ | </ | ||
| + | |||
| + | but from the kernel point of view, everything seems ok: | ||
| + | |||
| + | < | ||
| + | scsi 1:0:0:0: Direct-Access | ||
| + | sd 1:0:0:0: [sda] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB) | ||
| + | sd 1:0:0:0: [sda] 4096-byte physical blocks | ||
| + | sd 1:0:0:0: [sda] Write Protect is off | ||
| + | sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn' | ||
| + | sda: sda1 sda2 sda3 | ||
| + | sd 1:0:0:0: [sda] Attached SCSI disk | ||
| + | </ | ||
| + | |||
| + | ==== Beware the UUID of root filesystem ==== | ||
| + | |||
| + | Once the new disk was partitioned, | ||
| + | |||
| + | If you forget this step (like I did) you can attach to the **serial console** and fix the problem. | ||
| + | |||
| + | When the boot process fails, you get the // | ||
| + | |||
| + | < | ||
| + | (initramfs) cd / | ||
| + | (initramfs) ln -s < | ||
| + | (initramfs) exit | ||
| + | </ | ||
| + | |||
| + | The QNAP should boot. To make a permanent fix you have to create a file **/ | ||
| + | |||
| + | < | ||
| + | ROOT=/ | ||
| + | </ | ||
| + | |||
| + | Update the initramfs with: | ||
| + | |||
| + | < | ||
| + | update-initramfs -k all -u | ||
| + | </ | ||
| + | |||
| + | The **update-initramsf** on the QNAP will call the **flash-kernel** tool to write the **kernel** and the **initramfs** images to the proper flash partitions. Flashing the images requires some minutes. You can verify that the proper //rootfs// device is written into the // | ||
| + | |||
| + | < | ||
| + | unmkinitramfs / | ||
| + | </ | ||
| + | |||
| + | Verify that inside the file **/ | ||
| + | |||
| + | < | ||
| + | ROOT="/ | ||
| + | </ | ||
| + | |||
| + | Now try to reboot. If the problem is fixed, you may remove the file **/ | ||
| + | |||
| + | ===== USB audio dongle ===== | ||
| + | |||
| + | I use the QNAP also as a **media player** because it stores all my audio files. I attached it to my HiFi amplifier through an **USB audio dongle** and an **audio cable** (3.5 mm jack - RCA stereo plugs). | ||
| + | |||
| + | I faced a problem with that audio USB interface, because at every reboot the device is not working and it does not show in **lsusb** output. The manual workaround was to unplup and re-plug the device into the USB port. | ||
| + | |||
| + | Fortunately it is possibile to force the re-initialization of the USB controller with the following script: | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/sh | ||
| + | # If the USB audio device is missing, try to reset the USB controller. | ||
| + | # USB 2.0 devices may be under / | ||
| + | PATH="/ | ||
| + | lsusb | grep -q ' | ||
| + | RET=$? | ||
| + | if [ " | ||
| + | echo "USB audio device missing, trying to reset the bus." | ||
| + | cd / | ||
| + | echo -n " | ||
| + | sleep 1 | ||
| + | echo -n " | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | So I created a systemd service to be run when the host reaches the multi-user target. Create the file **/ | ||
| + | |||
| + | < | ||
| + | # / | ||
| + | # | ||
| + | # Service executed once the system has reached the multi-user status. | ||
| + | # | ||
| + | # Type=oneshot | ||
| + | # RemainAfterExit=yes | ||
| + | # when all its processes exited. | ||
| + | # | ||
| + | # Eanble the service with: | ||
| + | # | ||
| + | |||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | RemainAfterExit=yes | ||
| + | ExecStart=/ | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | |||
| + | Enable and start the service with: | ||
| + | |||
| + | < | ||
| + | systemctl --now enable usb-audio-dongle-reset.service | ||
| + | </ | ||
| + | |||
| + | ===== Downgrading the kernel ===== | ||
| + | |||
| + | Is QNAP TS-120 is supported by the **flash-kernel** tool (notice the return code is zero): | ||
| + | |||
| + | < | ||
| + | flash-kernel --supported; | ||
| + | 0 | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | ls -l / | ||
| + | -rw-r--r-- 1 root root 2058840 Sep 29 2021 / | ||
| + | -rw-r--r-- 1 root root 2056592 Jun 30 2022 / | ||
| + | -rw-r--r-- 1 root root 2069944 Dec 12 2021 / | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | flash-kernel --force 4.19.0-18-marvell | ||
| + | </ | ||
| + | |||
| + | The flash procedure requires some time to coplete; writing about 2 Mb of **kernel** image and 6 Mb of **initramfs** image required **12 minutes**. | ||
| + | |||
| + | From the output when flashing a kernel you can also know where the Device Tree Blob (DTB) is taken: | ||
| < | < | ||
| - | # flash-kernel | ||
| kirkwood-qnap: | kirkwood-qnap: | ||
| Using DTB: kirkwood-ts219-6282.dtb | Using DTB: kirkwood-ts219-6282.dtb | ||
| - | Installing / | + | Installing / |
| Taking backup of kirkwood-ts219-6282.dtb. | Taking backup of kirkwood-ts219-6282.dtb. | ||
| Installing new kirkwood-ts219-6282.dtb. | Installing new kirkwood-ts219-6282.dtb. | ||
| - | flash-kernel: | + | Installing / |
| - | flash-kernel: | + | Taking backup of kirkwood-ts219-6282.dtb. |
| + | Installing new kirkwood-ts219-6282.dtb. | ||
| + | flash-kernel: | ||
| + | flash-kernel: | ||
| Generating kernel u-boot image... done. | Generating kernel u-boot image... done. | ||
| - | Flashing kernel (using | + | Flashing kernel (using |
| - | Flashing initramfs (using | + | Flashing initramfs (using |
| + | </ | ||
| + | |||
| + | ===== Cooling Fan ===== | ||
| + | |||
| + | The original fan is **50x50x15 mm** and is marked as: | ||
| + | |||
| + | * **Y.S. TECH** | ||
| + | * **FD125015LB** | ||
| + | * **DC12V 0.085A** | ||
| + | |||
| + | The pinout of the QNAP TS-120 fan is: | ||
| + | |||
| + | ^ PIN ^ Color ^ Function | ||
| + | | 1 | Black | Ground | ||
| + | | 2 | Yellow | ||
| + | | 3 | Green | Tachometer (sense) signal | ||
| + | | 4 | Blue | PWM control signal | ||
| + | |||
| + | |||
| + | This is the **standard pinout of a CPU fan** with PWM speed control an tachometer sensor: | ||
| + | |||
| + | ^ PIN ^ Color ^ Function | ||
| + | | 1 | Black | Ground | ||
| + | | 2 | Red | +12 v DC | | ||
| + | | 3 | Yellow | ||
| + | | 4 | Blue | PWM Control | ||
| + | |||
| + | |||
| + | To control the fan speed you can use the **qcontrol** tool: | ||
| + | |||
| + | < | ||
| + | qcontrol fanspeed {stop|silence|low|medium|high|full} | ||
| + | </ | ||
| + | |||
| + | ===== Automatic power-on ===== | ||
| + | |||
| + | To enable automatic power-on when power is restored (if the device was not powered down correctly): | ||
| + | |||
| + | < | ||
| + | qcontrol --direct autopower on | ||
| + | </ | ||
| + | |||
| + | ===== Temperature sensor ===== | ||
| + | |||
| + | < | ||
| + | cat / | ||
| </ | </ | ||
doc/appunti/hardware/qnap_ts-120.1644528885.txt.gz · Last modified: by niccolo
