├── patch ├── init ├── clean ├── README ├── prep ├── mkboot └── mkramdisk /patch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kref/scripts/HEAD/patch -------------------------------------------------------------------------------- /init: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | /bin/patch --no-backup-if-mismatch -p1 < /etc/jun.patch 3 | exec /bin/busybox init 4 | -------------------------------------------------------------------------------- /clean: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | # $1=model $2=version 3 | MODEL="$1" 4 | VER="$2" 5 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | ROOT=$(dirname ${SCRIPT_DIR}) 7 | MV=${MODEL}_${VER} 8 | ROOTFS=$ROOT/rootfs/$MV 9 | RAMDISK=$ROOT/ramdisk/$MV 10 | PAT=$ROOT/pat/$MV 11 | WORKDIR=$ROOT/$MV 12 | TOOLCHAIN=$ROOT/toolchain/$MV 13 | 14 | sudo rm -rf $PAT $ROOTFS $RAMDISK $WORKDIR $TOOLCHAIN 15 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This project attempts to improve DSM's compatibility without vendor cooperation 2 | 3 | How to generate bootable image: 4 | 5 | 1. clone kernel source(FIXME), compatibility util source(FIXME) and build scripts to same folder 6 | 7 | 2. extract and prepare pat 8 | scripts/prep ds3617 6.1 /path/to/DSM_DS3617xs_15047.pat /path/to/broadwell-gcc493_glibc220_linaro_x86_64-GPL.txz 9 | 10 | 3. make necessary changes to ramdisk 11 | 12 | 4. create config.override (extra kernel configs), grub.cfg, modules.conf(a list of extra modules), optionally info.txt 13 | 14 | 5. build modules & generate ramdisk 15 | scripts/mkramdisk ds3617 6.1 broadwell 16 | 17 | 6. generate bootable disk image 18 | sudo scripts/mkboot ds3617 6.1 19 | -------------------------------------------------------------------------------- /prep: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | # $1=model $2=version $3=pat $4=toolchain 3 | MODEL="$1" 4 | VER="$2" 5 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | ROOT=$(dirname ${SCRIPT_DIR}) 7 | MV=${MODEL}_${VER} 8 | ROOTFS=$ROOT/rootfs/$MV 9 | RAMDISK=$ROOT/ramdisk/$MV 10 | PAT=$ROOT/pat/$MV 11 | WORKDIR=$ROOT/$MV 12 | TOOLCHAIN=$ROOT/toolchain/$MV 13 | 14 | mkdir -p $PAT $ROOTFS $RAMDISK $WORKDIR $TOOLCHAIN 15 | tar -C $TOOLCHAIN -xf $4 16 | 17 | tar -C $PAT -xf $3 18 | 19 | tar -C $ROOTFS -xf $PAT/hda1.tgz 20 | 21 | pushd $RAMDISK 22 | lzcat -S gz $PAT/rd.gz | cpio -i 23 | git init 24 | git add -A 25 | git commit -m "import ramdisk" 26 | git tag baseline 27 | popd 28 | 29 | $ROOT/linux/scripts/extract-vmlinux $PAT/zImage > $WORKDIR/vmlinux.bin 30 | -------------------------------------------------------------------------------- /mkboot: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # $1=model $2=version 3 | MODEL="$1" 4 | VER="$2" 5 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | ROOT=$(dirname ${SCRIPT_DIR}) 7 | MV=${MODEL}_${VER} 8 | WORKDIR=$ROOT/$MV 9 | PAT=$ROOT/pat/$MV 10 | 11 | fallocate -l 50M $WORKDIR/synoboot.img 12 | sgdisk -o -n 0:0:+15M -t 1:EF00 -n 0:0:+30M -n 0:0: -t 3:EF02 -c 1:boot -c 2:image -c 3:legacy $WORKDIR/synoboot.img 13 | 14 | kpartx -as $WORKDIR/synoboot.img 15 | 16 | loopdev=`sudo kpartx -l $WORKDIR/synoboot.img | tr ' ' '\n' | fgrep -m1 /dev/loop ` 17 | 18 | parts=`kpartx -l $WORKDIR/synoboot.img |cut -d: -f1` 19 | for part in $parts;do 20 | mkfs.vfat "/dev/mapper/$part" 21 | done 22 | 23 | part1=`echo $parts | cut -d\ -f1` 24 | part2=`echo $parts | cut -d\ -f2` 25 | mkdir $WORKDIR/bl 26 | mount -o noexec,nosuid,nodev "/dev/mapper/$part1" $WORKDIR/bl 27 | grub-install --target=x86_64-efi --efi-directory=$WORKDIR/bl --removable --no-nvram -s --no-bootsector --boot-directory=$WORKDIR/bl 28 | grub-install --target=i386-pc -s --boot-directory=$WORKDIR/bl $loopdev 29 | cp $WORKDIR/grub.cfg $WORKDIR/bl/grub/ 30 | umount $WORKDIR/bl 31 | rm -rf $WORKDIR/bl 32 | 33 | mkdir $WORKDIR/img 34 | mount -o noexec,nosuid,nodev "/dev/mapper/$part2" $WORKDIR/img 35 | cp $PAT/rd.gz $WORKDIR/img/rd.gz 36 | if [ -f $WORKDIR/bzImage ]; then 37 | cp $WORKDIR/bzImage $WORKDIR/img/ 38 | fi 39 | cp $PAT/zImage $WORKDIR/img/ 40 | if [ -f $WORKDIR/jun.lzma ]; then 41 | cp $WORKDIR/jun.lzma $WORKDIR/img/extra.lzma 42 | fi 43 | if [ -f $WORKDIR/info.txt ]; then 44 | cp $WORKDIR/info.txt $WORKDIR/img/ 45 | fi 46 | umount $WORKDIR/img 47 | rm -rf $WORKDIR/img 48 | kpartx -d $WORKDIR/synoboot.img 49 | -------------------------------------------------------------------------------- /mkramdisk: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | # $1=model $2=version $3=config 3 | MODEL="$1" 4 | VER="$2" 5 | CONFIG="$3" 6 | shift 3 7 | MV=${MODEL}_${VER} 8 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 9 | ROOT=$(dirname ${SCRIPT_DIR}) 10 | OUTDIR=$ROOT/build/$MV 11 | PREFIX_PATH=$ROOT/install/$MV 12 | SRCDIR=$ROOT/linux 13 | WORKDIR=$ROOT/$MV 14 | NEWRD=$WORKDIR/ramdisk 15 | 16 | 17 | mkdir -p $OUTDIR 18 | mkdir -p $PREFIX_PATH 19 | mkdir -p $WORKDIR 20 | mkdir -p $NEWRD 21 | 22 | # 3rd party prebuilt modules 23 | UPDATE_MOD_PATH=$ROOT/3rdparty/$MV/modules 24 | UPDATE_FW_PATH=$ROOT/3rdparty/$MV/firmware 25 | # from synology rootfs 26 | RELEASE_MOD_PATH=$ROOT/rootfs/$MV/lib/modules 27 | RELEASE_FW_PATH=$ROOT/rootfs/$MV/lib/firmware 28 | # synology rd.gz 29 | RAMDISK_MOD_PATH=$ROOT/ramdisk/$MV/lib/modules 30 | RAMDISK_FW_PATH=$ROOT/ramdisk/$MV/lib/firmware 31 | # built with beta source 32 | BETA_MOD_PATH=$ROOT/install/$MV/lib/modules 33 | BETA_FW_PATH=$ROOT/install/$MV/lib/firmware 34 | 35 | TOOL_PATH=$ROOT/tool 36 | TOOLCHAIN=$ROOT/toolchain/$MV/x86_64-pc-linux-gnu 37 | cat $SRCDIR/synoconfigs/$CONFIG $WORKDIR/config.override > $OUTDIR/.config 38 | export CROSS_COMPILE=${TOOLCHAIN}/bin/x86_64-pc-linux-gnu- 39 | #cat $WORKDIR/config.override >> $OUTDIR/.config 40 | 41 | if [ "x$1" = "xmenuconfig" ]; then 42 | make -C $SRCDIR O=$OUTDIR menuconfig 43 | exit 0 44 | fi 45 | 46 | if [ "x$1" = "xsavedefconfig" ]; then 47 | make -C $SRCDIR O=$OUTDIR savedefconfig 48 | cp $OUTDIR/defconfig . 49 | exit 0 50 | fi 51 | 52 | make -C $SRCDIR O=$OUTDIR oldconfig 53 | 54 | if [ "x$1" = "xpass" ]; then 55 | shift 56 | make -C $SRCDIR O=$OUTDIR $@ 57 | exit 0 58 | fi 59 | 60 | if [ "x$1" = "xsymbol" ]; then 61 | make -C $SRCDIR O=$OUTDIR -j5 bzImage EXTRA_CFLAGS=-g 62 | exit 0 63 | fi 64 | 65 | if [ "x$1" = "xkernel" -o "x$1" = "xall" ]; then 66 | make -C $SRCDIR O=$OUTDIR -j5 bzImage 67 | exit 0 68 | fi 69 | 70 | mkdir -p $NEWRD/usr/sbin 71 | mkdir -p $NEWRD/usr/bin 72 | mkdir -p $NEWRD/etc 73 | 74 | InstallFirmware() 75 | { 76 | local fw="$1" 77 | local fwbase=$(basename $fw) 78 | local update=$(find $UPDATE_FW_PATH -name $fwbase -type f | fgrep "$fw") 79 | local release=$(find $RELEASE_FW_PATH -name $fwbase -type f | fgrep "$fw") 80 | local ramdisk=$(find $RAMDISK_FW_PATH -name $fwbase -type f | fgrep "$fw") 81 | local beta=$(find $BETA_FW_PATH -name $fwbase -type f | fgrep "$fw") 82 | local src="" 83 | [ -z "$src" -a -n "$update" ] && src="$update" 84 | [ -z "$src" -a -n "$release" -a -z "$ramdisk" ] && src="$release"; 85 | [ -z "$src" -a -n "$ramdisk" ] && src="nop"; 86 | [ -z "$src" -a -n "$beta" ] && src="$beta"; 87 | [ -z "$src" ] && echo "$fw not found any where" 88 | if [ -n "$src" -a "x$src" != "xnop" ]; then 89 | install -DTm 0755 "$src" "$NEWRD/usr/lib/firmware/$fw" 90 | else 91 | return 1 92 | fi 93 | } 94 | 95 | InstallModule() 96 | { 97 | local mod="$1" 98 | local update=$(find $UPDATE_MOD_PATH -name ${mod}.ko) 99 | local release=$(find $RELEASE_MOD_PATH -name ${mod}.ko) 100 | local ramdisk=$(find $RAMDISK_MOD_PATH -name ${mod}.ko) 101 | local beta=$(find $BETA_MOD_PATH -name ${mod}.ko) 102 | local src="" 103 | [ -z "$src" -a -n "$update" ] && src="$update" 104 | [ -z "$src" -a -n "$release" -a -z "$ramdisk" ] && src="$release"; 105 | [ -z "$src" -a -n "$ramdisk" ] && src="nop"; 106 | [ -z "$src" -a -n "$beta" ] && src="$beta"; 107 | [ -z "$src" ] && echo "$mod not found any where" 108 | if [ -n "$src" -a "x$src" != "xnop" ]; then 109 | install -DTm 0644 "$src" "$NEWRD/usr/lib/modules/${mod}.ko" 110 | for fw in $(modinfo $src |grep ^firmware | cut -d: -f2); do 111 | if InstallFirmware $fw; then 112 | [ -n "$firmwares" ] && firmwares="$firmwares " 113 | firmwares="$firmwares$fw" 114 | fi 115 | done 116 | fi 117 | } 118 | 119 | if [ "x$1" = "xmodule" -o "x$1" = "xall" -o "x$1" = "x" ]; then 120 | make -C $SRCDIR O=$OUTDIR -j5 modules 121 | make -C $SRCDIR INSTALL_MOD_PATH=$PREFIX_PATH O=$OUTDIR -j5 modules_install 122 | make -C $SRCDIR INSTALL_MOD_PATH=$PREFIX_PATH O=$OUTDIR -j5 firmware_install 123 | 124 | firmwares="" 125 | 126 | source $WORKDIR/modules.conf 127 | 128 | #disk modules are loaded early 129 | for mod in $DISK_MODULES $EXTRA_MODULES $OPTIONAL_MODULES; do 130 | InstallModule $mod 131 | done 132 | 133 | echo 'EXTRA_MODULES="'$EXTRA_MODULES'"' > $NEWRD/etc/rc.modules 134 | echo 'DISK_MODULES="'$DISK_MODULES'"' >> $NEWRD/etc/rc.modules 135 | echo 'EXTRA_FIRMWARES="'$firmwares'"' >> $NEWRD/etc/rc.modules 136 | fi 137 | 138 | if [ "x$1" = "xtool" -o "x$1" = "xall" -o "x$1" = "x" ]; then 139 | make -C $SRCDIR O=$OUTDIR M=$TOOL_PATH 140 | make -C $TOOL_PATH 141 | cp -a $TOOL_PATH/modprobe $NEWRD/usr/sbin/ 142 | fi 143 | 144 | if [ "x$1" = "xoverlay" ]; then 145 | cp $WORKDIR/vmlinux.bin ${OUTDIR}/arch/x86/boot/compressed/vmlinux.bin 146 | $SCRIPT_DIR/genzImage 147 | exit 0 148 | fi 149 | 150 | cp $SCRIPT_DIR/patch $NEWRD/usr/bin/ 151 | cp $SCRIPT_DIR/init $NEWRD/ 152 | git -C $ROOT/ramdisk/$MV diff baseline > $NEWRD/etc/jun.patch 153 | #single core machine may suffer a text busy issue due to fd lazy close during initramfs populating 154 | pushd $NEWRD 155 | (find . -name modprobe && find . \! -name modprobe) | cpio --owner root:root -oH newc | lzma -9 > $WORKDIR/jun.lzma 156 | popd 157 | --------------------------------------------------------------------------------