Minix Neo X5

Linux-Installation auf dem Minix Neo X5

Die Linux-Instal­la­ti­on auf dem Minix Neo X5 kann par­al­lel zum vor­in­stal­lier­ten Android erfol­gen, so dass die Mul­ti­me­dia-Funk­tio­nen erhal­ten blei­ben. Ich habe das Sys­tem für den Minix Neo X5 unter Ubun­tu 12.04 32-Bit zusam­men­ge­baut. Es geht auch unter jedem belie­bi­gen ande­ren Linux, aller­dings müs­sen Sie dann die im Artikel/Script genann­ten Paket­na­men anpas­sen. Wenn Sie ein ande­res Sys­tem ver­wen­den, kön­nen Sie Ubun­tu 12.04 auch in einer Vir­tua­li­sie­rungs-Soft­ware wie Vir­tu­al­box instal­lie­ren.

Bis­her steht unter dem Linux-Sys­tem kei­ne Hard­ware­be­schleu­ni­gung zur Ver­fü­gung ( VPU ). Als Linux-Media­play­er eig­net sich der [amazon_link id=„B00ASLZ62I“ target=„_blank“ ]Minix Neo X5[/amazon_link] damit nicht. Sie kön­nen aus dem Gerät aber einen beson­ders spar­sa­men Web- oder Mail-Ser­ver bas­teln. Ohne Fest­plat­te kommt der Minix Neo X5 mit weni­ger als 5 Watt aus. Ein Datei-Ser­ver ist eben­falls mög­lich, aller­dings ver­spricht der Fast-Ether­net-Anschluss kei­ne hohen Trans­fer­ra­ten. Ether­net und WLAN funk­tio­nie­ren, bei WLAN geht aber der Host-Modus bis­her nicht, die Blue­tooth-Unter­stüt­zung fehl bis­her eben­falls.

Das Script auto­ma­ti­siert die nöti­gen Schrit­te wei­test­ge­hend. Es muss aus dem Home-Ver­zeich­nis mit sudo ./build_minix_x5_sys.sh gestar­tet wer­den. Der Ablauf ist

sudo ./build_minix_x5_sys.sh prepare
sudo ./build_minix_x5_sys.sh kernel
sudo ./build_minix_x5_sys.sh bootstrap
sudo ./build_minix_x5_sys.sh chrootfs

Danach das Script ./install_tools.sh im Chroot-Ver­zeich­nis aus­füh­ren, um das Tas­ta­tur­lay­out anzu­pas­sen und einen neu­en Benut­zer mit dem Namen mx und einem Pass­wort anzu­le­gen. Die­ser ist auch in der Grup­pe sudo. Dann chroot mit exit wie­der ver­las­sen.

Zuletzt dann

sudo ./build_minix_x5_sys.sh copy2usb

Eine Ext4-for­ma­tiert SD-Kar­te mit dem Label linux­root muss unter /media/linuxrooot ein­ge­hängt sein.

Anschlie­ßend den Minix Neo X5 in den Boot­loa­der-Modus ver­set­zen (OTG-Kabel, „Reco­very“- und Power-But­ton gleich­zei­tig drü­cken). Dann mit

sudo ./rkflashtool w 0x10000 0x8000 < recovery.img

die Reco­very-Par­ti­ti­on fla­shen. Vor­sicht: Die Off­set/­Si­ze-Wer­te müs­sen stim­men. Im Zwei­fels­fall vor­her mit

sudo ./rkflashtool r 0x0 0x2000 > parm.bin
cat param.bin | more

ermit­teln. Abschlie­ßend sudo ./rkflashtool b (Neu­start). Dann SD-Kar­te in den [amazon_link id=„B00ASLZ62I“ target=„_blank“ ]Minix Neo X5[/amazon_link] ein­schie­ben und das Gerä­te im Reco­very-Modus star­ten. Nach­dem alles zufrie­den­stel­lend läuft und wenn Sie auf Android ver­zich­ten wol­len, fla­shen Sie recovery.img in die Ker­nel-Par­ti­ti­on: ./rkflashtool w 0x4000 0x4000 < recovery.img (auch hier auf die rich­ti­gen Para­me­ter ach­ten).

