ODROID-XU4 with OpenMediaVault

Preface

Nearly 3 years ago I have bought myself a PogoplugV2 (see Post). It is still an awesome device for this price and worked without any issue the whole time.

However it is time for an upgrade.  USB 2.0 was a little bit too slow for me (~30MB/s). In addition I have a lot of external USB 3.0 HDDs and it is time to use their full potential. So there are 4 key points a device needs to become my next NAS (Network-attached storage) and home server system:

  1. reasonable fast ARM processor with at least 2 cores (I prefer ARM over x86 for this use case because of its low energy consumption)
  2. Gigabit ethernet
  3. at least 2 USB 3.0 ports because I want to attach 2 active 4-port USB hubs. Almost all USB hubs >4 ports are cascaded 4 port hubs. This is quite bad because it can cause a lot of compatibility and of course performance issues.
  4. all together <150€. I do not want to pay 300-400€ for a simple NAS with USB disks…

ODROID-XU4

After a bit of research I have bought an ODROID-XU4.
Let’s look at the specs:

  • ODROID-XU4Samsung Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs
  • Mali-T628 MP6(OpenGL ES 3.0/2.0/1.1 and OpenCL 1.1 Full profile)
  • 2Gbyte LPDDR3 RAM PoP stacked
  • eMMC5.0 HS400 Flash Storage
  • 2 x USB 3.0 Host, 1 x USB 2.0 Host
  • Gigabit Ethernet port
  • HDMI 1.4a for display
  • Size : 82 x 58 x 22 mm
  • Price: ~80 € + PSU ~8 € + Case ~8€ = ~96 €

I do not need the GPU and display output but whatever… the price is quite good for this performance. It is less expensive in US than it is in germany. But that is always the case 😉

Additional equipment

I am using a microSD Card for OS because eMMC is quite expensive. Boot times and program loading times are not that important my use case.
With two additional 4 port active USB 3.0 hubs I have 8 USB 3.0 ports and 1 USB 2.0 port. At the moment 5 disks are connected with a total of 7.5 TB storage.
Connecting a 2 TB disk to each USB 3.0 port would be 16 TB storage which should be good enough for some time.

  • SanDisk Extreme 32GB microSDHC UHS-I  ~20 €microSD card
  • 2x EasyAcc® Superspeed USB 3.0 4 Port Bus-Powered and Self-Powered 2-in-1 Hub  2x ~11 €easyacc-superspeed-usb-3-0-4-port-bus-powered-and-self-powered-2-in-1-hub
  • Anker 20W Dual-Port USB Wall Charger to power USB Hubs  ~10 €Anker wall charger

 

OS Choices

The ODROID-XU4 SOC is the same as its predecessor ODROID-XU3. That is why they share a common kernel and os images are compatible.
Nevertheless Exynos5422 SOC is not fully integrated in mainline kernel yet. That is why you have to use a custom kernel from hardkernel. But that is not a big issue because there a quite a few OS choices with the custom kernel like Android (ofc pretty useless for NAS), Ubuntu 15.04, Arch Linux, Fedora, Kali Linux, …

Also I really like Arch Linux I have chosen a different path this time. There is OpenMediaVault (OMV) for some Odroids. I thought hey let’s give it a try the web interface looks quite nice.
After a few days I can say I really like it. The web interface is really good and looks modern.
OMV is running on Debian Wheezy 7.9.

Installation

Download OpenMediaVault Image from: http://sourceforge.net/projects/openmediavault/files/Odroid-XU3_XU4/

Extract the downloaded image

gunzip -d omv_2.1.1_xu3_xu4.img.gz

Search for the path of your microSD Card with lsblk  or sudo fdisk -l

Write the image to your microSD card with the following commands:

sudo dd if=omv_2.1.1_xu3_xu4.img of=/dev/<Your_SD> bs=4096
sync

Insert your microSD card and power your Odroid.
Then you can login via SSH or web interface:

SSH
username: root
password: odroid

Web interface
username: admin
password: openmediavault

I will not go into detail on how to configure stuff in the web interface because that is really easy and straightforward. I will focus on optimizing performance and adding a few neat features.

Basic configuration

Connect to your Odroid via SSH with default login credentials (see above).

Afterwards change your root password with passwd

You should change your web interface password, too.

Colorful Shell

Because we will use the shell for quite some time let’s add some color to it:

vi ~/.bashrc and comment out the following lines:

# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

vi /etc/vim/vimrc and comment out the following line:

syntax on

and some more set’s from the bottom of the file as you like.

Note: If you are not familiar with vi/vim  you can use nano  to edit all files.

Performance tuning

Performance with default settings was really bad. Disk read and write was around 30MB/s to ext4 and SSH was laggy. After a few minutes I have found the issue. Per default OMV sets the conservative governor. This may work well with x86 CPUs or other ARM CPUs but with Odroid it is a pain.

In the web interface under “Power Management” is an option called “Monitoring – Specifies whether to monitor the system status and select the most appropriate CPU level.” This sounds quite good, problem is this option sets the cpu governor to conservative. Conservative governor with default settings works really bad on Odroid in combination with I/O.
Disabling this option sets governor to performance. All 8 cores at max clock speed the whole time produce quite a bit of heat (fan spinning a lot) and it is not really energy efficient.

CPU governor

But no problem we can change the governor to ondemand and with a little bit tuning your Odroid will fly. The following settings will replace conservative with ondemand governor if you enable the Power Management option.

vi /etc/default/openmediavault and append the following lines to this file:

# Ondemand Scheduler
OMV_CPUFREQUTILS_GOVERNOR="ondemand"

Then regenerate the config with

omv-mkconf cpufrequtils

Note: There seems to be a bug in OpenMediaVault. After disabling Power Management and enabling it again it does not change cpu governor anymore. To fix this do the following:

update-rc.d cpufrequtils defaults

Ondemand governor tuning

I did a few benchmarks and this showed I/O performance (my main focus) depends a lot on the cpu frequency. Therefore we further have to tune ondemand governor to get full I/O throughput. To do so do the following:

apt-get install sysfsutils
vi /etc/sysfs.conf

Copy the following to this file

# cpu0 sets cpu[0-3], cpu4 sets cpu[4-7]
devices/system/cpu/cpu0/cpufreq/ondemand/io_is_busy = 1
devices/system/cpu/cpu4/cpufreq/ondemand/io_is_busy = 1
devices/system/cpu/cpu0/cpufreq/ondemand/sampling_down_factor = 10
devices/system/cpu/cpu4/cpufreq/ondemand/sampling_down_factor = 10
devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold = 80
devices/system/cpu/cpu4/cpufreq/ondemand/up_threshold = 80

Afterwards change to ondemand governor and activate these values with

cpufreq-set -g ondemand -c 0
cpufreq-set -g ondemand -c 4
service sysfsutils start

I did benchmarks with all these settings and for me this is the sweet spot. Nearly same performance as performance governor but lower frequency and less power consumption when idle.

Some explanation of all 3 settings:

sampling_down_factor: this parameter controls the rate at which the kernel makes a decision on when to decrease the frequency while running at top speed. When set to 1 (the default) decisions to reevaluate load are made at the same interval regardless of current clock speed. But when set to greater than 1 (e.g. 100) it acts as a multiplier for the scheduling interval for reevaluating load when the CPU is at its top speed due to high load. This improves performance by reducing the overhead of load evaluation and helping the CPU stay at its top speed when truly busy, rather than shifting back and forth in speed. This tunable has no effect on behavior at lower speeds/lower CPU loads.

up_threshold: defines what the average CPU usage between the samplings of ‘sampling_rate’ needs to be for the kernel to make a decision on whether it should increase the frequency. For example when it is set to its default value of ’95’ it means that between the checking intervals the CPU needs to be on average more than 95% in use to then decide that the CPU frequency needs to be increased.

io_is_busy:  if 1 waiting for I/O will increase the calculated cpu usage. The governor will calculate iowait as busy and not idle time. Thus cpu will reach higher frequencies faster with I/O load.

NTFS mount options

Besides the ondemand governor we will add the big_writes mount option to all NTFS mounts. In addition we will add noatime.

big_writes: this option prevents fuse from splitting write buffers into 4K chunks, enabling big write buffers to be transferred from the application in a single step (up to some system limit, generally 128K bytes).

noatime this option disables inode access time updates which can speed up file operations and prevent sleeping (notebook) disks spinning up too often thus saving energy and disk lifetime.

vi /etc/default/openmediavault and append the following

# Optimize NTFS Performance
OMV_FSTAB_MNTOPS_NTFS="defaults,nofail,noexec,noatime,big_writes"

Then you have to unmount, apply, mount, apply all your NTFS volumes in the web interface.

With default mount options you get around 16 MB/s write. With big_writes you get up to 62 MB/s write. See this comparison below:

NTFS diagram

This looks fairly fast but keep in mind NTFS is very cpu intensive on such a system. Therefore real network throughput via samba (which is cpu heavy as well) is way less compared to a native linux filesystem. I tested this disk with samba and measured only ~30MB/s read and write speeds. This is considerably less than a native linux filesystem (see Samba benchmarks).

If you want to get full performance you have to use a native linux filesystem like ext4 or xfs. You really should!

More Monitoring

I really like the monitoring setup of OMV with rrdtool. Nevertheless I miss 2 graphs which I am interested in. It would be nice to have CPU frequency and CPU temperature graphs, therefore I extended the existing monitoring plugin.

Monitoring cpu frequency is no big deal because there is a native collectd plugin for CPU frequency. For CPU temperature we have to write our own collectd plugin which looks like this:

#!/bin/sh

# Read CPU temperature of ODROID-XU3/4
# There are 2 sensors available:
# /sys/devices/virtual/thermal/thermal_zone0/temp
# /sys/devices/10060000.tmu/temp

HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
INTERVAL="${COLLECTD_INTERVAL:-60}"

while sleep "$INTERVAL"; do
	VALUE="$(($(cat /sys/devices/virtual/thermal/thermal_zone0/temp)/1000))"
	if [ $? -ne 0 ]; then
		VALUE="U"
	fi
	echo "PUTVAL \"$HOSTNAME/temperature/temperature-cpu\" interval=$INTERVAL N:$VALUE"
done

In addition to the script above you have to create new collectd configs and additional tabs in the web interface. I have done all that and uploaded the full sourcecode (including the script above) to GitHub: https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4

Install these CPU frequency and temperature monitoring plugins with the following commands:

