Linux auf dem Minix Neo X5

Minix Neo X5

Die Linux-Installation auf dem Minix Neo X5 kann parallel zum vorinstallierten Android erfolgen, so dass die Multimedia-Funktionen erhalten bleiben. Ich habe das System für den Minix Neo X5 unter Ubuntu 12.04 32-Bit zusammengebaut. Es geht auch unter jedem beliebigen anderen Linux, allerdings müssen Sie dann die im Artikel/Script genannten Paketnamen anpassen. Wenn Sie ein anderes System verwenden, können Sie Ubuntu 12.04 auch in einer Virtualisierungs-Software wie Virtualbox installieren.

Bisher steht unter dem Linux-System keine Hardwarebeschleunigung zur Verfügung ( VPU ). Als Linux-Mediaplayer eignet sich der Minix Neo X5 damit nicht. Sie können aus dem Gerät aber einen besonders sparsamen Web- oder Mail-Server basteln. Ohne Festplatte kommt der Minix Neo X5 mit weniger als 5 Watt aus. Ein Datei-Server ist ebenfalls möglich, allerdings verspricht der Fast-Ethernet-Anschluss keine hohen Transferraten. Ethernet und WLAN funktionieren, bei WLAN geht aber der Host-Modus bisher nicht, die Bluetooth-Unterstützung fehl bisher ebenfalls.

Das Script automatisiert die nötigen Schritte weitestgehend. Es muss aus dem Home-Verzeichnis mit sudo ./build_minix_x5_sys.sh gestartet werden. Der Ablauf ist

1
2
3
4
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-Verzeichnis ausführen, um das Tastaturlayout anzupassen und einen neuen Benutzer mit dem Namen mx und einem Passwort anzulegen. Dieser ist auch in der Gruppe sudo. Dann chroot mit exit wieder verlassen.

Zuletzt dann

sudo ./build_minix_x5_sys.sh copy2usb

Eine Ext4-formatiert SD-Karte mit dem Label linuxroot muss unter /media/linuxrooot eingehängt sein.

Anschließend den Minix Neo X5 in den Bootloader-Modus versetzen (OTG-Kabel, „Recovery“- und Power-Button gleichzeitig drücken). Dann mit

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

die Recovery-Partition flashen. Vorsicht: Die Offset/Size-Werte müssen stimmen. Im Zweifelsfall vorher mit

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

ermitteln. Abschließend sudo ./rkflashtool b (Neustart). Dann SD-Karte in den Minix Neo X5 einschieben und das Geräte im Recovery-Modus starten. Nachdem alles zufriedenstellend läuft und wenn Sie auf Android verzichten wollen, flashen Sie recovery.img in die Kernel-Partition: ./rkflashtool w 0x4000 0x4000 < recovery.img (auch hier auf die richtigen Parameter achten).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
#!/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
Be Sociable, Share!

7 Kommentare

  • Pingback: Artikel: Linux auf dem MiniX Neo X5 installieren « LinuxLife Blog

  • Hallo Richard – Super – Danke. Habe erst heute wieder vorbeigesehen – probiere das diese Tage sofort aus!

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

    veröffentlicht.
    Mich hat am rkflashtool gestört, dass die Adresse/Offset im mitgelieferten flash-Skript ggf. das Gerät schädigen könnten. Daher habe ich ein neues Skript „flash2minix“ integriert, dass die Werte aus dem angeschlossenen minix ermittelt. Es funktioniert, könnte aber sicher noch besser werden.
    @tnt: Ich hoffe das warten hat sich gelohnt.

  • Ich bin noch nicht fertig. Meine SDCard wurde nicht vom Minix erkannt. Wenn ich fertig bin, dann werde ich hier einen Link posten.

  • Hallo Richard
    Hallo te

    Was ist nun geworden? Ist die gepatchte Version veröffentlicht und falls ja wo? Würde das gerne nachvollziehen. Danke.

  • Sehr hilfreich!! Super Arbeit.
    Ich habe das Skript in der aktuellen LinuxWelt wieder gefunden.

    Allerdings gibt es noch ein paar Fehlermeldungen:
    Der gcc wird nicht gefunden, wenn man nicht explizit einen sym-Link setzt.
    Die resolver.conf wurde „nur“ relativ kopiert (also mit einem sym-Link auf die Host-Maschine), das führte bei mir dazu, dass die Pakete nicht nachinstalliert wurden.

    Ein Frage: Wäre es ok, wenn ich eine angepasste Version, mit entsprechendem Verweis auf diese Seite hier auf meiner Homepage veröffentliche?

    Beste Grüße
    Richard

    • Hallo Richard,
      es ist nicht auszuschließen, dass das Script noch Fehler hat, beziehungsweise unter bestimmten Bedingungen nicht ordnungsgemäß läuft. Das Script ist frei von Rechten und kann beliebige verändert und veröffentlicht werden. Vielleicht teilst Du mir die URL des neuen Scripts mit, dann kann ich es auch hier anpassen.
      Viele Grüße
      Thorsten

Schreibe einen Kommentar

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