#!/bin/bash
SDCARDDIR=/media/linuxroot
BOOTSTRAP=qemu-debootstrap
BINFMT=binfmt-support
DEBOOTSTRAP=debootstrap
GIT=git
CROSSCOMPILER=gcc-arm-linux-gnueabihf
BESSENTIAL=build-essential
ARCH=armhf
VARIANT=minbase
DIST=precise
MIRROR=http://ports.ubuntu.com
HOMEDIR=`pwd`
BASEDIR=${HOMEDIR}/minix
ROOTFSDIR=${BASEDIR}/minix-rootfs
KERNELDIR=${BASEDIR}/minix-kernel
KERNELNAME=rk3066-kernel
MINIXHOSTNAME=minix
EXTRATOOLS="nano,openssh-server,ifupdown,netbase,net-tools,isc-dhcp-client,keyboard-configuration"

[ $UID -ne 0 ] && { 
    echo "Fehler: Das Script benötigt root-Rechte."
    echo "Aufruf mit mit sudo $0"
    exit 1
}

alles_packen() {
echo "Packe rootfs und kernel in minix.tar.bz2"
cd $HOMEDIR
tar -cvjf minix.tar.bz2 $BASEDIR
}

prepare() {
echo "Vorbereitungen"
 if [ -z $(which ${BOOTSTRAP}) ] || [ -z $(which /usr/sbin/update-binfmts) ] || [ -z $(which ${DEBOOTSTRAP}) ]
 then
 echo "Installiere qemu-user-static binfmt-support debootstrap"

 apt-get update
 apt-get -y install qemu-user-static binfmt-support debootstrap
 else
 echo "${BOOTSTRAP} ${BINFMT} und ${DEBOOTSTRAP} sind bereits installiert. OK."
 fi
 # extra build tools

 if [ -z $(which ${GIT}) ] || [ -z $(which arm-linux-gnueabihf-gcc) ] || [ ! -e /usr/share/build-essential/essential-packages-list ] || [ -z $(which uudecode) ] || [ ! -d /usr/include/libusb-1.0 ]
 then
  echo "Installiere git, gcc-arm-linux-gnueabihf, shareutils, libusb-1.0-0-dev und build-essential" 
  apt-get update  
  apt-get -y install git gcc-arm-linux-gnueabihf build-essential sharutils libusb-1.0-0-dev
 else
 echo "git gcc-arm-linux-gnueabihf, sharutils, libusb-1.0-0-dev und build-essential sind bereits installiert. OK"  
 fi

#ncurses für make menuconfig
if [ ! -e /usr/include/curses.h ]
then
echo "Installiere libncurses5-dev"
apt-get -y install libncurses5-dev
fi

 if [ ! -d $BASEDIR ] 
  then
  mkdir $BASEDIR && mkdir $KERNELDIR && mkdir $ROOTFSDIR && mkdir ${KERNELDIR}/kernel_mod
  chown -R $SUDO_USER:$SUDO_USER $BASEDIR
  echo "Arbeitsverzeichnisse erstellt"
fi

}

bootstrap() {
echo "Boootstrap"
cd $ROOTFSDIR
$BOOTSTRAP --verbose --variant=$VARIANT \
--include=$EXTRATOOLS --arch=$ARCH \
$DIST $ROOTFSDIR $MIRROR
}

install_adb() {
apt-get --no-install-recommends install openjdk-7-jre
cd $BASEDIR
wget -c http://dl.google.com/android/android-sdk_r22.3-linux.tgz
tar zxvf android-sdk_r22.3-linux.tgz
mv android-sdk-linux $BASEDIR/android
chown -R $SUDO_USER:$SUDO_USER $BASEDIR/android

if [ ! -d ${HOMEDIR}/.android ]
then
mkdir ${HOMEDIR}/.android
chown -R $SUDO_USER:$SUDO_USER ${HOMEDIR}/.android
fi 

if [ ! -e ${HOMEDIR}/.android/adb_usb.ini ]
then
cat<<EOF>${HOMEDIR}/.android/adb_usb.ini
# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
# USE 'android update adb' TO GENERATE.
# 1 USB VENDOR ID PER LINE.
0x2207
EOF
chown $SUDO_USER:$SUDO_USER ${HOMEDIR}/.android/adb_usb.ini
fi

if [ ! -e /etc/udev/rules.d/51-android.rules ]
then
cat<<EOF>/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666"
EOF
chown root:root /etc/udev/rules.d/51-android.rules
chmod 644 /etc/udev/rules.d/51-android.rules
sudo service udev restart 
fi

cd ${BASEDIR}/android/tools
su $SUDO_USER ./android
}

