Home Chinoppo M9201: Accessing Debian Bullseye network shares

Chinoppo M9201: Accessing Debian Bullseye network shares

I recently got an M9201, a chinese clone of the Oppo UDP-203 and successor of the M9702.

Getting network shares from a recent Debian Bullseye installation to work was not as easy as I expected.
The player refused to connect via Samba and my NFS shares appeared empty.

Fortunately I managed to solve both issues.
The solutions should also work with the Original Oppo, M9702, M9203, M9205 and other clones, since they all run the same firmware.


Samba should have been pretty straightforward. The player only supports SMBv1 which is disabled by default in modern Samba versions, so we just have to enable it with server min protocol = NT1.

What tripped me up here is that it also requires NTLMv1 authentication, modern Samba versions default ntlm auth to ntlmv2-only, and this is never mentioned in documentation, forum posts or guides on enabling SMBv1.

So, to make it work just add or edit these 2 settings in the [global] section of your Samba configuration to enable enable SMBv1 and NTLMv1:

    server min protocol = NT1
    ntlm auth = ntlmv1-permitted

Reload the Samba configuration with sudo systemctl reload smbd and you are good to go.


The real trouble starts if you want to use NFS, which is reported to run more reliably with these players.

The NFS client of the player only supports 32 bit inodes, modern file systems can and some will use 64 bit inodes by default (e.g. XFS, ZFS).
The result of this is that some files and directories appear missing or empty when browsing the share.

For details on this, check out this post by MJ Rutter: https://www.mjr19.org.uk/sw/inodes64.html

One suboptimal solution mentioned in the post is to set nfs.enable_ino64=0 on the server, but this disables them for all exports and can cause files to appear duplicated and possibly confuse 64 bit clients.

The other way I found is to mount your media directory with mergerfs and one of the inodecalc options that generate 32 bit inodes.
The good thing with this method is that it will only affect the mergerfs mount and its export, so everything else will keep working as expected.

Install mergerfs

Install the latest mergerfs release, there are ready to install .rpm and .deb packages for RHEL, Fedora, Debian and Ubuntu. Otherwise follow the build instructions: https://github.com/trapexit/mergerfs#build--update

For 64bit Debian Bullseye, at the time this post was written:

wget https://github.com/trapexit/mergerfs/releases/download/2.32.6/mergerfs_2.32.6.debian-bullseye_amd64.deb
sudo dpkg -i mergerfs_2.32.6.debian-bullseye_amd64.deb
rm mergerfs_2.32.6.debian-bullseye_amd64.deb

NOTE: for mounting via fstab to work you must have mount.fuse installed. For Ubuntu/Debian it is included in the fuse package.

Configure mergerfs

First create a mount point for mergerfs, e.g. /mnt/media32.

sudo mkdir /mnt/media32

Then mount your media directory with mergerfs, the recommended default options are allow_other,use_ino,cache.files=off,dropcacheonclose=true.
I personally also added ro for read-only, because the player should never need to write to the share.

Additionally we specify the inodecalc option to generate 32 bit inodes. The best option to use with NFS is probably path-hash32, but hybrid-hash32 worked for me as well.
The differences are explained here https://github.com/trapexit/mergerfs#inodecalc

sudo mergerfs -o allow_other,use_ino,cache.files=off,dropcacheonclose=true,inodecalc=path-hash32,ro \
    /path/to/your/media /mnt/media32

You should now be able to see all your media files accessible in /mnt/media32

One thing to note is that you need to specify an fsid in /etc/exports to export FUSE mounts. For example, my export:

/mnt/media32 -fsid=69,async,no_subtree_check,ro

I’m exporting read-only ro here as well, just like the mount previously. We can also use async to improve performance because we will never write to the share.

To automatically mount on startup, add the mount to /etc/fstab as follows:

/path/to/your/media /mnt/media32 fuse.mergerfs allow_other,use_ino,cache.files=off,dropcacheonclose=true,inodecalc=path-hash32,ro 0 0

Re-export the shares with sudo exportfs -ra and all files and directories should now be visible from the player.

This post is licensed under CC BY 4.0 by the author.