Erstellt vor 7 Jahren

Zuletzt geändert vor 6 Jahren

#1370 new addition

New package 'mksh'

Erstellt von: mirabilos Verantwortlicher:
Priorität: normal Meilenstein: freetz-future
Komponente: packages Version: devel
Stichworte: Beobachter:
Product Id: Firmware Version:

Beschreibung

Hi,

I’m the upstream author and packager (FreeWRT, OpenWrt, Debian, OpenSuSE Buildservice, pkgsrc®, OpenBSD ports, MirPorts Framework, Android, etc.) of mksh, The MirBSD Korn Shell. It’s a really nice, small shell, which can do most of what AT&T ksh93 and GNU bash can (and some of zsh even!), while being much faster than GNU bash and zsh, and a lot smaller than all other shells except ash (but relatively close to it). And it’s much much less buggy than any ash variant. Upstream: https://www.mirbsd.org/mksh.htm (R40 just got released)

I’ve made this package for dileX (Sedat Dilek), it compiles in all settings for me, but I don’t have the hardware to test it here, while dileX has. (Actually, if one of you guys gets Perl on the target device, you can even run the regression testsuite. I did that for *WRT and Android once.)

The package is made against trunk, hope that’s right.

Anhänge (1)

freetz-mksh.diff (5.4 KB) - hinzugefügt von mirabilos vor 7 Jahren.
svn diff

Alle Anhänge herunterladen als: .zip

Änderungshistorie (21)

Geändert vor 7 Jahren durch mirabilos

svn diff

comment:1 Geändert vor 7 Jahren durch dileks

Danke Thorsten (mira) für den Patch!

Ich hab gerade einen aktuellen trunk-r7118 mit mksh-minimal Paket gebaut.

$ grep -i mksh .config
FREETZ_PACKAGE_MKSH=y
FREETZ_PACKAGE_MKSH_MINIMAL=y
FREETZ_PATCH_MKSH_LOGIN_SHELL=y

Auf der Box sieht das Ganze so aus:

root@fritz:/# which mksh
/bin/mksh
root@fritz:/# ls -l /bin/mksh
-rwxr-xr-x    1 root     root        194820 Jun 13 22:18 /bin/mksh

So als Cross-Community Gedanke:
Nachdem wir Thorsten's 910-mbsd_multi.patch für gcc schon lange in freetz benutzen, könnte man mksh auch in freetz anbieten!

  • dileks -

comment:2 Geändert vor 7 Jahren durch mirabilos

Bitte nicht das „svn propset“ vergessen ☺ Steht im Patch.

dileX: dann zeig doch auch mal, daß Du die mksh benutzt, der Prompt von oben ist definitiv nicht der meine…

comment:3 Geändert vor 7 Jahren durch er13

@mirabilos: falls Du Deinen mbsd_multi.patch noch nicht für gcc-4.6.x angepasst hast, ich habe es mal gemacht. In erster Linie deswegen, weil ich nicht wusste, wo ich ihn 'runterladen kann.

Edit: den GCC_HONOUR_COPTS-Teil verwenden wir noch nicht (steht seit einiger Zeit auf meiner TODO-Liste), daher kann es sein, dass dieser Teil noch falsch ist.

Zuletzt geändert vor 7 Jahren von er13 (vorher) (Diff)

comment:4 Antwort: Geändert vor 7 Jahren durch mirabilos

Mh, wenn ich jemals gcc-GPLv3 anfasse, schau ich mir das an, ja ;)
Woher der Java™-Hack?

Ich hatte ohnehin vor, dem noch CPPFLAGS und die Möglichkeit, unterschiedliche für Host und Target zu verpassen, zuzufügen…

comment:5 als Antwort auf: ↑ 4 Geändert vor 7 Jahren durch er13

Replying to mirabilos:

Woher der Java™-Hack?

von openwrt übernommen, wo die Jungs ihn her haben, keine Ahnung

comment:6 Geändert vor 7 Jahren durch dileks

Thorsten 18. März 910er Patch :-)

root@fritz:/# mksh -c "ps w | grep -v grep | grep multid"
  474 root      2904 S    multid -U

Bei Nichtgefallen… häng ein Usecase deiner Wahl an.

comment:7 Geändert vor 7 Jahren durch dileks

BTW… *.texi Modifikationen: at item → @item at opindex → @opindex etc.

comment:8 Antwort: Geändert vor 7 Jahren durch mirabilos

root@fritz:/# mksh -l

Dann bißchen benutzen.

@texinfo: muß wohl jemand beim Kopieren verpeilt haben (aus Trac kopiert statt Suckwürstchen zu benutzen?).

comment:9 als Antwort auf: ↑ 8 Geändert vor 7 Jahren durch dileks

Replying to mirabilos:

root@fritz:/# mksh -l

Dann bißchen benutzen.

