Dyson with Vagrant

Added by Igor Pashev 10 months ago

It is possible to spin up a VirtualBox machine using Vagrant. See

Some things do not work yet (e. g. mounting /vagrant), but basically it is usable.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'dyson' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Box file was not detected as metadata. Adding it directly...
==> default: Adding box 'dyson' (v0) for provider: virtualbox
    default: Downloading:
    default: Calculating and comparing box checksum...
==> default: Successfully added box 'dyson' (v0) for 'virtualbox'!
==> default: Importing base box 'dyson'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrantfiles_default_1577965263075_52776
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address:
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: Inserting generated public key within guest...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Mounting shared folders...
    default: /vagrant => /home/pashev/tmp/vagrantfiles
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

sudo /sbin/mount -F vboxfs -o uid=`/usr/xpg4/bin/id -u vagrant`,gid=`/usr/xpg4/bin/id -g vagrant` vagrant /vagrant

Stdout from the command:

Stderr from the command:

bash: line 4: /usr/xpg4/bin/id: No such file or directory
bash: line 4: /usr/xpg4/bin/id: No such file or directory
mount: Operation not applicable to FSType vboxfs

$ vagrant provision 
==> default: Running provisioner: shell...
    default: Running: inline script
    default: WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
    default: Hit:1 testing InRelease
    default: Reading package lists...
    default: Building dependency tree...
    default: Reading state information...
    default: All packages are up to date.
    default: WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
    default: Reading package lists...
    default: Building dependency tree...
    default: Reading state information...
    default: Calculating upgrade...
    default: 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

LLVM 8 and Clang

Added by Igor Pashev 11 months ago

Built LLVM 8 (moving towards Rust). The Patch.

In addition to lldb disabled in previous builds, this build disables LLVM's OpenMP. It is sad how portability-unfriendly code could be in LLVM, for no reason, even in trivial case like parsing command line options... After some my efforts, I think both can be ported, but both need so much to update. Still a lot of assumptions and quick hacks, countless things like #if defined(linux) || defined(freebsd) || defined(kfreebsd) ..., which could be done by proper configure system like GNU autoconf or CMake.


clang++-8 gcd.cpp -stdlib=libc++ -o gcd-cpp -v
clang version 8.0.1-4+dyson1 (tags/RELEASE_801/final) (llvm/llvm-toolchain-8.git de3800437459c8153299ae0e16ef827e8d000049)
Target: x86_64-pc-solaris2.11
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/4.9.1
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/5
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/5.2.1
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/6
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/6.3.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/4.9.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/5
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/5.2.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/6
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/6.3.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-solaris2.11/9
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
 "/usr/lib/llvm-8/bin/clang" -cc1 -triple x86_64-pc-solaris2.11 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name gcd.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -v -resource-dir /usr/lib/llvm-8/lib/clang/8.0.1 -internal-isystem /usr/lib/llvm-8/bin/../include/c++/v1 -internal-isystem /usr/include/clang/8.0.1/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-8/lib/clang/8.0.1/include -internal-externc-isystem /usr/include/x86_64-illumos -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/pashev/gcd -ferror-limit 19 -fmessage-length 225 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/tmp/gcd-4b480d.o -x c++ gcd.cpp -faddrsig
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target x86_64-pc-solaris2.11
ignoring nonexistent directory "/usr/local/include" 
ignoring duplicate directory "/usr/include/clang/8.0.1/include" 
#include "..." search starts here:
#include <...> search starts here:
End of search list.
 "/usr/bin/x86_64-pc-solaris2.11-ld" --hash-style=both --build-id --eh-frame-hdr -m elf_x86_64_sol2 -o gcd-cpp /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../../x86_64-illumos/crt1.o /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../../x86_64-illumos/crti.o /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../../x86_64-illumos/values-Xa.o /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9 -L/usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../../x86_64-illumos -L/lib/x86_64-illumos -L/usr/lib/x86_64-illumos -L/usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../.. -L/usr/lib/llvm-8/bin/../lib -L/lib -L/usr/lib /var/tmp/gcd-4b480d.o -lc++ -lgcc_s -lc -lgcc -lm /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/crtend.o /usr/bin/../lib/gcc/x86_64-pc-solaris2.11/9/../../../x86_64-illumos/crtn.o

PyPy ported

Added by Igor Pashev 11 months ago

The most serious issue was operation priorities :D

$ pypy --version
Python 2.7.13 (7.2.0+dfsg-1+dyson1, Dec 04 2019, 16:40:34)
[PyPy 7.2.0 with GCC 9.2.1 20191109]
$ cat
import sys
import functools

def gcd2(a, b):
    if b == 0:
        return a
        return gcd2(b, a % b)

def gcdn(ns):
    return functools.reduce(gcd2, ns)

ints = map(int, sys.argv[1:])
gcd = gcdn(ints)
$ pypy 11 22 121

Bootstrapped Rust

Added by Igor Pashev 11 months ago

After reading I have discovered a Rust compiler written in C++ - mrust. It only needed a few changes to make it work on Dyson. I have committed them to

When building a few troubles raised, the most important is that it needs a lot of memory, A LOT :). At some step there was a C file of size 760 MiB. I could not build it on a server with 12 GiB RAM and 40GiB swap (!), the server just hung. Then I spun up a VirtualBox instance with about 18GiB RAM (on a 24 GiB RAM server) plus 20 GiB swap. It took a while to compile, but finally it succeeded.

Here is a screenshot of the process:

