Set up the Synology DiskStation DS411j to support UTF-8
Note: I recently purchased a Synology DiskStation DS411j & I’m putting up posts about things I figure out. This is part of that series.
By default, the Synology DiskStation DS411j doesn’t support UTF-8 on the terminal. The GUI is a different story. I used the GUI to create a test file named this:
•test
Sure enough, it looked fine in the GUI, but when I looked at via the command line, I saw this:
•test
Ugh. Why this isn’t set up by default is beyond me, but here’s what you have to do to fix this. It’s not awful, but it’s a lot more work than we should have to do.
Begin by finding out which CPU your Synology DiskStation uses.
Head over to the SourceForge page that Synology has created for the Synology NAS GPL Source (yep, they’re good open source citizens, & they publish their source) & find the right link for the DSM Tool Chains. In my case, it’s the DSM 3.2 Tool Chains. On the following page, click on the link for the processor found in your DiskStation; for me, it’s the Marvell 88F628x Linux 2.6.32 (I had to follow links to figure out which one; it’s not obvious). Finally the file to download is there: gcc421_glibc25_88f6281-GPL.tgz. cd
into a temp directory & download that file (it’s pretty big, btw—about 109 MB):
> cd /volume1/@tmp
> wget http://downloads.sourceforge.net/project/dsgpl/DSM%203.2%20Tool%20Chains/Marvell%2088F628x%20Linux%202.6.32/gcc421_glibc25_88f6281-GPL.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fdsgpl%2Ffiles%2FDSM%25203.2%2520Tool%2520Chains%2FMarvell%252088F628x%2520Linux%25202.6.32%2F&ts=1326082934&use_mirror=cdnetworks-us-2
Extract the source code you downloaded:
> tar -zvxf gcc421_glibc25_88f6281-GPL.tgz
Create a locale
directory on the DiskStation:
> mkdir /usr/lib/locale
Copy 2 files (locale
& localedef
) & a directory (i18n
) to their proper locations1:
> cp /volume1/@tmp/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/bin/locale /opt/bin/
> cp /volume1/@tmp/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/bin/localedef /opt/bin/
> cp -R /volume1/@tmp/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/share/i18n/ /usr/share
Test to see if locale
works & see what the current locale is:
> locale -a
C
POSIX
Now define the new locale with UTF-8:
> /opt/bin/localedef -c -f UTF-8 -i en_US en_US.UTF-8
Test to make sure the new locale has taken:
> /opt/bin/locale -a
C
POSIX
en_US.utf8
Add the following lines to /etc/profile
to use UTF-8:
# Added by RSG 2012 0109
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
export LANG LC_ALL
Restart the DiskStation:
> reboot
After the DiskStation is back up, test again to make sure UTF-8 is now the law of the land:
> locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Yup, UTF-8 is like kudzu—it’s everywhere on the DiskStation!
Let’s take another look at that test file I created that started this whole thing. Uh oh—when I went back & viewed the file I’d created initially, I still got the garbled filename: •test
. That’s because it had been created before UTF-8 was set up as the locale.
I created a new file named •test
using the GUI & looked at it on the CLI:
> ls
•test
Perfect. The lesson? Set up the locale before you begin copying any files with UTF-8 characters in their names. I’m going to put that in its own paragraph & bold it so you notice it & take heed:
Set up the locale before you begin copying any files with UTF-8 characters in their names.
As I said, it’s not super hard to add the locale & set things to UTF-8, but I still don’t understand why buyers of the Synology DiskStation need to do it in the first place. Shouldn’t the OS on the DiskStation support UTF-8 out of the box?
-
In setting up a friend’s DS212j, I moved the
locale
&localedef
executables to a different location because/opt
didn’t even exist. I checked my PATH:> echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
Noting that
/usr/local/bin
was in my PATH, I decided to use that. However…> ls /usr/local cups doc etc
Argh!
/usr/local/bin
doesn’t exist either! Oh well, that’s easy to fix:> mkdir /usr/local/bin
Finally, I did my copy this way:
> cp /volume1/@tmp/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/bin/locale* /usr/local/bin/