The WD MyCloud I keep around is old enough that its hardware reads like a museum label. It still boots and serves files, but the CPU and memory are far behind anything current. A quick look at the system shows the situation:

bash-5.1# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 1 (v7l)
BogoMIPS : 50.00
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x4
CPU part : 0xc09
CPU revision : 1
processor : 1
model name : ARMv7 Processor rev 1 (v7l)
BogoMIPS : 50.00
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x4
CPU part : 0xc09
CPU revision : 1
Hardware : Marvell Armada 375 (Device Tree)
Revision : 0000
Serial : 0000000000000000
bash-5.1# free
              total        used        free      shared  buff/cache   available
Mem:          509136      203284      150808       19292      155044      244616
Swap:        1529832        1800     1528032
bash-5.1# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                53.4M     32.0M     18.6M  63% /
devtmpfs                248.6M      4.0K    248.6M   0% /dev
mdev                    248.6M      4.0K    248.6M   0% /dev
/dev/sda3               975.9M    246.6M    662.1M  27% /boot
/dev/sda7               976.1M      1.5M    948.5M   0% /usr/local/config
/dev/loop0              120.0M    120.0M         0 100% /usr/local/modules
tmpfs                     1.0M         0      1.0M   0% /mnt
tmpfs                    40.0M      5.3M     34.7M  13% /var/log
tmpfs                   100.0M     13.4M     86.6M  13% /tmp
/dev/md0p1              525.3M      4.0K    514.3M   0% /usr/local/upload
/dev/sda4               928.9M    110.1M    802.8M  12% /mnt/HD_a4
/dev/sda2                 1.8T    790.0G   1017.2G  44% /mnt/HD/HD_a2
bash-5.1#

SSH access works, but the BusyBox underneath is version 1.30.1, and the applet list is short on the tools I tend to use. The banner and function list make that clear:

bash-5.1# busybox
BusyBox v1.30.1 (2023-01-16 16:39:18 UTC) multi-call binary.

BusyBox is copyrighted by many authors between 1998-2015.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
   or: busybox --list[-full]
   or: busybox --show SCRIPT
   or: busybox --install [-s] [DIR]
   or: function [arguments]...

    BusyBox is a multi-call binary that combines many common Unix
    utilities into a single executable.  Most people will create a
    link to busybox for each function they wish to use and BusyBox
    will act like whatever it was invoked as.

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
bash-5.1#

That sent me looking for Entware, a software repository aimed at embedded devices. For this ARMv7 target it carries nearly 3,000 packages; the catalog is at https://bin.entware.net/armv7sf-k3.2/Packages.html. Installation on the WD MyCloud is straightforward.

Fetching the installer

root@acloud ~ # wget --no-check-certificate https://mirror.nju.edu.cn/entware/armv7sf-k3.2/installer/generic.sh
--2026-08-25 16:48:16--  https://mirror.nju.edu.cn/entware/armv7sf-k3.2/installer/generic.sh
Resolving mirror.nju.edu.cn... 210.28.130.3, 2001:da8:1007:4011::3
Connecting to mirror.nju.edu.cn|210.28.130.3|:443... connected.
WARNING: cannot verify mirror.nju.edu.cn's certificate, issued by 'CN=ZeroSSL ECC DV SSL CA 2,O=ZeroSSL GmbH,C=AT':
  Unable to locally verify the issuer's authority.
HTTP request sent, awaiting response... 200 OK
Length: 2765 (2.7K) [application/octet-stream]
Saving to: 'generic.sh'

generic.sh          100%[==========================>]   2.70K  --.-KB/s    in 0s

2026-08-25 16:48:16 (156 MB/s) - 'generic.sh' saved [2765/2765]

The script is small, and wget complains about the mirror certificate because the old system does not have the issuer chain. That is expected here; the download completes.

Running the installer

root@acloud ~ # sh ./generic.sh
Info: Checking for prerequisites and creating folders...
Warning: Folder /opt exists!
Warning: Folder /opt/bin exists!
Warning: If something goes wrong please clean /opt folder and try again.
Warning: Folder /opt/etc exists!
Warning: If something goes wrong please clean /opt folder and try again.
Warning: Folder /opt/lib/opkg exists!
Warning: If something goes wrong please clean /opt folder and try again.
Warning: Folder /opt/tmp exists!
Warning: If something goes wrong please clean /opt folder and try again.
Warning: Folder /opt/var/lock exists!
Warning: If something goes wrong please clean /opt folder and try again.
Info: Opkg package manager deployment...
--2026-08-25 16:54:34--  http://mirror.nju.edu.cn/entware/armv7sf-k3.2/installer/opkg
Resolving mirror.nju.edu.cn... 210.28.130.3, 2001:da8:1007:4011::3
Connecting to mirror.nju.edu.cn|210.28.130.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 752572 (735K) [application/octet-stream]
Saving to: '/opt/bin/opkg'