mrust currently builds Rust 1.29, I have to add extra patch to make Rust work on Dyson. It adds new target (x86_64-pc-solaris) which seems to appear in later Rust versions, and disables Rust version detection in the regex crate, because it fails to find the rust compiler for some reason.

What I have now:

root@dyson:~/mrust# cat ~/
fn main ()
root@dyson:~/mrust# run_rustc/output/prefix/bin/rustc --version
rustc 1.29.0-stable-mrustc
root@dyson:~/mrust# run_rustc/output/prefix/bin/rustc ~/ -o /tmp/main
root@dyson:~/mrust# ldd /tmp/main =>        /lib/x86_64-illumos/ =>        /lib/x86_64-illumos/ =>         /lib/x86_64-illumos/ =>     /lib/x86_64-illumos/ =>     /lib/x86_64-illumos/ =>   /lib/x86_64-illumos/ =>    /lib/x86_64-illumos/ =>    /lib/x86_64-illumos/
root@dyson:~/mrust# file /tmp/main
/tmp/main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/amd64/, BuildID[sha1]=2c927fc72b5c16174196c35914d80a1f0cc8a75b, not stripped
root@dyson:~/mrust# /tmp/main

perl 5.30

Added by Igor Pashev 11 months ago

All tests are passing except one for locales, which is definitely a problem with libc.

# perl --version

This is perl 5, version 30, subversion 0 (v5.30.0) built for x86_64-pc-solaris2.11-thread-multi-64
(with 48 registered patches, see perl -V for more detail)

Copyright 1987-2019, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at, the Perl Home Page.

fakeroot is fully functional

Added by Igor Pashev 11 months ago

Both versions of fakeroot (tcp and sysv) work like a charm. For some reason faked wasn't even trying to bind on port 0 (default). This might be working on linux. but not on illumos/solaris. But binding on port 0 is perfectly legit:

--- fakeroot.git.orig/faked.c
+++ fakeroot.git/faked.c
@@ -1434,7 +1434,6 @@ int main(int argc, char **argv){
   if (setsockopt(sd, SOL_TCP, TCP_NODELAY, &val, sizeof (val)) < 0)

-  if (port > 0) {
     memset((char *) &addr, 0, sizeof (addr));
     addr.sin_family = AF_INET;
     addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
@@ -1442,7 +1441,6 @@ int main(int argc, char **argv){

     if (bind(sd, (struct sockaddr *) &addr, sizeof (addr)) < 0)
-  }

   if (listen(sd, SOMAXCONN) < 0)


Added by Igor Pashev 11 months ago

# gcc-9 --version
gcc-9 (Debian 9.2.1-19+dyson1) 9.2.1 20191109
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO

The Stack Smashing Protector (SSP) is disabled by default (enable with -fstack-protector switches). This is because libc does not support SSP yet, and thus libssp from GCC is required. But when SSP is enabled by default, the libssp library is not passed to the linker. Additionally, when enabled by default, SSP may be required when building GCC itself.

The /lib directory is removed from default library path. All development libraries have to reside under /usr/lib, but /lib contains some for illumos linker (sunld) specifically (e. g., while under /usr/lib is a GNU linker script). Removal of /lib ensures that the normal linker will not pickup the wrong library.

As usually, documentation and man pages are included.

With GNU Modula-2:

# cat test.mod 
FROM StrIO IMPORT WriteString;
  WriteString("Hello World!");
END Hello.

# gm2-9 test.mod -o test

# ./test 
Hello World!

GNU Forth

Added by Igor Pashev about 3 years ago

$ gforth --version
gforth 0.7.3

$ gforth ./gcd.fs 11 22 121
$ cat gcd.fs
: gcd ( a b -- d )
  2dup > if swap endif
  over mod
  dup 0 <> if recurse else drop endif

: gcdn ( a1 a2 .. an n -- d )
  dup 1 >
    1 - rot rot

\ This is gforth-specific.
\ Usage:
\ # gforth ./gcd.fs 11 22 33 121
\ 11

: main
  0 >r
  next-arg 2dup 0 0 d<> while
  s>unumber? if drop else abort endif
  r> 1 + >r
  r> gcdn . cr

main bye
$ dpkg -s gforth
Package: gforth
Status: install ok installed
Priority: optional
Section: interpreters
Installed-Size: 481
Maintainer: Peter Pentchev <>
Architecture: illumos-amd64
Multi-Arch: foreign
Version: 0.7.3+dfsg-4+dyson1
Depends: libc1 (>= 5.10.18.git.2a44663-1), libffcall1 (>= 1.10+2.41), libffi6 (>= 3.0.13-4+dyson1), libltdl7 (>= 2.4.6), emacsen-common (>= 2.0.7), gforth-common (= 0.7.3+dfsg-4+dyson1), gforth-lib (= 0.7.3+dfsg-4+dyson1)
 /etc/emacs/site-start.d/50gforth.el 1629d9314f2e496f2c476df52bf64e80
Description: GNU Forth Language Environment

MariaDB 10.1

Added by Igor Pashev about 3 years ago

New MariaDB package is available to replace old MySQL 5.5.

This package is notably different from Debian's one:
apart from using SMF, all database configuration happens
in SMF service, not in post/pre/install scripts. This is inspired by the Nixsap project.

There is one missed important feature: unix socket authentication. See #198.

# svcs -p mariadb:default
STATE          STIME    FMRI
online         16:37:23 svc:/application/database/mariadb:default
               16:37:22      863 mysqld

# sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.1.26-MariaDB-1+dyson1 Dyson bok

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>


Also available in: Atom