##############################################
kernel() {

echo "Kernel herunterladen/bauen"
cd $KERNELDIR

#Kernel sourcen scon vorhanden? Sonst herunterladen
if [ ! -d rk3066-kernel ]
then
git clone --depth 1 https://github.com/Myria-de/rk3066-kernel-minix-neo-x5 rk3066-kernel
fi

#initramfs
if [ ! -d initramfs ]
then
echo "Hole initramfs"
git clone --depth 1 https://github.com/Galland/rk30_linux_initramfs.git initramfs
cd initramfs
gzip -dc debian-3.0.8+fkubi.cpio.gz > initramfs.cpio
fi

# kernel schon vorhanden?
BUILDKERNEL=yes
if [ -e ${KERNELDIR}/${KERNELNAME}/arch/arm/boot/zImage ]
then
  read -p "Kernel-Image vorhanden. Neu erstellen (j/N)?" choice
   case "$choice" in 
   j|J ) BUILDKERNEL=yes;;
   * ) BUILDKERNEL=no;;
   esac
fi

#kernel erstellen
if [ ${BUILDKERNEL} == yes ]
then
echo "Baue kernel"
cd ${KERNELDIR}/${KERNELNAME}
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export INSTALL_MOD_PATH=${KERNELDIR}/kernel_mod
export KDIR=./
export LOCALVERSION=""
MAKE="make -j$(getconf _NPROCESSORS_ONLN)"
$MAKE mrproper
cp .config_minix_neo_x5_20131018 .config
#cp config.pcw .config
$MAKE
$MAKE modules_install
fi

# mkbootimge für das Erstellen von recovery.img 
if [ ! -d ${KERNELDIR}/tools ]
then
echo "Hole mkbootimge"
cd ${KERNELDIR}
git clone --depth 1 https://github.com/olegk0/tools.git 
else
echo "mkbootimge ist bereits vorhanden"
fi

#rkflashtool zum Flashen von recovery.img
cd ${KERNELDIR}
if [ ! -d ${KERNELDIR}/rkflashtool ]
then
echo "Hole rkflashtool_rk3066"
git clone --depth 1 https://github.com/Galland/rkflashtool_rk3066.git rkflashtool
cd ${KERNELDIR}/rkflashtool
make
 if [ -e ${KERNELDIR}/rkflashtool/rkflashtool ]
 then
 echo "rkflashtool erfolgreich erstellt" 
 else
 echo "Fehler konnte rkflashtool nicht erstellen" 
 fi
else
echo "rkflashtool ist vorhanden"
fi

echo "Erstelle recovery.img"
cd ${KERNELDIR}/tools
./mkbootimg --kernel ${KERNELDIR}/${KERNELNAME}/arch/arm/boot/zImage \
--ramdisk ${KERNELDIR}/initramfs/fakeramdisk.gz --base 60400000 \
--pagesize 16384 --ramdiskaddr 62000000 \
-o ${KERNELDIR}/recovery.img
cd ${KERNELDIR}
if [ -e ${KERNELDIR}/recovery.img ]
then
echo "recovery.img erfolgreich erstellt"
mv ${KERNELDIR}/recovery.img ${KERNELDIR}/rkflashtool/recovery.img
else
echo "Fehler: recovery.img wurde nicht erstellt"
fi

}

