My Cloud OS5 Development & Testing

I have a spare My Cloud PR4100 that’s kept as a backup for my file server, so I decided to upgrade from My Clouud OS3 to My Cloud OS5, strictly for experimentation. Eventually, I plan to transfer OS5 to a bootable USB stick so I can experiment more easily by making direct changes to the filesystem and observing the results.

My first impression is that it’s the same old dashboard as before, with some minor changes. It also tries very hard to connect to the internet, and it really wants you to allow it to share “Analytics”, where the “Analytics opt-in” notice doesn’t look too bad at first glance, but reading the actual “EULA” and/or “Terms of Service” made a chill go down my spine. No thanks, it’s blocked from accessing the internet, and I have no plans to change that.

The first order of business is to make a backup of the eMMC just in case something goes wrong, and save a copy of the kernel boot log for analysis.

dd if=/dev/mmcblk0 of=/shares/Public/mmcblk0_OS5.07.118.img bs=512
dmesg > /shares/Public/dmesg_OS5.07.118.txt

My Cloud OS5 appears to be going through some teething pains, so I plan to wait until it stabilizes before diving too deeply into it. OS5 finally has a somewhat recent Linux kernel, which opens up many possibilities, where I believe it may be possible to strip out most of the unwanted parts, thus making it into something more suitable for a simple home NAS server.

1 Like

They say the best place to start is the beginning, so I decided to look at the script file that’s loaded from the uRamdisk file (initramfs) and executed very early in the boot sequence. Specifically, I was looking to see if the WD developers had fixed a bug I reported several years ago.

As it turns out, they have fixed the bug, exactly as I suggested. Now the integrity of all system partitions are properly checked during each boot sequence.

They also updated dosfstools to version 4.1 (2017-01-24) to avoid the “ Bad short file name () ” error message caused by the older version.

dosfsck -p /dev/mmcblk0p1 2>/dev/null
fsck.fat 4.1 (2017-01-24)
/dev/mmcblk0p1: 6 files, 1166/70544 clusters

The WD developers also updated the grub.cfg file to reflect the newer Linux kernel version 4.14.22. However, they failed to correct the bad spelling of “Rescure Mode”. Granted, nobody will ever see it unless they’re tinkering with the firmware like me, but still. Why not simply call it “Safe Mode” since that’s what the web-based firmware upload page says?

Busybox version 1.30.1 (2020-09-04) was one of many packages and programs that were updated with OS5. The list of available Busybox built-in shell commands has increased from 131 to 195, so perhaps the WD developers were getting tired of the severely crippled Linux environment, which I still find quite limited at times. They didn’t create symlinks for many useful shell commands like xxd (for hexdumps), so to use them they must be preceeded by busybox. For example: busybox xxd

