**WARNING**: This procedure is horrible. For a "real" native Debian installation, take a look at http://www.cyrius.com/debian/orion/d-link/dns-323/install.html . This page described how to get Debian natively running on your DNS-323. NOTE: If you follow this procedure, the DNS-323 will no longer run its normal operation. It will only run debian. The function can be restored, details at the end. NOTE2: You can brick your unit if you are not careful, and maybe even if you are careful. As long as you don't overwrite the mtdblock4 device, you *should* be able to recover your system, but this procedure has not been well tested. MAKE SURE to save off your old MTD devices someplace safe so you can restore them if necessary. You will need: * A DNS-323 with a serial port as described in [[hardware:serial]]. You must upgrade the firmware to 1.03 * A running Debian system * Fast Internet access (not strictly required, but very helpful) * Running kermit from http://www.columbia.edu/kermit (On debian just execute apt-get install ckermit and use the command kermit without the path to the executable). Note that you can use minicom, but you will not be able to transfer kernels to uboot later if you don't have it. You need a minimal debian image installed on a machine that can act as an NFS server. You can get http://dev.skcserver.de/dns323/etch.tar, I think, but I have not tried it. This is a full minimal image, but I'm going to document using cdebootstrap, though, since the above link may go away and this is more general. You need an existing debian system to do this, and you need root access and need to be logged in as root. i2:~# apt-get install cdebootstrap Reading package lists... Done Building dependency tree... Done cdebootstrap is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. (Note - I already had this installed) i2:~# mkdir dns i2:~# cd dns i2:~/dns# cdebootstrap -aarm --foreign etch etch ftp://ftp.us.debian.org/debian P: Retrieving Release.gpg P: Retrieving Release P: Parsing Release P: Retrieving Release . . . P: Extracting util-linux P: Writing hosts P: Writing resolv.conf I: Second stage installer is available as /sbin/cdebootstrap-foreign or /sbin/init The "--foreign" option tell cdebootstrap to only perform unpacking action of the needed packages. All the operations that need to be executed on the destination machine will be executed after the first booting by executing the "fake" init. Now create the rtc and ttyS0 devices as to prevent some errors i2:~# cd etch/dev i2:~/dns/etch/dev# MAKEDEV rtc i2:~/dns/etch/dev# mknod ttyS0 c 4 64 Set up fstab: i2:~/dns/etch/etc# vi fstab Let's use: # #/dev/sda1 none swap sw 0 0 #/dev/sdb1 none swap sw 0 0 proc /proc proc defaults 0 0 #/dev/md0 / ext3 defaults 0 2 You can add other stuff later, but that will be enough to get you going. We will uncomment these once we get them on the disk. And prepare the nfs export i2:~/dns/etch# vi /etc/exports Add the following to /etc/exports: /root/dns/etch *(rw,no_root_squash,sync,subtree_check) Now let other mount it through NFS: i2:~/dns/etch# exportfs -r Now you will be able to mount the root filesystem. The default kernel on the dns-323 is able to mount an NFS filesystem. Now let's hook to the serial port. Mine is on /dev/ttyS0, but it depends on where you have it plugged in. root@desk:~# ~cminyard/kermit -l /dev/ttyS0 -b 115200 C-Kermit 8.0.209, 17 Mar 2003, for Linux Copyright (C) 1985, 2003, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/root/) C-Kermit>set carrier-watch off (/root/) C-Kermit>c Connecting to /dev/ttyS0, speed 115200 Escape character: Ctrl-\ (ASCII 28, FS): enabled Type the escape character followed by C to get back, or followed by ? to see other options. ---------------------------------------------------- Note: Before to connect correctly to the nas, i need to execute on the kermit command line these two command, "set flow xon/xoff" and "set stop-bits 1". Personally i prefer minicom as you don't need kermit if you dont'have to upload a binary file, and minicom give me less difficulties than kermit. Now power the system on, and quickly type the space then "1" keys. This will fall into uboot. Then we will boot on the NFS partition we just created and exported. Substitute your IP address with the one I use. ** LOADER ** ** MARVELL BOARD: RD-88F5181-POS-NAS LE U-Boot 1.1.1 (Nov 13 2006 - 14:01:34) Marvell version: 1.4.2 DRAM CS[0] base 0x00000000 size 64MB DRAM Total size 64MB [8192kB@ff800000] Flash: 8 MB Addresses 20M - 0M are saved for the U-Boot usage. Mem malloc Initialization (20M - 16M): Done *** Warning - bad CRC, using default environment Soc: MV88F5181 Rev 3 CPU: ARM926 (Rev 0) running @ 500Mhz SysClock = 166Mhz , TClock = 166Mhz Init usb device. PCI 0: PCI Express Root Complex Interface PCI 1: Conventional PCI, speed = 33000000 Hit any key to stop autoboot: 0 Marvell>> Boot the thing using NFS. Marvell>>setenv bootargs root=/dev/nfs nfsroot=192.168.27.126:/root/dns/etch ip=dhcp console=ttyS0,115200 Marvell>> bootm FF820000 ## Booting image at ff820000 ... Image Name: Linux-2.6.12.6-arm1 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1518100 Bytes = 1.4 MB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK OK Starting kernel ... Uncompressing Linux..................................................................................................... done, booting the kernel. Linux version 2.6.12.6-arm1 (cminyard@i2) (gcc version 3.3.3) #7 Sat Sep 8 18:42:37 CDT 2007 CPU: ARM926EJ-Sid(wb) [41069260] revision 0 (ARMv5TEJ) CPU0: D VIVT write-back cache CPU0: I cache: 32768 bytes, associativity 1, 32 byte lines, 1024 sets CPU0: D cache: 32768 bytes, associativity 1, 32 byte lines, 1024 sets Machine: MV-88fxx81 Using UBoot passing parameters structure Sys Clk = 166000000, Tclk = 166000000 - Warning - This LSP release was tested only with U-Boot release 1.7.3 Memory policy: ECC disabled, Data cache writeback Built 1 zonelists Kernel command line: root=/dev/nfs nfsroot=192.168.27.126:/root/dns/etch ip=dhcp console=ttyS0,115200 . . . IP-Config: Got DHCP answer from 0.0.0.0, my address is 192.168.27.54 IP-Config: Complete: device=egiga0, addr=192.168.27.54, mask=255.255.255.0, gw=192.168.27.254, host=192.168.27.54, domain=minyard.local, nis-domain=(none), bootserver=0.0.0.0, rootserver=192.168.27.126, rootpath= md: Autodetecting RAID arrays. md: autorun ... md: ... autorun DONE. Looking up port of RPC 100003/2 on 192.168.27.126 Looking up port of RPC 100005/1 on 192.168.27.126 VFS: Mounted root (nfs filesystem). Freeing init memory: 112K Adding `local diversion of /sbin/init to /sbin/init.REAL' tar: ./postinst: time stamp 2007-01-07 12:14:28 is 212388557.923672 s in the future tar: ./preinst: time stamp 2007-01-07 12:14:28 is 212388557.863465 s in the future If the device is new and you never have set the clock, you will probably have some little problem due to a wrong clock setting. If not, just don't execute the related command. Now check frequently in "dns/etch/etc" if the file inittab as been extracted, and as soon as you find it edit the file as follow i2:~/dns/etch/etc# vi inittab Find the line that says: #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100 and turn it into: T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100 Wait until cdebootstrap have terminated it's work. This will take some times. Removing `local diversion of /sbin/init to /sbin/init.REAL' INIT: version 2.86 booting Activating swap...done. Setting the system clock.. Cleaning up ifupdown.... Loading kernel modules...FATAL: Could not load /lib/modules/2.6.12.6-arm1/modules.dep: No such file or directory Loading device-mapper support. Checking file systems...fsck 1.40-WIP (14-Nov-2006) done. Setting kernel variables...done. Mounting local filesystems...done. Activating swapfile swap...done. Setting up networking.... Configuring network interfaces...done. INIT: Entering runlevel: 2 Starting system log daemon: syslogd. Starting kernel log daemon: klogd. * Not starting internet superserver: no services enabled. Starting periodic command scheduler: crond. Debian GNU/Linux 4.0 lynk ttyS0 lynk login: If you modify "inittab" too late you will not find the login prompt, and you'll have to repeat the boot process. Only the boot process using the same method as before, getting the u-boot prompt and setting the bootargs variable. When you get the login prompt login as "root", and first of all set the clock to an acceptable date. 192:~# date --set 2008-10-17 Create the remaining needed devices 192:~# cd /dev 192:/dev# MAKEDEV generic-arm 192:/dev# MAKEDEV md These following for the flash driver. You really do not want to overwrite mtdblock4, since that is uboot, so we make it read-only. As long as you have a serial port and uboot, you can recover the device. 192:/dev# mknod mtdblock0 b 31 0 192:/dev# mknod mtdblock1 b 31 1 192:/dev# mknod mtdblock2 b 31 2 192:/dev# mknod mtdblock3 b 31 3 192:/dev# mknod mtdblock4 b 31 4 192:/dev# chmod 660 mtdblock* 192:/dev# chmod 440 mtdblock4 Now we need to save off the old MTD files, in case we need to restore them later. 192:# cd /root/ 192:# mkdir oldmtd 192:# cd oldmtd/ 192# dd if=/dev/mtdblock0 of=mtd0 128+0 records in 128+0 records out 65536 bytes (66 kB) copied, 0.076184 seconds, 860 kB/s 192:# dd if=/dev/mtdblock1 of=mtd1 128+0 records in 128+0 records out 65536 bytes (66 kB) copied, 0.076254 seconds, 859 kB/s 192:# dd if=/dev/mtdblock2 of=mtd2 3072+0 records in 3072+0 records out 1572864 bytes (1.6 MB) copied, 1.71174 seconds, 919 kB/s 192:# dd if=/dev/mtdblock3 of=mtd3 12672+0 records in 12672+0 records out 6488064 bytes (6.5 MB) copied, 6.89164 seconds, 941 kB/s 192:# dd if=/dev/mtdblock4 of=mtd4 384+0 records in 384+0 records out 196608 bytes (197 kB) copied, 0.214457 seconds, 917 kB/s The most interesting ones are mtd2 (kernel) and mtd3 (filesystem) Now save off the old filesystem. You will need some files from it later. It's in a uboot image, so we have to play around a little to extract it. 192:# cd .. 192:# dd if=oldmtd/mtd3 of=olddnsfs.gz bs=64 skip=1 101375+0 records in 101375+0 records out 6488000 bytes (6.5 MB) copied, 6.6507 seconds, 976 kB/s 192:# gzip -d olddnsfs.gz gzip: olddnsfs.gz: decompression OK, trailing garbage ignored 192:# mount -o loop olddnsfs /mnt/ EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended 192:# mkdir dns323-oldfs 192:# cp -a /mnt/* dns323-oldfs/ 192:# umount /mnt First get the mac_read command so we can properly set our MAC address: 192:~# cd dns323-oldfs/ 192:~/dns323-oldfs# mount -o loop image.cfs /mnt 192:~/dns323-oldfs# cp /mnt/sbin/mac_read /usr/local/sbin/ 192:~/dns323-oldfs# chmod +x /usr/local/sbin/mac_read 192:~/dns323-oldfs# cp ~/dns323-oldfs/lib/ld-uClibc.so.0 /lib 192:~/dns323-oldfs# cp ~/dns323-oldfs/lib/libc.so.0 /lib 192:~/dns323-oldfs# chmod +x /lib/ld-uClibc.so.0 192:~/dns323-oldfs# chmod +x /lib/libc.so.0 Now set up networking: 192:~# cd /etc/network 192:/etc/network# vi interfaces The exact format of the interfaces file depends on your configuration. Let's use: auto lo #auto lo egiga0 iface lo inet loopback iface egiga0 inet dhcp pre-up /usr/local/sbin/mac_read We'll replace the first line with the commented out line later, so it won't mess you up if you reboot. We won't start it up yet, we'll wait, as it will mess up our NFS mount. If you do an ifconfig, you'll notice that the mac address is 00:00:00:00:00:00. This will be fixed by mac_read sometime later. Now we'll set up fan control. 192:/# cd /etc 192:/etc# vi rc.local Add the following before the "exit 0" in rc.local: echo "Starting fan control" export PATH=/usr/local/sbin:$PATH fan.script fancontrol & And do: 192:/etc# cp ~/dns323-oldfs/sbin/fan.script /usr/local/sbin/ 192:/etc# cp /mnt/sbin/fancontrol /usr/local/sbin 192:/etc# cp /mnt/sbin/fanspeed /usr/local/sbin/ Now lets create some things on the disk. I'll demo creating a / filesystem of 5gb on a RAID 1 volume, and an LVM you can create whatever you want to with. For some odd reason D-Link didn't compile the scsi disk driver into the kernel. No matter, easy enough to handle: 192:~# mkdir /lib/modules/2.6.12.6-arm1 192:~# cp /mnt/scsi/sd_mod.ko /lib/modules/2.6.12.6-arm1/ 192:~# depmod -a 192:~# modprobe sd_mod SCSI device sda: 490234752 512-byte hdwr sectors (251000 MB) SCSI device sda: drive cache: write back SCSI device sda: 490234752 512-byte hdwr sectors (251000 MB) SCSI device sda: drive cache: write back sda: sda1 sda2 sda4 Attached scsi disk sda at scsi1, channel 0, id 0, lun 0 192:/etc# fdisk /dev/sda The number of cylinders for this disk is set to 30515. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sda: 251.0 GB, 251000193024 bytes 255 heads, 63 sectors/track, 30515 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 66 530113+ 82 Linux swap / Solaris /dev/sda2 93 30515 244372747+ 83 Linux /dev/sda4 67 92 208845 83 Linux Partition table entries are not in disk order Command (m for help): d Partition number (1-4): 2 Command (m for help): d Partition number (1-4): 4 Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (67-30515, default 67): Using default value 67 Last cylinder or +size or +sizeM or +sizeK (67-30515, default 30515): +5G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (676-30515, default 676): Using default value 676 Last cylinder or +size or +sizeM or +sizeK (676-30515, default 30515): Using default value 30515 Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): fd Changed system type of partition 2 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): fd Changed system type of partition 3 to fd (Linux raid autodetect) Command (m for help): p Disk /dev/sda: 251.0 GB, 251000193024 bytes 255 heads, 63 sectors/track, 30515 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 66 530113+ 82 Linux swap / Solaris /dev/sda2 67 675 4891792+ fd Linux raid autodetect /dev/sda3 676 30515 239689800 fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. SCSI device sda: 490234752 512-byte hdwr sectors (251000 MB) SCSI device sda: drive cache: write back sda: sda1 sda2 sda3 SCSI device sda: 490234752 512-byte hdwr sectors (251000 MB) SCSI device sda: drive cache: write back sda: sda1 sda2 sda3 Syncing disks. If you have two disks, do the same (starting with the fdisk command) for sdb Now we need some debian packages to install. First, many routers will not route 00:00:00:00:00:00 MAC addresses, so do: 192:/etc# mac_read MAC = 00:19:5B:EC:E7:1B egiga0: mac address changed egiga0: link down 192:/etc# egiga0: link up<5>, full duplex<5>, speed 100 Mbps<5> Now set up apt: 192:/etc# vi /etc/apt/sources.list Set it to: # See sources.list(5) for more information, especialy # Remember that you can only use http, ftp or file URIs # CDROMs are managed through the apt-cdrom tool. deb http://http.us.debian.org/debian stable main contrib non-free deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free deb http://security.debian.org stable/updates main contrib non-free # Uncomment if you want the apt-get source function to work #deb-src http://http.us.debian.org/debian stable main contrib non-free #deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free Edit ''/etc/resolv.conf'' and point it to your DNS server. Look on your running system to see what it should be. Edit ''/etc/hostname'' and put your machine's name in it. Edit ''/etc/hosts'' and add your host, like (replacing the names with your name, but leave localhost alone): 127.0.0.1 server.minyard.local server localhost Now update apt: 192:/etc# apt-get update This may take some time and generates some output. It may generate an error on a couple of gets, this is probably not a big deal. Let's set up the initrd now: 192:/etc# cd /initrd 192:/initrd# apt-get install busybox 192:/initrd# mkdir bin dev lib proc root 192:/initrd# cp /lib/ld-linux.so.2 lib 192:/initrd# cp /lib/libc.so.6 lib/ 192:/initrd# cp /lib/libgcc_s.so.1 lib/ 192:/initrd# cp /lib/libcrypt.so.1 lib 192:/initrd# cp /lib/libm.so.6 lib 192:/initrd# cp /bin/busybox bin 192:/initrd# cp /sbin/pivot_root bin/ 192:/initrd# cp /sbin/insmod bin/ 192:/initrd# ln -s busybox bin/sh 192:/initrd# cp -a /dev/console /dev/md0 /dev/md1 /dev/null /dev/ram0 /dev/tty /dev/ttyS0 /dev/zero /dev/sda2 /dev/sda3 /dev/sdb2 /dev/sdb3 dev 192:/initrd# cp /lib/modules/2.6.12.6-arm1/sd_mod.ko . 192:/initrd# vi bin/init Put the following in bin/init: #!/bin/sh echo "/init script running..." export init=/bin/init export rootmnt=/root echo -n " [*] mounting /proc..." mount -t proc proc /proc || die "failed to mount /proc" echo "done" # Standard kernel from D-Link doesn't have sd_mod built in. echo -n " [*] loading sd_mod..." insmod /sd_mod.ko echo "done" echo -n " [*] assembling RAID arrays..." echo 'DEVICE /dev/sda2 /dev/sda3 /dev/sdb2 /dev/sdb3' >mdadm.conf mdadm --examine --scan --config=partitions >>mdadm.conf mdadm --assemble --scan --config=mdadm.conf echo "done" echo -n " [*] mounting /root..." mount /dev/md0 ${rootmnt} echo "done" echo -n " [*] Cleaning up..." # Clean up umount -l /proc echo "done" # Pivot Root echo " [*] Switching to real root fs..." # Don't pass in args, they are bogus. cd /root pivot_root . old_root exec /usr/sbin/chroot . sh -c 'umount /old_root; /usr/local/sbin/freeramdisk /dev/ram0; exec /sbin/init' /dev/console 2>&1 #shouldn't get here! echo "switch_root must have failed" exec /bin/sh And make it executable: 192:/initrd# chmod +x bin/init You will need to install mkimage from {{howto:mkimage.gz}} into ''/usr/local/bin'' after un-gzipping it. Make sure to ''chmod +x' 'the file, too, so it will be executable. The sources are available as part of the uboot code from D-Link, but I've pared it down in {{howto:mkimage.tgz}}. You should also install freeramdisk from {{howto:freeramdisk.gz}} into ''/usr/local/sbin'' after un-gzipping it. chmod this one, too. The source is in {{howto:freeramdisk.c.gz}}. Now create the tools to build the init ramdisk: 192:/initrd# cd /root 192:/initrd# vi make_uinitrd Set it to: rm -f initrd.img.gz dd if=/dev/zero of=initrd.img bs=4096 count=1024 mke2fs -F initrd.img mkdir -p mnt mount -o loop initrd.img mnt cp -a /initrd/* mnt/ umount mnt gzip initrd.img mkimage -a 0x800000 -e 0x800000 -n 'boot ramdisk' -A arm -O linux -T ramdisk -C gzip -d initrd.img.gz initrd.uImage And make it executable 192:~# chmod +x make_uinitrd Now get the mdadm package: 192:/etc# apt-get install mdadm If it asks you for arrays needed for the root filesystem, you can say "None", and not to start MD arrays automatically. Now put mdadm onto the initrd: 192:~# cp /sbin/mdadm /initrd/bin/ Now you can create the RAID arrays. If you have one disk, I still recommend using RAID so you can mirror the second disk if you add it. For two disks: 192:/etc# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2 192:/etc# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3 If you have one disk: 192:/etc# mdadm --create /dev/md0 --level=1 --force --raid-devices=1 /dev/sda2 192:/etc# mdadm --create /dev/md1 --level=1 --force --raid-devices=1 /dev/sda3 It may ask you questions, just tell it "yes". Now create the filesystem on /dev/md0. 192:/etc# mke2fs -j /dev/md0 We will make md1 into an LVM later. Now copy everything into the new filesystem: 192:/# umount /mnt 192:/# cd /mnt 192:/mnt# mkdir hd_root nfs_root 192:/mnt# mount /dev/md0 hd_root kjournald starting. Commit interval 5 seconds EXT3 FS on md0, internal journal EXT3-fs: mounted filesystem with ordered data mode. 192:/mnt# mount -o bind / nfs_root 192:/mnt# cp -a nfs_root/* hd_root 192:/mnt# mkdir hd_root/old_root Now let's edit the fstab on the disk: 192:/mnt# vi hd_root/etc/fstab Remove the comments from the /dev/sda1 and /dev/md0 lines. If you have a second disk, you can remove the comment form /dev/sdb1. We can also edit the network config: 192:/mnt# vi hd_root/etc/network/interfaces Delete the line that says "auto lo" and uncomment the next "auto" line. Now we are ready to boot set up to boot from disk. Create the initrd: 192:/mnt# cd /root 192:~# ./make_uinitrd 1024+0 records in 1024+0 records out 4194304 bytes (4.2 MB) copied, 2.7383 seconds, 1.5 MB/s mke2fs 1.40-WIP (14-Nov-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 1024 inodes, 4096 blocks 204 blocks (4.98%) reserved for the super user First data block=1 Maximum filesystem blocks=4194304 1 block group 8192 blocks per group, 8192 fragments per group 1024 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. Image Name: boot ramdisk Created: Sat Sep 15 09:05:22 2007 Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 1227711 Bytes = 1198.94 kB = 1.17 MB Load Address: 0x00800000 Entry Point: 0x00800000 Now write the initrd into the flash and reboot: 192:~# dd if=/root/initrd.uImage of=/dev/mtdblock3 192:~# reboot You should boot from disk now. Do not do the "space" "1" thing, you want to boot using the initrd you just put onto the disk. Log in as root, set the root password, and you are in a fully functional debian system. Not much will be installed, that will depend on your needs. 64MB is plenty of room to run a server, though you may run into problems if you run programs that use X. A few other things you might want to do: Provide access to the temperature sensor: server:~# cd ~/dns323-oldfs server:~/dns323-oldfs# mount -o loop image.cfs /mnt/ server:~/dns323-oldfs# cp /mnt/sbin/temperature /usr/local/sbin/ server:~/dns323-oldfs# temperature temperature - query and set the temperature sensor Usage: temperature [function] Functions: h - show this help w [1,2] degree - set temperature degree in register 1:Thyst 2:Tos g [0~2] - get temperature in register 0:temperature 1:Thyst 2:Tos server:~/dns323-oldfs# temperature g 0 Temperature type : Centigrade : get temperature = 46 server:~/dns323-oldfs# umount /mnt I'm not sure what all the sensor values mean here. If you want to go back to the normal DNS-323 software, just restore the contents of /dev/mtdblock3: 192:~# dd if=/root/oldmtd/mtd3 of=/dev/mtdblock3 The DNS-323 may be confused about the partitions, not sure.