/opt/bin/opkg       100%[=========================================================================>] 734.93K  3.20MB/s    in 0.2s

2026-08-25 16:54:34 (3.20 MB/s) - '/opt/bin/opkg' saved [752572/752572]

--2026-08-25 16:54:34--  http://mirror.nju.edu.cn/entware/armv7sf-k3.2/installer/opkg.conf
Resolving mirror.nju.edu.cn... 210.28.130.3, 2001:da8:1007:4011::3
Connecting to mirror.nju.edu.cn|210.28.130.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 171 [application/octet-stream]
Saving to: '/opt/etc/opkg.conf'

/opt/etc/opkg.conf  100%[=========================================================================>] 171  --.-KB/s    in 0s

2026-08-25 16:54:35 (5.74 MB/s) - '/opt/etc/opkg.conf' saved [171/171]

Info: Basic packages installation...
Downloading http://bin.entware.net/armv7sf-k3.2/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
Installing entware-opt (227000-3) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-opt_227000-3_all.ipk
Installing libgcc (8.4.0-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libgcc_8.4.0-12_armv7-3.2.ipk
Installing libc (2.27-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libc_2.27-12_armv7-3.2.ipk
Installing libssp (8.4.0-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libssp_8.4.0-12_armv7-3.2.ipk
Installing libpthread (2.27-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpthread_2.27-12_armv7-3.2.ipk
Installing librt (2.27-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/librt_2.27-12_armv7-3.2.ipk
Installing libstdcpp (8.4.0-12) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libstdcpp_8.4.0-12_armv7-3.2.ipk
Installing entware-release (2025.05-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-release_2025.05-1_all.ipk
Installing zoneinfo-core (2025c-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-core_2025c-1_armv7-3.2.ipk
Installing zoneinfo-asia (2025c-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-asia_2025c-1_armv7-3.2.ipk
Installing zoneinfo-europe (2025c-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-europe_2025c-1_armv7-3.2.ipk
Installing findutils (4.10.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/findutils_4.10.0-1_armv7-3.2.ipk
Installing terminfo (6.4-3) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/terminfo_6.4-3_armv7-3.2.ipk
Installing libpcre2 (10.47-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpcre2_10.47-1_armv7-3.2.ipk
Installing grep (3.12-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/grep_3.12-1_armv7-3.2.ipk
Installing locales (2.27-9) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/locales_2.27-9_armv7-3.2.ipk
Installing opkg (2025.11.05~80503d94-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/opkg_2025.11.05~80503d94-1_armv7-3.2.ipk
Installing entware-upgrade (1.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-upgrade_1.0-1_all.ipk
Configuring libgcc.
Configuring libc.
Configuring libssp.
Configuring libpthread.
Configuring librt.
Configuring terminfo.
Configuring libpcre2.
Configuring grep.
Configuring locales.
Entware uses separate locale-archive file independent from main system
Creating locale archive /opt/usr/lib/locale/locale-archive
Adding en_EN.UTF-8
Adding ru_RU.UTF-8
You can download locale sources from http://bin.entware.net/other/i18n_glib227.tar.gz
You can add new locales to Entware using /opt/bin/localedef.new
Configuring entware-upgrade.
Upgrade operations are not required.
Configuring opkg.
Configuring zoneinfo-core.
Configuring zoneinfo-europe.
Configuring zoneinfo-asia.
Configuring libstdcpp.
Configuring entware-release.
Configuring findutils.
Configuring entware-opt.
Info: Congratulations!
Info: If there are no errors above then Entware was successfully initialized.
Info: Add /opt/bin & /opt/sbin to $PATH variable
Info: Add "/opt/etc/init.d/rc.unslung start" to startup script for Entware services to start
Info: Found a Bug? Please report at https://github.com/Entware/Entware/issues

The installer noticed that /opt and several subdirectories already existed and printed warnings for each one. It did not stop; it deployed opkg, pulled the base packages, and configured them. The warning text suggests clearing /opt and rerunning if something goes wrong.

Verifying the installation

root@acloud ~ # cat /opt/etc/entware_release
PRETTY_NAME="Entware 2025.05"
NAME="Entware"
VERSION_ID="2025.05"
VERSION="2025.05 (sync with OpenWrt)"
ID=entware
HOME_URL="https://entware.net/"
SUPPORT_URL="https://github.com/Entware/Entware/discussions/"
BUG_REPORT_URL="https://github.com/Entware/Entware/issues/"
Build summary:
Linux Kernel 3.2.40
arch=arm
cpu_type=cortex-a9
cpu_subtype=unknown
float=soft
binutils_version="2.34"
gcc_version="8.4.0"
gcc_flags="-O2 -pipe -mtune=cortex-a9 -fno-caller-saves -mfloat-abi=soft"
libc_type=glibc
libc_version="2.27"

The release file confirms Entware 2025.05, built for ARMv7 with glibc 2.27 and GCC 8.4.0.

Putting Entware on the PATH

root@acloud ~ # echo 'export PATH=/opt/bin:/opt/sbin:$PATH' >> ~/.bashrc
root@acloud ~ # source ~/.bashrc
root@acloud ~ # opkg version
opkg: unknown sub-command version
usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:
Package Manipulation:
    update      Update list of available packages
    upgrade <pkgs>      Upgrade packages
    install <pkgs>      Install package(s)
    configure <pkgs>        Configure unpacked package(s)
    remove <pkgs|regexp>        Remove package(s)
    flag <flag> <pkgs>      Flag package(s)
    <flag>=hold|noprune|user|ok|installed|unpacked (one per invocation)
... ...

opkg version is not a valid subcommand in this build, so it prints the usage block instead of a version string. The important part is that the binary is now found without a full path.

Switching opkg to a local mirror

root@acloud ~ # cd /opt/etc/
root@acloud etc # cp opkg.conf opkg.conf.bak
root@acloud etc # sed -i 's|http://bin.entware.net|https://mirror.nju.edu.cn/entware|g' /opt/etc/opkg.conf
root@acloud etc # cat opkg.conf
src/gz entware https://mirror.nju.edu.cn/entware/armv7sf-k3.2
dest root /
dest ram /opt/tmp
lists_dir ext /opt/var/opkg-lists
option tmp_dir /opt/tmp
arch all 100
arch armv7-3.2 160
root@acloud etc #

The original opkg.conf points at bin.entware.net; the sed line swaps in the mirror at mirror.nju.edu.cn. Keeping a backup makes it easy to revert.

With the index pointed at the mirror, update it and install the utilities that BusyBox lacks:

# Update the package list
root@acloud etc # opkg update
Downloading http://mirror.nju.edu.cn/entware/armv7sf-k3.2/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
root@acloud ~ # opkg list|wc -l
3021
# Install common tools
root@acloud etc # opkg install \
coreutils-sort \
coreutils-du \
coreutils-ls \
htop \
tree \
vim \
tmux \
bash \
curl \
wget

The package list came back with 3,021 entries. After installation, a quick check of two of the tools:

root@acloud ~ # htop -V
htop 3.4.1
root@acloud bin # curl -V
curl 8.15.0 (arm-openwrt-linux-gnu) libcurl/8.15.0 OpenSSL/3.5.5 zlib/1.3.1 nghttp2/1.66.0
Release-Date: 2025-07-16
Protocols: file ftp ftps http https imap imaps mqtt pop3 pop3s rtsp smtp smtps tftp
Features: alt-svc HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz SSL threadsafe

Starting Entware at boot

Entware's services are started by rc.unslung. There are two common ways to make that happen at boot; either append the call to /etc/rc.local or create an init script.

## Method 1
root@acloud etc # echo '/opt/etc/init.d/rc.unslung start' >> /etc/rc.local
## Method 2
cat > /etc/init.d/entware << 'EOF'
#!/bin/sh
/opt/etc/init.d/rc.unslung start
EOF
chmod +x /etc/init.d/entware

Adding Chinese locales

The base install creates a locale archive with English and Russian. To add Chinese, grab the locale sources, unpack them, and build zh_CN.UTF-8 with the localedef.new that Entware ships.

root@acloud Public # wget http://mirrors.nju.edu.cn/entware/other/i18n_glib227.tar.gz
--2026-08-25 17:18:52--  http://mirrors.nju.edu.cn/entware/other/i18n_glib227.tar.gz
Resolving mirrors.nju.edu.cn... 210.28.130.3, 2001:da8:1007:4011::3
Connecting to mirrors.nju.edu.cn|210.28.130.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4560959 (4.3M) [application/octet-stream]
Saving to: 'i18n_glib227.tar.gz'

i18n_glib227.tar.gz 100%[=========================================================================>]   4.35M  7.91MB/s    in 0.5s

2026-08-25 17:18:53 (7.91 MB/s) - 'i18n_glib227.tar.gz' saved [4560959/4560959]

root@acloud Public # tar zxf i18n_glib227.tar.gz
root@acloud Public # cd i18n/locales/
root@acloud locales # /opt/bin/localedef.new -i zh_CN -f UTF-8 zh_CN.UTF-8
root@acloud locales # locale.new -a
C
POSIX
en_US.utf8
ru_RU.utf8
zh_CN.utf8
root@acloud locales #

After that, locale.new -a listed zh_CN.utf8 alongside the existing locales. The hardware is still slow, but the shell now has htop, tree, vim, tmux, bash, curl, wget, and GNU coreutils, and the environment is no longer limited to the old BusyBox applets.