Currently defined functions:
[, [[, addgroup, adduser, adjtimex, ar, arch, arp, arping, ash, awk, basename, bc,
blkdiscard, bzcat, cat, chattr, chgrp, chmod, chown, chroot, clear, cmp, cp, crond,
crontab, cut, date, dd, delgroup, deluser, df, dhcprelay, diff, dirname, dmesg,
dnsdomainname, dos2unix, dpkg, dumpleases, echo, egrep, env, expand, expr, factor,
fallocate, false, fatattr, fgrep, find, free, fsck, fsfreeze, fstrim, getopt, getty, grep,
halt, head, hexedit, hostname, hwclock, i2cdetect, i2cdump, i2cget, i2cset, id, ifconfig,
ifdown, ifenslave, ifup, init, ionice, ipcalc, ipneigh, kill, killall, link, linux32,
linux64, linuxrc, ln, logger, login, logname, logread, losetup, ls, lsattr, lspci, lsscsi,
lsusb, lzcat, md5sum, mdev, mkdir, mkdosfs, mke2fs, mkfifo, mknod, mkpasswd, mkswap,
mktemp, modprobe, more, mount, mv, nice, nl, nohup, nologin, nproc, nsenter, nslookup,
nuke, partprobe, passwd, paste, pidof, ping, ping6, pivot_root, poweroff, printenv,
printf, ps, pwd, rdate, readlink, reboot, renice, resume, rm, rmdir, route, run-init, sed,
seq, setfattr, setpriv, sh, sha3sum, shred, shuf, sleep, sort, split, ssl_client, stat,
svc, svok, swapoff, swapon, sync, sysctl, syslogd, tac, tail, tar, tc, tee, tftp, tftpd,
top, touch, tr, traceroute, traceroute6, true, truncate, tty, ubirename, udhcpc, udhcpd,
uevent, umount, uname, uniq, unix2dos, unlink, unshare, uptime, usleep, vconfig, vi, w,
watch, wc, which, xargs, xxd, xzcat, zcat, zcip

Sadly, the WD developers neglected to include many useful commands, as indicated by the Busybox config file, located in the WD GPL source code for OS5. Some commands come with a significant space penalty, so it’s possible that there simply wasn’t enough room in the EMMC.

CONFIG_CPIO is not set
CONFIG_LESS is not set
CONFIG_LSOF is not set
CONFIG_PSTREE is not set
CONFIG_XZ is not set
CONFIG_UNXZ is not set

However, the WD developers made certain to enable virtually all available logging options. Go figure.



Something I find especially annoying about both My Cloud OS3 and My Cloud OS5, is that the “Apps” tab effectively freezes the browser window for several minutes if it’s blocked from accessing the internet. Eventually it times out and displays “No available Apps” (OS3) or “No Internet access” (OS5).

Seriously, whoever set the connection timeouts for the dashboard needs their head examined because nobody in their right mind is going to sit there and wait several minutes for the dashboard to tell them something they probably already know. And the list of “Installed Apps” for a new installation of OS5 doesn’t leave a good first impression.

For comparison, here’s what My Cloud OS3 looks like. Which reminds me… it might be a good idea to change the “My Cloud” logo to reflect which OS version is in use. At the very least, it might help to avert some confusion.

Lastly, removing the “Backups” tab from My Cloud OS5 was a stupid move, especially since many people, myself included, consider backups to be a critical function of any NAS. Granted, the OS3 backup apps had some bugs and didn’t always work properly, but they should have been fixed, rather than removed.


Much thanks for posting !!!

I only have a extra ex2Ultra for testing OS5

Plus playing around with the M.2 SSD Argon addon for my Raspberry Pi 4 8 GB
as a WD raid disk backup reading device was more fun
(left over disks from the old DL4100 CPU bit the dust days)

Cloud access is disabled on my PR4100 and it’s blocked from accessing the internet. However, it still tries repeatedly to establish connections with remote servers. OS3 was bad about doing this, and OS5 appears to be worse.

Here are some examples, where SYN_SENT means it tried to establish a connection, but never got a response, and ESTABLISHED means a connection was successful, as is the case with the smbd (Samba) local networking process. The wget and curl processes are Linux programs used to download files. The restsdk-server process is cloud-related, and it’s a beast.

# netstat -v -p -e -W -t -u -c

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 PR4100:445          ESTABLISHED root       172181     22480/smbd
tcp        0      1 PR4100:36756   SYN_SENT    root       731417     16657/wget
tcp        0      1 PR4100:53906   SYN_SENT    root       728278     9359/curl
tcp        0      1 PR4100:52124   SYN_SENT    root       727247     4525/restsdk-server

# top -n 1

22480  4302 root     S<   35600    0.9   1  0.0 smbd -D
9359  8470 root     S    82956    2.1   0  0.0 curl -s -w %{http_code} -o /tmp/tmp.k810r4
16657  4123 root     S    12368    0.3   3  0.0 wget -o /tmp/healthcheck/check.txt
4525  4518 root     S    1016m   26.5   0  0.0 restsdk-server -minimal -configPath /usr/local/modules/restsdk/etc/restsdk-server.toml -crashLog /var/log/restsdk-server-crash.log

# cat /tmp/healthcheck/check.txt

--2020-12-13 17:47:56--
Resolving,,, ...
Connecting to||:80... failed: Connection timed out.
Connecting to||:80... failed: Connection timed out.
Connecting to||:80... failed: Connection timed out.
Connecting to||:80... failed: Connection timed out.
Connecting to|2600:9000:2009:f000:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:d800:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:5400:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:4600:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:f200:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:3a00:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:b600:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.
Connecting to|2600:9000:2009:3400:0:f23b:bf80:93a1|:80... failed: Cannot assign requested address.

The following URL is cloud-related information the curl process attempts to download. It appears to contain configuration data and a list of URLs with interesting names like “” and analytics trackers from “”.

After reading that the fireAlert -S process may be responsible for repeatedly writing to a file named alert_send.xml on an eMMC flash partition, I decided to do some comparative analysis between a PR4100 running OS3 and a PR4100 running OS5, and found that the fireAlert -S process definitely behaves differently on the two systems.

First, I killed the fireAlert -S process so I could see what happened when it was first executed.

# pkill fireAlert
[1]+  Terminated                 fireAlert -S

Executing fireAlert -S on OS3 immediately returns to a command prompt, and appending & to send it to the background has the same result. However, executing fireAlert -S on OS5 does not immediately return to a command prompt, and appending & to send it to the background does in fact cause it to run as a background process. Either it’s hanging on OS5 or it’s actually running, perhaps waiting for input.

Regardless, the fireAlert -S process is definitely reading and writing data on OS5, as shown from it’s system I/O stats.

# cat /proc/31290/io
rchar: 33422
wchar: 40
syscr: 70
syscw: 4
read_bytes: 0
write_bytes: 8192
cancelled_write_bytes: 0

And about 5 minutes later.

# cat /proc/31290/io
rchar: 70313
wchar: 100
syscr: 154
syscw: 10
read_bytes: 0
write_bytes: 20480
cancelled_write_bytes: 0

Next, I searched for the alert_send.xml file, and while I have yet to definitively link it to the fireAlert -S process, which may require a stack trace, the file only appears to exist on OS5 and not on OS3.

# find / -name alert_send.xml

# cat /var/log/alert_send.xml

# cat /usr/local/tmp_wdnas_config/config/alert_send.xml

Curiously, the alert_send.xml file also exists in the /var/log directory, possibly as a copy made from the /usr/local/tmp_wdnas_config directory during the boot process. The /var/log directory is a tempfs, which isn’t a problem, but the /usr/local/tmp_wdnas_config directory is mounted to the /dev/mmcblk0p6 partition in eMMC flash memory, and too many writes can permanently damage it.

As a precaution, I temporarily made the /alert_send.xml file in the /usr/local/tmp_wdnas_config/config/ directory read only for all users. Hopefully, it should save the eMMC flash from excessive writes as I perform more testing.

# chmod 0444 /usr/local/tmp_wdnas_config/config/alert_send.xml
-r--r--r--    1 root     root            10 Dec 13 18:24 alert_send.xml

To change it back.

# chmod 0644 /usr/local/tmp_wdnas_config/config/alert_send.xml
-rw-r--r--    1 root     root            10 Dec 13 18:22 alert_send.xml

I decided to briefly enable internet access for My Cloud OS5 to see what apps are available. However, I encountered an internet connection problem that required me to disable WAN NAT Redirection filtering at my router, which My Cloud OS3 doesn’t require. I’m not happy about it, but it’s only temporary so I can live with it for the time being. I’m not dumb enough to leave it disabled so My Cloud OS5 can use port redirection to bypass my router’s internet restrictions for the PR4100.


Anyway, it didn’t take long to find out what happened to the backups functionality that had been a core part of My Cloud OS3. It’s now a series of separate apps that the user has to download and install, one at a time.

Camera Backups
Internal Backups
Remote Backups
USB Backups

The following apps had also been a core part of My Cloud OS3, and while I do appreciate apps like Amazon S3 now being optional, I believe that apps like FTP Downloads should have been left right where they were, but with the option of uninstalling them, if desired.

FTP Downloads
Amazon S3
iTunes Server

The following My Cloud OS3 apps were notably absent from My Cloud OS5 and not available for download.

HTTP Downoads
DNLA Media Server
P2P Downloads
Web File Viewer

People have been complaining about the lack of apps for years, and it’s very obvious that WD removed core My Cloud OS3 functionality and turned it into a series of apps to make it look like My Cloud OS5 has more apps. And missing apps like the Web File Viewer are glaringly obvious.

Surely a big corporation like Western Digital can afford to pay a few programmers to develop some new apps, rather than playing shell games. Excluding apps that were a core part of My Cloud OS3, which has 20 apps available for download, there appears to be just 11 apps available to download for My Cloud OS5.

People aren’t stupid, most of them anyway, and some of us have long memories.

I for one cannot fathom why this was not included with OS/5. The functionality is basic.

I complained about the Web File Viewer years ago, back in March 2017 to be exact, and suggested replacing it with something more robust and intuitive. Like you, I also described it as “basic” functionaliy, yet the WD “solution” was to remove it entirely? Frankly, that kind of thinking is why so many people are having problems with My Cloud OS5.

The My Cloud OS5 /var/spool/cron/crontabs/root crontab file is populated from multiple sources in sequential order. Full paths added for clarity.

From /usr/local/modules/files/static_crond_list

*/30 * * * * /usr/sbin/quota_monitor &
0 */4 * * * /usr/sbin/rlog -s /usr/local/modules/files/syslog_rotate.conf
0 0 * * * /usr/sbin/random_chk_central -s &
30 0 * * 1 /usr/sbin/logwdmsg -e &
0 3 * * * /usr/sbin/logwdmsg -o &
01 3 * * * /usr/local/sbin/
00 3 * * * /usr/sbin/
30 0 * * 1 /usr/sbin/ > /dev/null 2>&1 &
* * * * * /usr/sbin/ &

From /usr/local/tmp_wdnas_config/config/config.xml

30 2 * * * /usr/sbin/stime&
0 3 * * * /usr/sbin/
0 4 * * * /usr/sbin/auto_fw -a -c&
0 0 * * * /usr/sbin/ &
30 3 * * * /usr/sbin/chk_wfs_download&
0 0 * * * /usr/sbin/random_check -s &
11 9 * * * /usr/sbin/auto_fw -d 0 &
0 0 * * * /usr/sbin/
43 10 * * * /usr/local/sbin/

From /usr/sbin/random_chk_central --> /lib/

* * * * * /usr/sbin/
0 3 * * 1 /usr/sbin/

This is a My Cloud OS5 crontab entries breakdown, sorted by time intervals, with descriptions. Full paths added for clarity.

Every minute.
Update xmldbc and restart sysinfod
* * * * * /usr/sbin/

Every minute.
Rotate system logs.
* * * * * /usr/sbin/ &

Every 30 minutes.
Monitor disk space quotas.
*/30 * * * * /usr/sbin/quota_monitor &

At minute 0 past every 4th hour.
Save rotated log files.
0 */4 * * * /usr/sbin/rlog -s /usr/local/modules/files/syslog_rotate.conf

Every day at 12:00 AM or 00:00 hours.
Auto clear recycle bin.
0 0 * * * /usr/sbin/ &

Every day at 12:00 AM or 00:00 hours. (FILE DOES NOT EXIST)
Set random time to check/install firmware from WD server.
0 0 * * * /usr/sbin/random_check -s &

Every day at 12:00 AM or 00:00 hours.
Set random time to check wdlog central server.
0 0 * * * /usr/sbin/random_chk_central -s &

Every day at 12:00 AM or 00:00 hours.
Check for expired users.
0 0 * * * /usr/sbin/

Every day at 2:30 AM or 02:30 hours.
Get time from NTP “network time protocol” server.
30 2 * * * /usr/sbin/stime&

Every day at 3:00 AM or 03:00 hours. (FILE DOES NOT EXIST)
Rotate system logs.
00 3 * * * /usr/sbin/

Every day at 3:00 AM or 03:00 hours.
Log configuration information.
0 3 * * * /usr/sbin/logwdmsg -o &

Every day at 3:00 AM or 03:00 hours.
Clean alert database, copy alert files from /CacheVolume to /usr/local/config, log analytics.
0 3 * * * /usr/sbin/

Every day at 3:01 AM or 03:01 hours.
Use wdlog to log data size for volumes and inode usage of file systems.
01 3 * * * /usr/local/sbin/

Every day at 3:30 AM or 03:30 hours. (FILE DOES NOT EXIST)
Looks for /mnt/HD/HD_[a,b,c,d]2/.systemfile/wfs_download
30 3 * * * /usr/sbin/chk_wfs_download&

Every day at 4:00 AM or 04:00 hours.
Check WD server and get APPs xml file.
0 4 * * * /usr/sbin/auto_fw -a -c&

Every day at 9:11 AM or 09:11 hours.
Download and install firmware.
11 9 * * * /usr/sbin/auto_fw -d 0 &

Every day at 10:43 AM or 10:43 hours.
WD Central Server analytics, Product Improvement Program.
43 10 * * * /usr/local/sbin/

Mondays at 12:30 AM or 00:30 hours. (FILE DOES NOT EXIST)
Create system logs.
30 0 * * 1 /usr/sbin/ > /dev/null 2>&1 &

Mondays at 12:30 AM or 00:30 hours.
Log device information.
30 0 * * 1 /usr/sbin/logwdmsg -e &

Mondays at 3:00 AM or 03:00 hours.
Get list of compatible hard drives.
0 3 * * 1 /usr/sbin/

The following crontab file programs and scripts do not exist on OS5, but do exist on OS3. Full paths added for clarity.

0 0 * * * /usr/sbin/random_check -s &
00 3 * * * /usr/sbin/
30 3 * * * /usr/sbin/chk_wfs_download&
30 0 * * 1 /usr/sbin/ > /dev/null 2>&1 &

The /usr/sbin/random_chk_central program repopulates the crontab file, thus causing changes to be lost.

# rm -f /var/spool/cron/crontabs/root
# crontab -l
# /usr/sbin/random_chk_central -s
# crontab -l

The following link is a handy crontab decoder.


The whole OS5 story does remind me a bit of this
Dilbert Comic Strip on 1995-09-17 | Dilbert by Scott Adams

1 Like

I am not in software. . . but I have have had encounters with “intellectual property”.

None of what you are writing is a surprise.
Of course, I came to similar conclusions after playing with the OS/5 phone app for about an hour.
I can well imagine how the original feature set for the OS/5 was developed. . . .I see they are opening a Beta for new media organization software. . . . .I can just imagine what that is like. Pretty sure this is heading in the exact OPPOSITE direction I want to go . . .and I don’t plan on wasting time proving that theory.

I am more than a bit perturbed by the “privacy invading garbage” that may be present in a “personal cloud” - - -

I would block this device from the internet at the router level; but in earlier testing I found that also blocked the device from accessing other subnets within my network. This facet (of my router, I presume) makes VPN access to the NAS a bit more problematic. I think I need to test this again for both OS/3 and OS/5.

Yeah. . . my default ASUS software allows the same thing.
I could assign the NAS a dedicated IP address, then DENY that address internet access.

So. . .I could still reach the NAS from any device in my house; I could reach the internet from any machine, but all the access to NAS from the WD apps was blocked.
HOWEVER. . .when I logged into my network using a OpenVPN, I noted that the PC was assigned an IP in a different subnet from the rest of the network. . . .and the PC could no longer reach the NAS . . without the internet block, I could reach the NAS.

I will look at this again later. I have not really tested any of this with the last two versions of the OS5 firmware - and I can’t remember if OS3 acted the same way. I will get to this during my lunch time meeting lull (gotta love 2020) tomorrow.

I’ve removed My Cloud OS5 from my PR4100 and installed a proper headless Debian-based development environment. The installation process is 100% automated, and fully customizable. As a bonus, it also installs Open Media Vault and Webmin, so I can tinker with them as well. Eventually, I plan to update the installation process to use a different drive partition scheme so the first drive bay won’t be used exclusively for the OS.

However, I need to put the finishing touches on my automated hardware control program written in C and designed to fully support the PR4100 and PR2100 x86_64 hardware, with fan control, LCD display support, and more. It’s actually pretty cool, but it’s only about 95% complete, and needs a few tweaks. And yes, I will eventually release it, source code and all. The PR4100 actually makes a decent headless Debian Linux development box, when the proper software is installed, but hearing the fan constantly running at full speed drives me crazy.

As for tinkering with My Cloud OS5, I may pick it up again at a later date, after it becomes more stable and the licensing terms have been corrected. In the mean time, I’ve decided to take the path less traveled. The concept of “rescue” firmware has always intrigued me, where I believe the WD “rescue” firmware leaves much to be desired, so I’m thinking about rolling my own, possibly from scratch.


On the PR4100 My Cloud devices >>>

Device local URL on:
Old OS:
New OS:

When you have multiple units, as in our business, when in the browser management interface of a unit, it is difficult to know which device you are managing, since the IP address is no longer in the browser URL as something recognizable.

It would be nice to be able to customize the top bar color or add the device name to it so that you can easily “at-a-glance” know which device you are managing; anything to differentiate the management interfaces from one and other.

The CSS (Cascading Style Sheets) of the dashboard are a mess, with hard-coded “style=” HTML tags only adding to the mix of problems.

For example, I noticed that the “Device Activity” section title of the dashboard didn’t look quite right, it’s too high and overlaps the box border. I also noticed that the “Cloud Access” section title didn’t look quite right either.

Closer examination of the CSS revealed that several properties were in fact fighting each other, and it appears that the developers tried to compensate, which only seems to have made things worse.

.b8 .WDlabelHeaderBoxMedium {
	position: relative;
	top: -4px;
	font-size: 18px !important;
	color: #85939c !important;

.m_header_div {
	float: left;
	line-height: 25px !important;
	height: 24px;
	width: 93%;
	margin-left: 5px;
	margin-top: 7px;
	background: url('/web/img/main_sprite.png?v=1.3.0-546') no-repeat scroll 0 -991px transparent !important;

#placeholder2_title {
	width: 95% !important;
	margin-top: 2px !important;
	font-size: 16px !important;
	color: #85939c !important;

Turning off “top: -4px;”, “margin-top: 7px;”, and “margin-top: 2px !important;” brought everything back where it should be, and while the change is subtle, it makes a difference.

To really see the difference, click one of the images to open it, then use the arrow buttons to quickly flip back and forth.

Hardcoded style=blah are never good and also just ugly

You think, that’s bad, check out: Disable HTTPS redirect, they’re using an image load event to execute a secure redirect!