cd /tmp
wget https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4/archive/master.zip
unzip master.zip
cd openmediavault-monitoring-odroid-xu4-master
cp -R usr/* /usr
cp -R var/* /var
rm -r /tmp/openmediavault-monitoring-odroid-xu4-master

chmod +x /usr/local/bin/cputemp /usr/share/openmediavault/mkconf/collectd.d/cpu{freq,temp}
omv-mkconf collectd

chown openmediavault:openmediavault /var/www/openmediavault/js/omv/module/admin/diagnostic/system/plugin/Cpu{Temperature,Frequency}.js
chmod 644 /var/www/openmediavault/js/omv/module/admin/diagnostic/system/plugin/Cpu{Temperature,Frequency}.js

source /usr/share/openmediavault/scripts/helper-functions && omv_purge_internal_cache

The default diagrams are a little small for my taste, that is why I have increased the size a bit:

vi /etc/default/openmediavault and add the following to this file

# RRDTool graph width and height
OMV_COLLECTD_RRDTOOL_GRAPH_WIDTH=800
OMV_COLLECTD_RRDTOOL_GRAPH_HEIGHT=200

Afterwards update OMV’s config files with

omv-mkconf collectd
omv-mkconf rrdcached

Afterwards you will have 2 new tabs which show graphs like these:

CPUFrequency

CPUTemperature

Finally reboot to see if everything is working as expected.

Benchmarks

All benchmarks were done with performance governor to get consistent results.

Disks

I have several USB disks connected to my Odroid. Expect one disk all are 2.5″ USB 3.0 disks. All USB 3.0 disks are connected to two active USB 3.0 hubs. The USB 2.0 disk is connected to the USB 2.0 port.
In the following you can find hdparm read and dd read/write benchmarks for all connected disks. As you can see the performance is quite good and should be near the maximum the disks can handle.

dd benchmark

### Overview of HDDs ###
sda	USB 2.0		NTFS w big_writes	WD Elements 2,5" - 500GB
sdb	USB 3.0		NTFS w big_writes	Toshiba Canvio Basics - 2TB
sdc	USB 3.0		ext4			WD Elements 2,5" - 2TB
sdd	USB 3.0		ext4			Toshiba Stor.E Basics - 2TB
sde	USB 3.0		ext4			CnMemory Zinc 2,5" - 1TB


### hdparm results ###
hdparm -Tt /dev/sda
/dev/sda:
 Timing cached reads:   1846 MB in  2.00 seconds = 924.41 MB/sec
 Timing buffered disk reads:  74 MB in  3.06 seconds =  24.22 MB/sec

hdparm -Tt /dev/sdb
/dev/sdb:
 Timing cached reads:   1370 MB in  2.00 seconds = 685.57 MB/sec
 Timing buffered disk reads: 240 MB in  3.52 seconds =  68.26 MB/sec

hdparm -Tt /dev/sdc
/dev/sdc:
 Timing cached reads:   1898 MB in  2.00 seconds = 950.68 MB/sec
 Timing buffered disk reads: 306 MB in  3.01 seconds = 101.61 MB/sec

hdparm -Tt /dev/sdd
/dev/sdd:
 Timing cached reads:   1960 MB in  2.00 seconds = 981.68 MB/sec
 Timing buffered disk reads: 248 MB in  3.01 seconds =  82.50 MB/sec
 
hdparm -Tt /dev/sde

/dev/sde:
 Timing cached reads:   2024 MB in  2.00 seconds = 1013.57 MB/sec
 Timing buffered disk reads: 318 MB in  3.02 seconds = 105.41 MB/sec


### dd results ###
 
# sda
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 41.4705 s, 25.9 MB/s

echo 3 > /proc/sys/vm/drop_caches && dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 44.1483 s, 24.3 MB/s

# sdb
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.609 s, 61.0 MB/s

echo 3 > /proc/sys/vm/drop_caches && dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.2101 s, 87.9 MB/s

# sdc
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.9431 s, 83.0 MB/s

echo 3 > /proc/sys/vm/drop_caches && dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.1161 s, 88.6 MB/s

# sdd
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 10.2158 s, 105 MB/s

echo 3 > /proc/sys/vm/drop_caches && dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.531 s, 85.7 MB/s

# sde
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 11.9007 s, 90.2 MB/s

echo 3 > /proc/sys/vm/drop_caches && dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.95148 s, 108 MB/s

Network

All network settings are default OMV/debian settings.

Receive: 832 Mbit/s = 104 MByte/s
Send: 896 Mbit/s = 112 MByte/s

I am satisfied with these results as it is close to the theoretical maximum of 1Gbit/s.

# Server on Odroid
iperf -s -N

# Client on Thinkpad T430
# bidirectional test individually
iperf -c 192.168.0.2 -i 2 -r
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 192.168.0.2, TCP port 5001
TCP window size:  323 KByte (default)
------------------------------------------------------------
[  5] local 192.168.0.118 port 56182 connected with 192.168.0.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec   200 MBytes   838 Mbits/sec
[  5]  2.0- 4.0 sec   198 MBytes   831 Mbits/sec
[  5]  4.0- 6.0 sec   198 MBytes   829 Mbits/sec
[  5]  6.0- 8.0 sec   198 MBytes   831 Mbits/sec
[  5]  8.0-10.0 sec   200 MBytes   838 Mbits/sec
[  5]  0.0-10.0 sec   994 MBytes   832 Mbits/sec
[  4] local 192.168.0.118 port 5001 connected with 192.168.0.2 port 44967
[  4]  0.0- 2.0 sec   207 MBytes   868 Mbits/sec
[  4]  2.0- 4.0 sec   215 MBytes   902 Mbits/sec
[  4]  4.0- 6.0 sec   216 MBytes   905 Mbits/sec
[  4]  6.0- 8.0 sec   214 MBytes   896 Mbits/sec
[  4]  8.0-10.0 sec   216 MBytes   907 Mbits/sec
[  4]  0.0-10.0 sec  1.04 GBytes   896 Mbits/sec


# bidirectional test simultaneously
iperf -c 192.168.0.2 -i 2 -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 192.168.0.2, TCP port 5001
TCP window size:  289 KByte (default)
------------------------------------------------------------
[  5] local 192.168.0.118 port 56187 connected with 192.168.0.2 port 5001
[  4] local 192.168.0.118 port 5001 connected with 192.168.0.2 port 44808
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 2.0 sec   125 MBytes   523 Mbits/sec
[  5]  0.0- 2.0 sec   100 MBytes   420 Mbits/sec
[  5]  2.0- 4.0 sec   109 MBytes   456 Mbits/sec
[  4]  2.0- 4.0 sec   110 MBytes   462 Mbits/sec
[  4]  4.0- 6.0 sec   112 MBytes   470 Mbits/sec
[  5]  4.0- 6.0 sec   108 MBytes   454 Mbits/sec
[  4]  6.0- 8.0 sec   118 MBytes   496 Mbits/sec
[  5]  6.0- 8.0 sec   105 MBytes   441 Mbits/sec
[  5]  8.0-10.0 sec   104 MBytes   436 Mbits/sec
[  4]  8.0-10.0 sec   119 MBytes   501 Mbits/sec
[  5]  0.0-10.0 sec   526 MBytes   441 Mbits/sec
[  4]  0.0-10.0 sec   587 MBytes   490 Mbits/sec

Samba

Disk and network speed looks fine. Because there are windows machines in my network I have to use samba to share files. As you can see samba speed is quite good and very stable.

Writing 2.7 GB test file to Odroid (USB 3.0 ext4 disk)

write

Reading 2.7 GB test file from Odroid (USB 3.0 ext4 disk)

read

 

If you have any additional questions feel free to ask 🙂
I will try to update this post regularly with new optimizations etc.

141 thoughts on “ODROID-XU4 with OpenMediaVault”

  1. Hi there, it is possible to use this Card for OS:

    Samsung microSDXC Pro Plus 64GB Kit, UHS-I U3/Class 10 (MB-MD64DA/EU)

  2. JCK is there anything else needed when switching the fan? New screws? Fan cover? Thermal compound?

    Thanks

    1. Hi odroid4life,

      I just bought an additional grid to protect the fan. It works with any 4x4cm grid.
      The new fan isn’t fixed with any screws, I just made the hole in the case as big as the fan, so it fits without mounting. I didn’t use any additional thermal compounds.

      The fan I mentioned in my post has 3 cables (power, ground, speed). I just removed the speed cable (the yellow one). Then I soldered the cables to the plug of the old fan.

  3. Thank you for this awesome blogpost!
    I love your graphs 😉

    This tutorial is very useful and helped me a lot.

    But the fan is very loud, even when using several scripts to control it.
    So I bought the Noctua NF-A4 FLX 5V (~12€) and cut a hole in the case.
    This fan is absolutely silent! Now the XU4 can sit in the Living Room without disturbing.

    If you want I can share some pictures and my fan control script.

    Grüße!

  4. Oh ok, thanks!

    I’ve got my XU4 running in a Cloudshell housing. Since OMV runs on Debian I have had no luck getting the front lcd to display system stats. Any chance you have a Cloudshell or can take a look into it?

  5. Thanks for the fast reply.

    I’ve ran and set permissions for the master.zip

    I am just confused because it reads:
    “In addition to the script above”

    Just wondering where I put this script:
    #!/bin/sh

    # Read CPU temperature of ODROID-XU3/4
    # There are 2 sensors available:
    # /sys/devices/virtual/thermal/thermal_zone0/temp
    # /sys/devices/10060000.tmu/temp

    HOSTNAME=”${COLLECTD_HOSTNAME:-localhost}”
    INTERVAL=”${COLLECTD_INTERVAL:-60}”

    while sleep “$INTERVAL”; do
    VALUE=”$(($(cat /sys/devices/virtual/thermal/thermal_zone0/temp)/1000))”
    if [ $? -ne 0 ]; then
    VALUE=”U”
    fi
    echo “PUTVAL \”$HOSTNAME/temperature/temperature-cpu\” interval=$INTERVAL N:$VALUE”
    done

    1. “I have done all that and uploaded the full sourcecode (including the script above) to GitHub …”
      It’s an example for advanced users so they know how to add their own scripts.

      You don’t have to create any script on your own and you don’t set permissions for master.zip!

      Simply do the following:

      cd /tmp
      wget https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4/archive/master.zip
      unzip master.zip
      cd openmediavault-monitoring-odroid-xu4-master
      cp -R usr/* /usr
      cp -R var/* /var
      rm -r /tmp/openmediavault-monitoring-odroid-xu4-master
      
      chmod +x /usr/local/bin/cputemp /usr/share/openmediavault/mkconf/collectd.d/cpu{freq,temp}
      omv-mkconf collectd
      
      chown openmediavault:openmediavault /var/www/openmediavault/js/omv/module/admin/diagnostic/system/plugin/Cpu{Temperature,Frequency}.js
      chmod 644 /var/www/openmediavault/js/omv/module/admin/diagnostic/system/plugin/Cpu{Temperature,Frequency}.js
      
      source /usr/share/openmediavault/scripts/helper-functions && omv_purge_internal_cache

      PS: I’ve updated the post to include download and unzip instructions.

  6. “Monitoring cpu frequency is no big deal because there is a native collectd plugin for CPU frequency. For CPU temperature we have to write our own collectd plugin which looks like this:”

    where do I put said plugin?

  7. Hi,
    yeah, it worked!
    Man, you really know that stuff!
    The graphs are very nice.
    The current policy states that “The governor ‘performance’ may decide which speed to use […]”.
    But I don’t really care…
    Now I only have to get good write speeds with SMB…
    If you like, you can have a look at my problem here: http://forums.openmediavault.org/index.php/Thread/12415-Write-speed-to-OMV-dropping-after-1-sec-to-10-MB-s/
    Thanks a lot for your help, I will definitely try to reference you wherever I can.

  8. Hey there,
    thank you very much for this blogpost! It is really helpful!
    I just bought the XU4 to build a small NAS. However I am completely new to Linux and have to learn from scratch…
    I already changed the cpu-ondemand-thingy (at least I think it works, is there any way tp prove it?) and made the graphs bigger.
    However I would also like to have those two extra graphs and in the instruction it only says: “Dowload it and simply extract all files to their path …”.
    I do not know how to download it via the terminal and do not know where exactly to put those downloaded files.
    Could you help me there and create a detailed instruction for that too please?
    Thank you in advance.
    Greetings from NRW 😉
    CG
    PS.
    Your Blog is awesome!

    1. Hi,

      to check your active governor simply run cpufreq-info and have a look at “current policy”.

      Copying all files to the correct path works like this:

      cd /tmp
      wget https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4/archive/master.zip
      unzip master.zip
      cd openmediavault-monitoring-odroid-xu4-master
      cp -R usr/* /usr
      cp -R var/* /var
      rm -r /tmp/openmediavault-monitoring-odroid-xu4-master

      Afterward set correct permissions and so on (see blog post or README.md).

      Thanks 🙂

  9. Do you think the CPU Governor will work correctly on ODroid C1+?
    Im using BigWrites and noatime and nodiratime as well but i modified /etc/fstab not the file you suggested

    1. It should. Just compare your file transfer speeds between performance and ondemand governor.
      If you’re not using openmediavault modifying fstab should be fine.

  10. Hi Obihörnchen,
    great article thanks a lot!
    and thank you MadMan I had the same setup and problem.
    I used FTP as a work around because there it was fast but with mounting the share it is as fast as described.
    Greeting from Bielefeld

  11. Hey Obihörnchen,
    thank you very much. That helped me a lot. Now I have done some more researches. The problem is the gvfs driver form which is mounting from userspace. If I mount it with cifs it runs with speeds between 80 and 90.
    mount -t cifs -o username=MYUSERNAME //IP.IP.IP.IP/path /mnt

    And I have to use sambe because it is a mixed environment with Windows clients too.

    Noch mal viellen herzlichen Dank aus Regensburg

  12. Hey your replay is really fast.
    and sorry for so much copied text

    I’m definitely going over Ethernet.
    I have seen your dd tests. But I understand them that you call this test directly on the odroid.

    And I mean that you dd from some PC over samba to the odroid.
    Easieast way is to go with nautilus to the samba odroid share and then open there a terminal and then dd to odroid.

    htop results are’t so exiting the maximum is at ~60% (Load average: 0.59 0.59 0.40)
    govoner is also on performance what you have discribet in your excellent post.

    I hope you can see something in these results

    =====================================================
    here is iostat -x 3:

    avg-cpu: %user %nice %system %iowait %steal %idle
    0.18 0.00 9.71 0.35 0.00 89.76

    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    mmcblk0 1.67 11.67 1.67 40.00 3.33 18787.33 901.95 17.47 358.88 10.00 373.42 10.04 41.83
    mmcblk0rpmb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    avg-cpu: %user %nice %system %iowait %steal %idle
    0.09 0.00 10.25 0.35 0.00 89.31

    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    mmcblk0 1.67 0.00 1.67 54.00 3.33 27477.33 987.33 28.47 528.14 17.00 543.92 10.30 57.33
    mmcblk0rpmb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    avg-cpu: %user %nice %system %iowait %steal %idle
    0.27 0.00 9.55 0.36 0.00 89.83

    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    mmcblk0 1.33 13.67 1.33 43.67 2.67 20666.67 918.64 18.67 395.22 18.75 406.72 10.44 47.00
    mmcblk0rpmb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    mmcblk0boot0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    ======================================================
    here comes the smb.conf
    which is in the moment from omv

    #======================= Global Settings =======================
    [global]
    workgroup = LAN
    server string = %h server
    dns proxy = no
    log level = 0
    syslog = 0
    log file = /var/log/samba/log.%m
    max log size = 1000
    syslog only = yes
    panic action = /usr/share/samba/panic-action %d
    encrypt passwords = true
    passdb backend = tdbsam
    obey pam restrictions = yes
    unix password sync = no
    passwd program = /usr/bin/passwd %u
    passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
    pam password change = yes
    socket options = TCP_NODELAY IPTOS_LOWDELAY
    guest account = nobody
    load printers = no
    disable spoolss = yes
    printing = bsd
    printcap name = /dev/null
    unix extensions = yes
    wide links = no
    create mask = 0777
    directory mask = 0777
    map to guest = Bad User
    use sendfile = yes
    aio read size = 16384
    aio write size = 16384
    null passwords = no
    local master = yes
    time server = no
    wins support = no

    #======================= Share Definitions =======================
    [asdf]
    comment = jkl
    path = /media/94e81e53-5217-4965-b470-a71cf931d8d0/asdf/
    guest ok = yes
    read only = no
    browseable = yes
    inherit acls = yes
    inherit permissions = no
    ea support = no
    store dos attributes = no
    printable = no
    create mask = 0755
    force create mode = 0644
    directory mask = 0755
    force directory mode = 0755
    hide dot files = yes
    read list =
    write list =

    =====================================================
    iperf speed measurement:

    madman@tiny:~%iperf -c 192.168.0.22 -P 10 -W 32k
    The -W option is not available in this release
    iperf: ignoring extra argument — 32k
    ————————————————————
    Client connecting to 192.168.0.22, TCP port 5001
    TCP window size: 85.0 KByte (default)
    ————————————————————
    [ 12] local 192.168.0.61 port 40856 connected with 192.168.0.22 port 5001
    [ 5] local 192.168.0.61 port 40840 connected with 192.168.0.22 port 5001
    [ 3] local 192.168.0.61 port 40842 connected with 192.168.0.22 port 5001
    [ 7] local 192.168.0.61 port 40844 connected with 192.168.0.22 port 5001
    [ 9] local 192.168.0.61 port 40846 connected with 192.168.0.22 port 5001
    [ 8] local 192.168.0.61 port 40848 connected with 192.168.0.22 port 5001
    [ 10] local 192.168.0.61 port 40850 connected with 192.168.0.22 port 5001
    [ 11] local 192.168.0.61 port 40852 connected with 192.168.0.22 port 5001
    [ 6] local 192.168.0.61 port 40854 connected with 192.168.0.22 port 5001
    [ 4] local 192.168.0.61 port 40838 connected with 192.168.0.22 port 5001
    [ ID] Interval Transfer Bandwidth
    [ 8] 0.0-10.0 sec 98.9 MBytes 82.9 Mbits/sec
    [ 11] 0.0-10.0 sec 82.0 MBytes 68.8 Mbits/sec
    [ 4] 0.0-10.0 sec 93.6 MBytes 78.5 Mbits/sec
    [ 12] 0.0-10.0 sec 96.5 MBytes 80.9 Mbits/sec
    [ 7] 0.0-10.0 sec 102 MBytes 85.8 Mbits/sec
    [ 10] 0.0-10.0 sec 87.9 MBytes 73.6 Mbits/sec
    [ 3] 0.0-10.0 sec 95.8 MBytes 80.1 Mbits/sec
    [ 6] 0.0-10.0 sec 91.1 MBytes 76.2 Mbits/sec
    [ 5] 0.0-10.0 sec 94.9 MBytes 79.3 Mbits/sec
    [ 9] 0.0-10.0 sec 89.6 MBytes 75.0 Mbits/sec
    [SUM] 0.0-10.0 sec 933 MBytes 780 Mbits/sec

    root@odroid:~#iperf -s

    [ 13] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40838
    [ 4] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40840
    [ 5] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40842
    [ 6] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40844
    [ 7] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40846
    [ 8] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40848
    [ 9] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40850
    [ 10] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40854
    [ 11] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40856
    [ 12] local 192.168.0.22 port 5001 connected with 192.168.0.61 port 40852
    [ 13] 0.0-10.0 sec 93.6 MBytes 78.3 Mbits/sec
    [ 8] 0.0-10.1 sec 98.9 MBytes 82.5 Mbits/sec
    [ 10] 0.0-10.0 sec 91.1 MBytes 76.1 Mbits/sec
    [ 11] 0.0-10.0 sec 96.5 MBytes 80.6 Mbits/sec
    [ 4] 0.0-10.1 sec 94.9 MBytes 79.2 Mbits/sec
    [ 5] 0.0-10.1 sec 95.8 MBytes 79.9 Mbits/sec
    [ 7] 0.0-10.1 sec 89.6 MBytes 74.8 Mbits/sec
    [ 9] 0.0-10.1 sec 87.9 MBytes 73.3 Mbits/sec
    [ 6] 0.0-10.1 sec 102 MBytes 85.3 Mbits/sec
    [ 12] 0.0-10.1 sec 82.0 MBytes 68.4 Mbits/sec
    [SUM] 0.0-10.1 sec 933 MBytes 777 Mbits/sec

    Thank you very much for your help

    1. Okay your network and everything else looks fine.

      I did tests with a linux client (Fedora 23 laptop), too. Results are as slow as yours. ~25MB/s for both reading and writing.
      And it doesn’t matter whether I use dd or copy and paste in X11.

      The same test (same HDD, same share, same network) on my Windows 10 client achieves ~78MB/s read and write.

      So I think linux client is the problem. Why do you use samba on linux?
      NFS should be much faster and better with a linux client.

  13. Hi Obihörnchen,

    I’m not able to get the samba speed as nearly as yours.
    You have this two screenshots from windows with datarates between 80 and 90 MB/s.
    But I’m just getting round about 25 MB/s for writing and 45 MB/s for reading.
    I have tested it with:
    Writing:
    dd if=/dev/zero of=/mySambaShareOnOdroidXU4 bs=1M count=1000
    Reading:
    dd of=/dev/zero if=/mySambaShareOnOdroidXU4 bs=1M count=1000

    Can you please post test results with dd. Because I can not find some other results in google.

    Thank you very much ObiHörnchen and I’m going crazy with this problem.

    1. Hey,

      please post your /etc/smb.conf and have a look at
      htop and iostat -x 3
      (before: apt-get install htop sysstat) while copying files.

      For dd benchmarks see this blog post Benchmarks > Disks 😉

      An iperf benchmark to your client pc would be nice as well to test network speed. Do you use cable or wifi?

  14. Another question I have is about fan speed control. Since the fan seems to turn on about every 45 seconds, at full blast, is there a fan control script that can limit the fan speed when it does fire up?

  15. Thanks for the reply, I actually added:

    devices/system/cpu/cpu0/cpufreq/scaling_governor = ondemand
    devices/system/cpu/cpu4/cpufreq/scaling_governor = ondemand

    to the /etc/sysfs.con. Worked out great!

  16. Im getting a few errors here:

    1.
    sudo update-rc.d cpufrequtils defaults
    update-rc.d: using dependency based boot sequencing
    update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match cpufrequtils Default-Stop values (none)
    insserv: warning: current start runlevel(s) (empty) of script `cpufrequtils’ overrides LSB defaults (2 3 4 5).
    insserv: warning: current stop runlevel(s) (2 3 4 5) of script `cpufrequtils’ overrides LSB defaults (empty).

    & 2:
    sudo service sysfsutils start
    Setting sysfs variables…unknown attribute devices/system/cpu/cpu4/cpufreq/ondemand/io_is_busy … failed!
    unknown attribute devices/system/cpu/cpu4/cpufreq/ondemand/sampling_down_factor … failed!
    unknown attribute devices/system/cpu/cpu4/cpufreq/ondemand/up_threshold … failed!
    .

    1. Hi,

      sorry for my late answer

      1) That’s fine

      2) Forgot to add that you have to run:

      cpufreq-set -g ondemand -c 0
      cpufreq-set -g ondemand -c 4

      before you can set these attributes. Updated my post.
      Thanks for reporting!

  17. thank’s for this detailed documentaition.
    i’m running the same system, but my disks are located in an external usb case (FANTEC QB-35US3-6G).
    runs pretty good this tiny little nas.

    i would integrate monitoring for my internet connection speed and found a little munin plugin.
    http://pardoe.io/blog/2013/04/29/monitoring-internet-connection-speed-with-munin/

    could you please help to integrate this into omv monitoring, like you did with cpu temp and freq?

    1. Just have a look at my github repo: https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4

      1) Create your collection script. This could look like this:

      #!/bin/sh
      
      HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
      INTERVAL="${COLLECTD_INTERVAL:-60}"
      
      while sleep "$INTERVAL"; do
      	OUTPUT=$(speedtest-cli --bytes --simple)
      	if [ $? -ne 0 ]; then
      		PING="U"
      		DOWNLOAD="U"
      		UPLOAD="U"
      	else
      		PING=$(echo "$OUTPUT" | awk '/Ping/{print $2}')
      		DOWNLOAD=$(echo "$OUTPUT" | awk '/Download/{print $2}')
      		UPLOAD=$(echo "$OUTPUT" | awk '/Upload/{print $2}')
      	fi
      	echo "PUTVAL \"$HOSTNAME/speedtest/ping-ping\" interval=$INTERVAL N:$PING"
      	echo "PUTVAL \"$HOSTNAME/speedtest/bytes-download\" interval=$INTERVAL N:$DOWNLOAD"
      	echo "PUTVAL \"$HOSTNAME/speedtest/bytes-upload\" interval=$INTERVAL N:$UPLOAD"
      done

      2) Create your collectd RRDTool plugin definition see: https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4/tree/master/usr/share/openmediavault/mkconf/collectd.d

      3) Create your OMV webgui tabs see: https://github.com/Obihoernchen/openmediavault-monitoring-odroid-xu4/tree/master/var/www/openmediavault/js/omv/module/admin/diagnostic/system/plugin

      4) Set correct permissions and so on (see blog my post)

  18. Hi, I’ve followed your tutorial, and i’m not quite getting there.
    While the numbers have improved, i don’t see the numbers you posted.
    The governor stays at performance, no big deal for me.
    I have two disks, a 6TB btrfs disk and a 120GB ext4 disk. both USB3.0.
    I’m a little surprised btrfs is so slow in the odroid. i get like 350MB/s read speed in my laptop. In the odroid write speed is avg 12MB/s.
    With the ext4 and a FTP share i managed to get to 50MB/s. Still, i dont think that’s quite good.

    Comands:

    # lsusb -t
    /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
    |__ Port 1: Dev 2, If 0, Class=vend., Driver=r8152, 5000M
    /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
    /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/2p, 5000M
    |__ Port 1: Dev 3, If 0, Class=stor., Driver=usb-storage, 5000M
    |__ Port 2: Dev 4, If 0, Class=stor., Driver=usb-storage, 5000M
    /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/2p, 480M
    /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=exynos-ohci/3p, 12M
    /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=s5p-ehci/3p, 480M

    # hdparm -tT /dev/sda (the btrfs partition disk)
    /dev/sda:
    Timing cached reads: 1828 MB in 2.00 seconds = 915.26 MB/sec
    Timing buffered disk reads: 304 MB in 3.02 seconds = 100.73 MB/sec

    # hdparm -tT /dev/sdb (the ext4 partition disk)
    /dev/sdb:
    Timing cached reads: 1792 MB in 2.00 seconds = 896.96 MB/sec
    Timing buffered disk reads: 294 MB in 3.00 seconds = 97.99 MB/sec

    $ iperf -c xu4
    ————————————————————
    Client connecting to xu4, TCP port 5001
    TCP window size: 85.0 KByte (default)
    ————————————————————
    [ 3] local 192.168.1.114 port 52362 connected with 192.168.1.177 port 5001
    [ ID] Interval Transfer Bandwidth
    [ 3] 0.0-10.0 sec 885 MBytes 743 Mbits/sec

    # cat /etc/default/openmediavault
    # Default values
    OMV_CONFIG_FILE=”/etc/openmediavault/config.xml”
    OMV_CONFIG_TEMPLATE_FILE=”/usr/share/openmediavault/templates/config.xml”
    OMV_PRODUCTINFO_FILE=”/usr/share/openmediavault/productinfo.xml”
    OMV_SCRIPTS_DIR=”/usr/share/openmediavault/scripts”
    OMV_I18N_LOCALE_DIR=”/usr/share/openmediavault/locale”
    OMV_MOUNT_DIR=”/media”
    OMV_NFSD_EXPORT_DIR=”/export”
    OMV_CACHE_DIR=”/var/cache/openmediavault”
    OMV_LOG_DIR=”/var/log/openmediavault”
    OMV_SSL_CERTIFICATE_DIR=”/etc/ssl”
    OMV_SSL_CERTIFICATE_PREFIX=”openmediavault-”
    OMV_SSH_KEYS_DIR=”/var/lib/openmediavault/ssh/keys”
    OMV_SSH_KEY_PREFIX=”openmediavault-”
    OMV_DPKGARCHIVE_DIR=”/var/cache/openmediavault/archives”
    OMV_DOCUMENTROOT_DIR=”/var/www/openmediavault”
    OMV_CRONSCRIPTS_DIR=”/var/lib/openmediavault/cron.d”
    OMV_CONFIGIMPORT_SCRIPTS_DIR=”/usr/share/openmediavault/configimport”
    OMV_MKCONF_SCRIPTS_DIR=”/usr/share/openmediavault/mkconf”
    OMV_ENGINED_DIR=”/usr/share/openmediavault/engined”
    OMV_ENGINED_SO_ADDRESS=”/var/lib/openmediavault/engined.sock”
    OMV_ENGINED_SO_SNDTIMEO=10
    OMV_ENGINED_SO_RCVTIMEO=180
    OMV_ENGINED_DIRTY_MODULES_FILE=”/var/lib/openmediavault/dirtymodules.json”
    OMV_INITSYSTEM_SCRIPTS_DIR=”/usr/share/openmediavault/initsystem”
    OMV_INITSYSTEM_FILE=”/var/lib/openmediavault/initsystem.req”
    OMV_USERMGMT_DEFAULT_GROUP=”users”
    OMV_RRDGRAPH_DIR=”/var/lib/openmediavault/rrd”
    OMV_RRDGRAPH_ERROR_IMAGE=”/usr/share/openmediavault/icons/rrd_graph_error_64.png”
    OMV_WEBGUI_FILE_OWNERGROUP_NAME=”openmediavault”
    OMV_DEBUG_SCRIPT=”NO”
    OMV_DEBUG_PHP=”NO”
    OMV_DEBUG_EXTJS=”NO”

    # Ondemand Scheduler
    OMV_CPUFREQUTILS_GOVERNOR=”ondemand”

    ideas? thanks.

    1. Can you run the dd benchmarks I’ve posted on both disks please (write and read)?

      Yes btrfs seems to be really slow. But that’s probably a kernel issue. Personally I wouldn’t use btrfs with such an “old” kernel.

  19. root@odroid:~# ps -ef | grep ntfs
    root 1430 1 3 08:29 ? 00:00:21 /sbin/mount.ntfs /dev/sda5 /media/01D0D41E73D216C0 -o rw,noexec,_netdev,noatime,big_writes
    root 8699 1 0 08:35 ? 00:00:00 /sbin/mount.ntfs /dev/sdb5 /media/0A3E01C53E01AAB1 -v -o rw,noexec,_netdev,noatime,big_writes
    root 15089 3092 0 08:41 pts/0 00:00:00 grep ntfs
    root@odroid:~#

    wooooo–hooo

  20. no change still the same

    ps -ef | grep ntfs
    root 1441 1 0 08:11 ? 00:00:00 /sbin/mount.ntfs /dev/sdb5 /media/0A3E01C53E01AAB1 -o rw,_netdev
    root 1452 1 0 08:11 ? 00:00:02 /sbin/mount.ntfs /dev/sda5 /media/01D0D41E73D216C0 -o rw,_netdev
    root 6455 3235 0 08:16 pts/0 00:00:00 grep ntfs

    1. mhh that’s really strange.
      Try to unmount your drive via web, click apply, mount it again, click apply again please.

      Afterwards post

      cat /etc/fstab

      And then reboot and post ps -ef …

    1. Aaarghh this comment section… unable to post proper code here.
      Ah I think that’s the wrong character.
      It should be

      It should be: " not: ”

      My config looks like this (copy and paste and it should work):

      # This file is part of OpenMediaVault.
      #
      # @license   http://www.gnu.org/licenses/gpl.html GPL Version 3
      # @author    Volker Theile 
      # @copyright Copyright (c) 2009-2015 Volker Theile
      #
      # OpenMediaVault is free software: you can redistribute it and/or modify
      # it under the terms of the GNU General Public License as published by
      # the Free Software Foundation, either version 3 of the License, or
      # any later version.
      #
      # OpenMediaVault is distributed in the hope that it will be useful,
      # but WITHOUT ANY WARRANTY; without even the implied warranty of
      # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      # GNU General Public License for more details.
      #
      # You should have received a copy of the GNU General Public License
      # along with OpenMediaVault. If not, see .
      
      # Default values
      OMV_CONFIG_FILE="/etc/openmediavault/config.xml"
      OMV_CONFIG_TEMPLATE_FILE="/usr/share/openmediavault/templates/config.xml"
      OMV_PRODUCTINFO_FILE="/usr/share/openmediavault/productinfo.xml"
      OMV_SCRIPTS_DIR="/usr/share/openmediavault/scripts"
      OMV_I18N_LOCALE_DIR="/usr/share/openmediavault/locale"
      OMV_MOUNT_DIR="/media"
      OMV_NFSD_EXPORT_DIR="/export"
      OMV_CACHE_DIR="/var/cache/openmediavault"
      OMV_LOG_DIR="/var/log/openmediavault"
      OMV_SSL_CERTIFICATE_DIR="/etc/ssl"
      OMV_SSL_CERTIFICATE_PREFIX="openmediavault-"
      OMV_SSH_KEYS_DIR="/var/lib/openmediavault/ssh/keys"
      OMV_SSH_KEY_PREFIX="openmediavault-"
      OMV_DPKGARCHIVE_DIR="/var/cache/openmediavault/archives"
      OMV_DOCUMENTROOT_DIR="/var/www/openmediavault"
      OMV_CRONSCRIPTS_DIR="/var/lib/openmediavault/cron.d"
      OMV_CONFIGIMPORT_SCRIPTS_DIR="/usr/share/openmediavault/configimport"
      OMV_MKCONF_SCRIPTS_DIR="/usr/share/openmediavault/mkconf"
      OMV_ENGINED_DIR="/usr/share/openmediavault/engined"
      OMV_ENGINED_SO_ADDRESS="/var/lib/openmediavault/engined.sock"
      OMV_ENGINED_SO_SNDTIMEO=10
      OMV_ENGINED_SO_RCVTIMEO=180
      OMV_ENGINED_DIRTY_MODULES_FILE="/var/lib/openmediavault/dirtymodules.json"
      OMV_INITSYSTEM_SCRIPTS_DIR="/usr/share/openmediavault/initsystem"
      OMV_INITSYSTEM_FILE="/var/lib/openmediavault/initsystem.req"
      OMV_USERMGMT_DEFAULT_GROUP="users"
      OMV_RRDGRAPH_DIR="/var/lib/openmediavault/rrd"
      OMV_RRDGRAPH_ERROR_IMAGE="/usr/share/openmediavault/icons/rrd_graph_error_64.png"
      OMV_WEBGUI_FILE_OWNERGROUP_NAME="openmediavault"
      OMV_DEBUG_SCRIPT="NO"
      OMV_DEBUG_PHP="NO"
      OMV_DEBUG_EXTJS="NO"
      
      # Optimize NTFS Performance
      OMV_FSTAB_MNTOPS_NTFS="defaults,nofail,noexec,noatime,big_writes"
      # Ondemand Scheduler
      OMV_CPUFREQUTILS_GOVERNOR="ondemand"
      # RRDTool graph width and height
      OMV_COLLECTD_RRDTOOL_GRAPH_WIDTH=800
      OMV_COLLECTD_RRDTOOL_GRAPH_HEIGHT=200
  21. root@odroid:~# ps -ef | grep ntfs
    root 1441 1 0 07:07 ? 00:00:00 /sbin/mount.ntfs /dev/sdb5 /media/0A3E01C53E01AAB1 -o rw,_netdev
    root 1452 1 0 07:07 ? 00:00:00 /sbin/mount.ntfs /dev/sda5 /media/01D0D41E73D216C0 -o rw,_netdev
    root 3298 2850 0 07:08 pts/0 00:00:00 grep ntfs
    root@odroid:~#

    same as before

    1. Ahhh I think I’ve found the issue 😀

      In your /etc/default/openmediavault is a

      "

      missing at the end of the line

      OMV_FSTAB_MNTOPS_NTFS="defaults,nofail,noexec,noatime,big_writes"

      Afterwards omv-mkconf fstab, reboot and post ps -ef | grep ntfs output again.

      1. i added the ”
        but fter that i get this

        root@odroid:~# omv-mkconf fstab
        /usr/sbin/omv-mkconf: 59: /etc/default/openmediavault: Syntax error: Unterminated quoted string

  22. root@odroid:~# cat /etc/default/openmediavault
    # This file is part of OpenMediaVault.
    #
    # @license http://www.gnu.org/licenses/gpl.html GPL Version 3
    # @author Volker Theile
    # @copyright Copyright (c) 2009-2015 Volker Theile
    #
    # OpenMediaVault is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # any later version.
    #
    # OpenMediaVault is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with OpenMediaVault. If not, see .

    # Default values
    OMV_CONFIG_FILE=”/etc/openmediavault/config.xml”
    OMV_CONFIG_TEMPLATE_FILE=”/usr/share/openmediavault/templates/config.xml”
    OMV_PRODUCTINFO_FILE=”/usr/share/openmediavault/productinfo.xml”
    OMV_SCRIPTS_DIR=”/usr/share/openmediavault/scripts”
    OMV_I18N_LOCALE_DIR=”/usr/share/openmediavault/locale”
    OMV_MOUNT_DIR=”/media”
    OMV_NFSD_EXPORT_DIR=”/export”
    OMV_CACHE_DIR=”/var/cache/openmediavault”
    OMV_LOG_DIR=”/var/log/openmediavault”
    OMV_SSL_CERTIFICATE_DIR=”/etc/ssl”
    OMV_SSL_CERTIFICATE_PREFIX=”openmediavault-”
    OMV_SSH_KEYS_DIR=”/var/lib/openmediavault/ssh/keys”
    OMV_SSH_KEY_PREFIX=”openmediavault-”
    OMV_DPKGARCHIVE_DIR=”/var/cache/openmediavault/archives”
    OMV_DOCUMENTROOT_DIR=”/var/www/openmediavault”
    OMV_CRONSCRIPTS_DIR=”/var/lib/openmediavault/cron.d”
    OMV_CONFIGIMPORT_SCRIPTS_DIR=”/usr/share/openmediavault/configimport”
    OMV_MKCONF_SCRIPTS_DIR=”/usr/share/openmediavault/mkconf”
    OMV_ENGINED_DIR=”/usr/share/openmediavault/engined”
    OMV_ENGINED_SO_ADDRESS=”/var/lib/openmediavault/engined.sock”
    OMV_ENGINED_SO_SNDTIMEO=10
    OMV_ENGINED_SO_RCVTIMEO=180
    OMV_ENGINED_DIRTY_MODULES_FILE=”/var/lib/openmediavault/dirtymodules.json”
    OMV_INITSYSTEM_SCRIPTS_DIR=”/usr/share/openmediavault/initsystem”
    OMV_INITSYSTEM_FILE=”/var/lib/openmediavault/initsystem.req”
    OMV_USERMGMT_DEFAULT_GROUP=”users”
    OMV_RRDGRAPH_DIR=”/var/lib/openmediavault/rrd”
    OMV_RRDGRAPH_ERROR_IMAGE=”/usr/share/openmediavault/icons/rrd_graph_error_64.png”
    OMV_WEBGUI_FILE_OWNERGROUP_NAME=”openmediavault”
    OMV_DEBUG_SCRIPT=”NO”
    OMV_DEBUG_PHP=”NO”
    OMV_DEBUG_EXTJS=”NO”

    # Optimize NTFS Performance
    OMV_FSTAB_MNTOPS_NTFS=”defaults,nofail,noexec,noatime,big_writes

  23. root@odroid:~# ps -ef | grep ntfs
    root 1437 1 0 06:46 ? 00:00:00 /sbin/mount.ntfs /dev/sdb5 /media/0A3E01C53E01AAB1 -o rw,_netdev
    root 1447 1 0 06:46 ? 00:00:00 /sbin/mount.ntfs /dev/sda5 /media/01D0D41E73D216C0 -o rw,_netdev
    root 3070 2995 0 06:47 pts/0 00:00:00 grep ntfs
    root@odroid:~# nano /etc/default/openmediavault

    root@odroid:~# cpufreq-info | grep decide
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use
    The governor “performance” may decide which speed to use

    1. Mhh that didn’t work.
      Can you paste output of the following command please:

      cat /etc/default/openmediavault

      Did you run omv-mkconf fstab and omv-mkconf cpufrequtils and rebooted?
      On top of that run update-rc.d cpufrequtils defaults too.

  24. So I’ve to add the command at the bottom…. I’ll try and get back….. And sorry I forgot to say thanks a lot… For the post and the quick response

    1. After you have done all of this and rebooted the following 2 commands should output something like:

      root@server:~# ps -ef | grep ntfs
      root 1521 1 0 Oct19 ? 00:00:25 /sbin/mount.ntfs /dev/sda1 /media/B4D48115D480DB4E -o rw,noexec,_netdev,noatime,big_writes
      root 1547 1 0 Oct19 ? 00:05:53 /sbin/mount.ntfs /dev/sdb1 /media/4A98777798775FFD -o rw,noexec,_netdev,noatime,big_writes
      root 13444 13238 0 13:36 pts/0 00:00:00 grep ntfs

      root@server:~# cpufreq-info | grep decide
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use
      The governor "ondemand" may decide which speed to use

  25. i did perform all that using nano and i used putty and ssh into odroid but i dnt get the part about where do i have to add this
    # Optimize NTFS Performance
    OMV_FSTAB_MNTOPS_NTFS=”defaults,nofail,noexec,noatime,big_writes”
    there is nothing like what youve posted above all i get is this

    # Default values
    OMV_CONFIG_FILE=”/etc/openmediavault/config.xml”
    OMV_CONFIG_TEMPLATE_FILE=”/usr/share/openmediavault/templates/config.xml”
    OMV_PRODUCTINFO_FILE=”/usr/share/openmediavault/productinfo.xml”
    OMV_SCRIPTS_DIR=”/usr/share/openmediavault/scripts”
    OMV_I18N_LOCALE_DIR=”/usr/share/openmediavault/locale”
    OMV_MOUNT_DIR=”/media”
    OMV_NFSD_EXPORT_DIR=”/export”
    OMV_CACHE_DIR=”/var/cache/openmediavault”
    OMV_LOG_DIR=”/var/log/openmediavault”

    when i pass the command

    1. You have to append these lines at the bottom of the file

      So it looks like this:

      ...
      OMV_CACHE_DIR=”/var/cache/openmediavault”
      OMV_LOG_DIR=”/var/log/openmediavault”

      # Optimize NTFS Performance
      OMV_FSTAB_MNTOPS_NTFS=”defaults,nofail,noexec,noatime,big_writes

      I’ll make the instructions more clear.

  26. because i am getting pretty bad write speed at max 12mbps
    read speed are going till 50 mbps and im cool with it since my partition is ntfs

    im using 2.5 inch hdd with ntfs please help me regarding write speeds?

    1. Yes the bad write speed is because of NTFS with default mount options.
      As you can see in the post you can increase it a lot with the big_writes mount option (1st diagram).
      Without it I get ~12-15MB/s, too.

      You have to do all of this with ssh on your Odroid.
      Just ssh as root into your Odroid. On Windows use putty (simple) or cygwin (harder) for ssh.
      With big_writes and ondemand governor + tuning your writes could go up to 40MB/s.

      Tip: For a beginner using nano instead of vi to edit files should be easier. nano shows all keyboard shortcuts you can press to save the file etc.

  27. i followed it
    now the things you have mentioned above are they supposed to be running in ssh or in some linux distro the commands to check and change the governor and ntfs noatime?

    i am new to all this

    1. Ehmm pretty simple:
      Connect 1 USB 3.0 4-port Hub to each XU4 USB 3.0 port = 2 (XU4 ports) * 4 (Hub ports) = 8 USB 3.0 ports + 1 USB 2.0 port from XU4

      I’ve described this in my post 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.