root@fritz:/# mksh -l
root@fritz:/ # echo "Hallo, Thorsten"
Hallo, Thorsten
root@fritz:/ # ps w | grep -v grep | grep mksh
 1394 root       988 S    mksh -l

@texinfo: muß wohl jemand beim Kopieren verpeilt haben (aus Trac kopiert statt Suckwürstchen zu benutzen?).

In meinem Patch für Review an dich habe ich es IIRC korrekt.

comment:10 Geändert vor 7 Jahren durch mirabilos

Sieht gut aus, also hoffen wir, daß es wem hilft.

comment:11 Geändert vor 7 Jahren durch dileks

Hier mksh (full)… Zum Vergleich [kByte] 223552 (full) vs. 194820 (small)

root@fritz:/# mksh -l
root@fritz:/ # ll /bin/mksh                                                                                            
-rwxr-xr-x    1 root     root        223552 Jun 14 21:51 /bin/mksh*

Auch nett ll Alias im Einsatz :-).

comment:12 Geändert vor 7 Jahren durch mirabilos

Paßt ja zu den Infos, die ich in Config.in geschrieben habe.

Also, tut, baut’s mal ein ☺ ich hoffe ja immer noch, daß ich damit eines Tages die gar grauslige *ash von allen Systemen verbannen kann (auf FreeWRT trunk bauen wir die busybox ohne ash und nutzen mksh als /bin/sh – auf Android (x86, AOSP und 3.0+) übrigens auch).

comment:13 Antwort: Geändert vor 7 Jahren durch hermann

Das Problem bei uns könnten evtl. AVM-Skripte / AVM-Aufrufe bereiten. Denn ich weiß nicht, ob deine mksh denn voll und ganz ash ersetzen kann. Wenn man bei FREETZ-Sachen die Shell-Skripte noch anpassen kann, wird es in AVM-Teil schwierig.
Wie gut/schlecht waren eure Erfahrungen bei OpenWRT, als ihr ash durch mkfs ersetzt habt? Musstet ihr in irgendwelchen Shell-Skripten was anpassaen?
Hast du dich schon bei busybox gemeldet? Man könnte ja deine mksh in busybox integrieren und als Alternative zu ash anbieten.
Gibt es einen Vergleich na Größe / Performance / Umfang zwischen deiner mksh und der ash der busybox? Mich würde z.B. interessieren, wieviel Platz ash in busybox verbraucht. Wenn ihr es bei FreeWRT gemacht habt, müsstest du es ungefähr wissen.

comment:14 Antworten: Geändert vor 7 Jahren durch oliver

Ash benötigt bei einer busybox-16MB 75kb…

Fehlermeldungen beim booten mit mksh:

/etc/init.d/rc.S: /etc/init.d/S15-filesys[34]: 0x00320000 / (2**16): unexpected '*'
Loading hosts ... /usr/bin/modhosts[102]: break: can't break
/etc/hotplug/create_handle.sh: /var/env.cache[236]: KSH_VERSION: is read only
/etc/hotplug/create_handle.sh[96]: eventadd: not found
/etc/hotplug/storage[161]: lsmod: not found
/etc/hotplug/storage[161]: modprobe: not found
/etc/hotplug/udev-mount-sd[132]: udevadm: not found
Starting dnsmasq ... could not execute dnsmasq, failed.
ln: /mod-webcfg: No such file or directory
Starting syslogd ... could not execute syslogd, failed.
Starting inetd ... could not execute inetd, failed.
ln: ~root/.ssh: No such file or directory
/usr/lib/mod/menu-update: /usr/lib/mod/cgi/form.sh[31]: syntax error: '(' unexpected
/usr/lib/mod/menu-update: /usr/lib/mww/cgi/menu-new.sh[242]: no closing quote
/usr/lib/mod/menu-update[4]: shell_escape: not found
Zuletzt geändert vor 7 Jahren von oliver (vorher) (Diff)

comment:15 als Antwort auf: ↑ 13 Geändert vor 7 Jahren durch mirabilos

Replying to hermann:

Wie gut/schlecht waren eure Erfahrungen bei OpenWRT, als ihr ash durch mkfs ersetzt habt? Musstet ihr in irgendwelchen Shell-Skripten was anpassaen?

Das war FreeWRT ☺ und nein, die waren in der Regel vollkompatibel.

Hast du dich schon bei busybox gemeldet? Man könnte ja deine mksh in busybox integrieren und als Alternative zu ash anbieten.

Nein, könnte man nicht – busybox ist GNU GPL lizensiert, mksh steht unter einer freie(re)n Lizenz. (Naja, da GPL-kompatibel ginge das noch, aber ich weiß nicht, was die Menschen da mit mksh anstellen würden… habe also selber eher wenig Interesse daran. Zudem mksh ja deutlich universeller als der Embedded-Bereich ist. In Beastiebox – sowas wie Busybox aber auf Basis der NetBSD®-Tools – ist sie aber drin, obschon recht veraltet, ein weiteres Integrationsindirektionsmanko.)