#copy files to SD card /media/linuxroot
copy_files() {
echo "Dateien auf SD-Karte kopieren"
if [ -d ${SDCARDDIR} ]
then
echo "Kopiere rootfs"
cp -av ${ROOTFSDIR}/* ${SDCARDDIR}
echo "Kopiere Kernel-Module"
cp -av ${KERNELDIR}/kernel_mod/* ${SDCARDDIR}
else
echo "Verzeichnis ${SDCARDDIR} existiert nicht. Bitte SD-Karte einhängen."
fi

}
##############################################
rootfs() {
echo "Rootfs bearbeiten"

cat<<EOF>${ROOTFSDIR}/install_tools.sh
echo "Installiere Tools im rootfs..."
export LANG=C
apt-get update
apt-get -y install apt-utils dialog locales
cat <<END > /etc/apt/apt.conf.d/71neo
APT::Install-Recommends "0";
APT::Install-Suggests "0";
END
locale-gen de_DE.UTF-8
dpkg-reconfigure locales
localedef -i de_DE -c -f UTF-8 de_DE.UTF-8 
export LANG=de_DE.UTF-8

apt-get -y install sudo udev iproute iputils-ping wget ntpdate ntp vim less most tzdata console-tools console-data console-common module-init-tools linux-firmware

echo "Bitte geben Sie die Daten für den neuen Benutzer ein."
adduser mx
adduser mx sudo
EOF

cat<<EOF>${ROOTFSDIR}/config_keyboard.sh
dpkg-reconfigure tzdata
dpkg-reconfigure console-data
dpkg-reconfigure console-common
dpkg-reconfigure keyboard-configuration
EOF

chmod 755 ${ROOTFSDIR}/install_tools.sh
chmod 755 ${ROOTFSDIR}/config_keyboard.sh

mount -t proc proc ${ROOTFSDIR}/proc
mount -t sysfs sysfs ${ROOTFSDIR}/sys
mount -o bind /dev ${ROOTFSDIR}/dev
mount -t devpts devpts ${ROOTFSDIR}/dev/pts
echo "Wechsele in ${ROOTFSDIR}"
chroot ${ROOTFSDIR}
# mountpoints wieder entfernen
umount ${ROOTFSDIR}/proc
umount ${ROOTFSDIR}/sys
umount ${ROOTFSDIR}/dev/pts
umount ${ROOTFSDIR}/dev
}
#########################################
prepare_rootfs() {
echo "Bereite rootfs vor"

# Ubuntu 12.04 Paketquellen
echo "Lege Paketquellen fest ..."
cat<<EOF>${ROOTFSDIR}/etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports/ precise main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports/ precise main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ precise-updates main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports/ precise-updates main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ precise-security main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports/ precise-security main restricted universe multiverse
EOF

#Hostname
echo ${MINIXHOSTNAME} >  ${ROOTFSDIR}/etc/hostname
echo "127.0.1.1 ${MINIXHOSTNAME}" >>  ${ROOTFSDIR}/etc/host

#fstab
cat<<EOF>${ROOTFSDIR}/etc/fstab
/dev/root / ext4 defaults,noatime 0 0
tmpfs    /var/log    tmpfs    defaults    0 0
tmpfs    /tmp        tmpfs    defaults    0 0
tmpfs    /var/tmp    tmpfs    defaults    0 0
EOF

#Netzwerk setup
cat<<EOF>${ROOTFSDIR}/etc/network/interfaces
auto lo
iface lo inet loopback
# Ethernet interface eth0 
auto eth0
iface eth0 inet dhcp

# WLAN eth1
# auto eth1
# iface eth1 inet dhcp
# wpa-ssid testminix
# wpa-psk 12345
EOF

echo "resolve.conf durch die des Hauptsystems ersetzen"
cp -d /etc/resolv.conf ${ROOTFSDIR}/etc/resolv.conf

}

hilfe() {
cat<<EOF
Aufruf: $0 prepare|bootstrap|kernel|rootfs|copy|packen|adb|mksystem|hilfe

Optionen:
prepare .... System vorbereiten, nötige Pakete installieren
bootstrap .. Dateien für rootfs herunterladen
kernel ..... Kernel herunterladen/compilieren
chrootfs ... mit chroot in das rootfs wechslen
copy2sd .... System auf SD-Karte kopieren
packen ..... Arbeitsverzeichnis für Backup in Datei minix.tar.bz2 packen
adb ........ Android-SDK installieren
mksystem ... führt prepare, kernel und bootstrap nacheinander aus
help ....... diese Hilfe anzeigen

EOF
}

case "$1" in
  prepare)
  prepare
  ;;
  bootstrap)
  prepare 
  bootstrap
  ;;
  kernel)
  prepare  
  kernel
  ;;
  copy2sd)
  copy_files
  ;;
  packen)
  alles_packen
  ;;
  adb)
  install_adb
  ;;
  chrootfs)
  prepare_rootfs
  rootfs
  ;;
  mksystem)
  prepare
  bootstrap
  prepare_rootfs
  kernel
  #alles_packen
  ;;
  hilfe)
  hilfe
  ;;
  *)
  hilfe
  ;;
esac
exit 0

Schlagwörter:


Kommentare

7 Antworten zu „Linux-Installation auf dem Minix Neo X5“

  1. […] Ablauf lässt sich über das Skript build_minix_x5_sys.sh auto­ma­ti­sie­ren. Wir beschrei­ben in den nächs­ten Punk­ten die nöti­gen Schrit­te anhand des Skripts […]

  2. Hal­lo Richard – Super – Dan­ke. Habe erst heu­te wie­der vor­bei­ge­se­hen – pro­bie­re das die­se Tage sofort aus!

  3. So bin soweit. Ich habe eini­ge Sachen ergänzt und es hier:
    http://www.kopfload.de/doku.php?id=allgemein:minix:minix_script

    ver­öf­fent­licht.
    Mich hat am rkflash­tool gestört, dass die Adresse/Offset im mit­ge­lie­fer­ten flash-Skript ggf. das Gerät schä­di­gen könn­ten. Daher habe ich ein neu­es Skript „flash2minix“ inte­griert, dass die Wer­te aus dem ange­schlos­se­nen minix ermit­telt. Es funk­tio­niert, könn­te aber sicher noch bes­ser wer­den.
    @tnt: Ich hof­fe das war­ten hat sich gelohnt.

  4. Avatar von Richard

    Ich bin noch nicht fer­tig. Mei­ne SDCard wur­de nicht vom Minix erkannt. Wenn ich fer­tig bin, dann wer­de ich hier einen Link pos­ten.

  5. Hal­lo Richard
    Hal­lo te

    Was ist nun gewor­den? Ist die gepatch­te Ver­si­on ver­öf­fent­licht und falls ja wo? Wür­de das ger­ne nach­voll­zie­hen. Dan­ke.

  6. Avatar von Richard

    Sehr hilf­reich!! Super Arbeit.
    Ich habe das Skript in der aktu­el­len Linux­Welt wie­der gefun­den.

    Aller­dings gibt es noch ein paar Feh­ler­mel­dun­gen:
    Der gcc wird nicht gefun­den, wenn man nicht expli­zit einen sym-Link setzt.
    Die resolver.conf wur­de „nur“ rela­tiv kopiert (also mit einem sym-Link auf die Host-Maschi­ne), das führ­te bei mir dazu, dass die Pake­te nicht nach­in­stal­liert wur­den.

    Ein Fra­ge: Wäre es ok, wenn ich eine ange­pass­te Ver­si­on, mit ent­spre­chen­dem Ver­weis auf die­se Sei­te hier auf mei­ner Home­page ver­öf­fent­li­che?

    Bes­te Grü­ße
    Richard

    1. Hal­lo Richard,
      es ist nicht aus­zu­schlie­ßen, dass das Script noch Feh­ler hat, bezie­hungs­wei­se unter bestimm­ten Bedin­gun­gen nicht ord­nungs­ge­mäß läuft. Das Script ist frei von Rech­ten und kann belie­bi­ge ver­än­dert und ver­öf­fent­licht wer­den. Viel­leicht teilst Du mir die URL des neu­en Scripts mit, dann kann ich es auch hier anpas­sen.
      Vie­le Grü­ße
      Thors­ten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Neueste Kommentare


Die Website durchsuchen