Gibt es einen Vergleich na Größe / Performance / Umfang zwischen deiner mksh und der ash der busybox? Mich würde z.B. interessieren, wieviel Platz ash in busybox verbraucht. Wenn ihr es bei FreeWRT gemacht habt, müsstest du es ungefähr wissen.

Kommt auf die Features an. Wenn man bei der ash alles Mögliche wegläßt, zum Beispiel command line editing, ist sie doch noch deutlich kleiner. Wenn nicht, sind das vielleicht 30-40K.

comment:16 als Antwort auf: ↑ 14 Geändert vor 7 Jahren durch mirabilos

Replying to oliver:

Ash benötigt bei einer busybox-16MB 75kb…

Naja, wie gesagt, abhängig vom Funktionsumfang.

Fehlermeldungen beim booten mit mksh:

Müßte man die Skripte sehen…

/etc/init.d/rc.S: /etc/init.d/S15-filesys[34]: 0x00320000 / (216): unexpected '*'

Vermutlich Bug im Skript.

Loading hosts … /usr/bin/modhosts[102]: break: can't break

Bug im Skript? (Versuch, aus if statt while zu brechen oder so?)

/etc/hotplug/create_handle.sh: /var/env.cache[236]: KSH_VERSION: is read only

WTF?! Was versuchen die da? (Eventuell shelleigene Variablen blacklisten, wenn es das ist, was ich ob des Namens vermute.)

/etc/hotplug/create_handle.sh[96]: eventadd: not found

Shellbuiltin/-hack? $PATH falsch und ash findet’s nur, weil es busybox-Builtins direkt aufruft?

/etc/hotplug/storage[161]: lsmod: not found
/etc/hotplug/storage[161]: modprobe: not found
/etc/hotplug/udev-mount-sd[132]: udevadm: not found

$PATH falsch und ash findet’s nur, weil es busybox-Builtins direkt aufruft. (Punkt. ☺)

Starting dnsmasq … could not execute dnsmasq, failed.
ln: /mod-webcfg: No such file or directory
Starting syslogd … could not execute syslogd, failed.
Starting inetd … could not execute inetd, failed.

Vermutlich ähnlich.

ln: ~root/.ssh: No such file or directory

Tut nur, wenn man -DMKSH_NOPWNAM _nicht_ beim Bauen angibt. (Wird dummerweise durch -DMKSH_SMALL impliziert, könnte man aber separieren, gern auch upstream.)

/usr/lib/mod/menu-update: /usr/lib/mod/cgi/form.sh[31]: syntax error: '(' unexpected
/usr/lib/mod/menu-update: /usr/lib/mww/cgi/menu-new.sh[242]: no closing quote

Müßte ich sehen. Was bei sowas helfen kann, ist, mit -DMKSH_BINSHREDUCED zu bauen, dann verhält sie sich etwas strikter POSIXish (also Abschalten von Korn Shell Features wie z.B. Brace Expansion und manchen Extglobs), wenn sie als „sh“ oder „-sh“ aufgerufen wird. (Verwenden wir in Debian, wo mksh als /bin/sh nutzbar ist.)

/usr/lib/mod/menu-update[4]: shell_escape: not found

Vermutlich Folgefehler.


Anyway, primäres Ziel ist, das Paket drin und benutzbar zu haben. Was ihr sonst noch damit macht ist eure Sache, aber natürlich schön, wenn’s hilft. Wir haben in FreeWRT viel „saubereren“ Shellcode geschrieben, der mksh-Spezifika verwendet, nach der Änderung. Ist auch einfacher, Skripte (CGIs!) sicherer zu kriegen (aber auch mit sh machbar – ash nicht so, die ist recht buggy), und durch die höhere Builtin-Funktionalität auch schneller (weniger forks).

comment:17 Geändert vor 7 Jahren durch Whoopie

  • Meilenstein auf freetz-1.3 gesetzt

comment:18 Geändert vor 7 Jahren durch dileks

Kann mal jemand mksh committen, bitte? Danke.

comment:19 als Antwort auf: ↑ 14 Geändert vor 7 Jahren durch ralf

Replying to oliver:

/usr/lib/mod/menu-update: /usr/lib/mod/cgi/form.sh[31]: syntax error: '(' unexpected

Zumindest das liegt an der Syntax der Funktions-Definitionen im Skript. Bash mag das auch nicht.

     30 check()  suffix=_chk checked=" checked" _check "$@"
     31 select() suffix=_sel checked=" selected" _check "$@"

comment:20 Geändert vor 6 Jahren durch cuma

  • Meilenstein von freetz-1.3 nach freetz-future geändert

bedarf Nacharbeit. Version R40 ist nicht mehr downloadbar. R40f hat Probleme die Build.sh zu finden

Hinweis: Hilfe zur Verwendung von Tickets finden Sie in TracTickets.