How to setup a SmartOS dev box
Introduction⌗
Hi folks, been a bit since I’ve written up a post, I know, I’m sorry. I’ve been busy. As a part of one of the projects I’ve been working on, I’ve decided to target SmartOS specifically. This isn’t anything new, as I have quite a fixation on it (it powers the Kararou Computer Research Lab’s cluster, so of course I’m going to leverage it).
Create an Instance⌗
Create your instance however you do that, mine followed a route like so:
List Triton networks:
$ triton networks
SHORTID NAME SUBNET GATEWAY FABRIC VLAN PUBLIC
429ae81e My-Fabric-Network 192.168.128.0/22 192.168.128.1 true 2 false
c9158b8d barr0wnet-kararou-pop - - - - true
2a306b7c dmz - - - - true
dd047ad4 external - - - - true
8c7adcaf hacks 192.168.137.0/24 192.168.137.1 true 666 false
7b56a4b1 sdc_nat - - - - true
e24f5e94 server - - - - true
We simply need to know which network to use, and I have a few of them setup and available to me. I’m going to pick “server” because its the network used for non-dmz servers.
Next, look at the available packages:
$ triton pkgs
SHORTID NAME MEMORY SWAP DISK VCPUS
b6690689 teeny 64M 256M 10G 1
418650a9 smol 256M 1G 10G 1
cd55c0c5 nyarmal 512M 2G 20G 2
f6a99059 lorge 1G 4G 20G 2
186d623b insanyanty 2G 6G 20G 4
d1bf309d herculenyan 3G 8G 20G 5
eefa2bc1 gignyantic 4G 10G 20G 6
1509016f considerable-chonker 6G 12G 20G 7
2de9db76 aaaaaaa 8G 16G 40G 8
edfb4ba3 aaaaaaa 10G 20G 40G 10
These are the packages I have available. I’m going to pick a nyarmal sized instance because I can dynamically resize these as I need to.
The last thing we have to do is ask Triton to let us know what images we have available.
$ triton imgs
SHORTID NAME VERSION FLAGS OS TYPE PUBDATE
7b5981c4 ubuntu-16.04 20170403 P linux lx-dataset 2017-04-03
c193a558 base-64-lts 18.4.0 P smartos zone-dataset 2019-01-21
4feac886 ubuntu-certified-18.04 20190514.1 P linux zvol 2019-05-22
616c7421 ubuntu-certified-16.04 20190628.1 P linux zvol 2019-07-03
9aa48095 ubuntu-certified-18.04 20190627.1.1 P linux zvol 2019-07-03
e75c9d82 base-64-lts 19.4.0 P smartos zone-dataset 2020-01-07
9bcfe5cc debian-10 20200508 P linux zvol 2020-05-08
9ad5a702 minimal-64-trunk 20201019 P smartos zone-dataset 2020-10-19
2d8225e4 base-64-trunk 20201019 P smartos zone-dataset 2020-10-19
1f538e62 pkgbuild-trunk 20201019 P smartos zone-dataset 2020-10-19
800db35c minimal-64-lts 20.4.0 P smartos zone-dataset 2021-01-11
1d05e788 base-64-lts 20.4.0 P smartos zone-dataset 2021-01-11
0bf06d4d ubuntu-20.04 20210413 P linux lx-dataset 2021-04-13
f9d127e8 void 20210413 P linux lx-dataset 2021-04-13
62aa54b0 barrow-base 1.0.0 P smartos zone-dataset 2021-10-31
108ee646 barrow-bind 1.0.0 P smartos zone-dataset 2021-10-31
74b6fe0c rust-stable 1.56.1 PS smartos zone-dataset 2021-11-03
ea7da286 rust-stable 1.57.0 P smartos zone-dataset 2021-12-20
088acaa4 rust-stable 1.58.0 P smartos zone-dataset 2022-01-13
I’m going to use base-64-trunk, as that affords me the latest pkgsrc packages; however, during installation, I noticed that base-64-trunk doesn’t have clang, while [email protected] does. So if you need clang, use that one instead. We also have rust-specific packages thanks to our good friend, barrow.
Now we can create the instance itself:
$ triton create -n devbox -N server base-64-trunk nyarmal
Creating instance devbox (b10998b8-97d1-4a2f-9914-6cd47dd61f7e, [email protected])
Go ahead and do something for a few minutes, typical spinup time is around 46
seconds and run triton ls
to see if its running yet. You could also set
triton to wait for the instance to spinup by using the -w
flag.
Login and Setup⌗
UNIX is fun. I love it a lot. Lets login.
$ triton ssh devbox
The authenticity of host 'devbox (X.X.X.X)' can't be established.
ECDSA key fingerprint is SHA256:YPSriDziNSbmsT/oCkgNitx9EWxV+mXlmgVv6YO2saY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'devbox' (ECDSA) to the list of known hosts.
__ . .
_| |_ | .-. . . .-. :--. |-
|_ _| ;| || |(.-' | | |
|__| `--' `-' `;-| `-' ' ' `-'
/ ; Instance (base-64-trunk 20201019)
`-' https://docs.joyent.com/images/smartos/base
[[email protected] ~]#
Now lets get to setting up some fancy stuff, like a brand new user account that
has access to pfexec
, and zsh, and the rest of our devtools.
First thing we want to do is update everything.
# pkgin up
reading local summary...
processing local summary...
processing remote summary (https://pkgsrc.joyent.com/packages/SmartOS/trunk/x86_64/All)...
pkg_summary.xz 100% 2326KB 581.6KB/s 00:04
# pkgin upgrade -y
The last command will proabably generate a lot of output, but don’t worry. Its updating.
I like zsh, so I’m going to install it, along with the build-essential metapackage and git, which isn’t included in build-essential. This might have something to do with the fact that git-scm was the previous name of the package. Another little gem I’m going to install is mosh. Its an addition to ssh that makes things much nicer on mobile connections that cutout a lot.
# pkgin in -y zsh git build-essential mosh
This will also generate a lot of output. Don’t worry. Its all going according to plan. Next we’ll be setting up a non-root user. To make things a little more friendly, though, we will first create a primary group for that user.
# groupadd spicywolf
UX: groupadd: spicywolf name too long.
Oof. Maybe it worked anyway, right? (It did, of course). Check /etc/group to ensure you didn’t get lolnope’d into oblivion.
# cat /etc/group
root::0:
other::1:root
bin::2:root,daemon
sys::3:root,bin,adm
adm::4:root,daemon
uucp::5:root
mail::6:root,postfix
tty::7:root,adm
nuucp::9:root
staff::10:
daemon::12:root
sysadmin::14:
games::20:
smmsp::25:
upnp::52:
xvm::60:
netadm::65:
slocate::95:
unknown::96:
nobody::60001:
noaccess::60002:
nogroup::65534:
maildrop::934:
postfix::901:
_pkgsrc::999:
spicywolf::1000:
Looks like it worked just fine. Now lets create that user. I want to have the
ability to pfexec
(in place of sudo), so we’ll be taking advantage of the
profiles built into SmartOS for RBAC. To see a full list of roles, you can
simply cat /etc/security/exec_attr
, but the one we care about here is
“Primary Administrator”.
# which zsh
/opt/local/bin/zsh
# useradd -g spicywolf -G staff,games,sysadmin,netadm -d /home/spicywolf -m \
-s /opt/local/bin/zsh -c "Ren Kararou" -P "Primary Administrator" spicywolf
UX: useradd: spicywolf name too long.
UX: useradd: spicywolf name too long.
144 blocks
# passwd spicywolf
New Password:
Re-enter new Password:
passwd: password successfully changed for spicywolf
So that’s basically just figuring out where zsh is installed to, creating user spicywolf with primary group spicywolf and additional groups staff, games, sysadmin, and netadm (no I don’t know why they are named inconsistently, and I don’t care), setting a home directory of /home/spicywolf and creating it if it doesn’t exist (-m), then adding a comment of the user’s name (it me lol) and giving the user the “Primary Administrator” profile. Again, the UX failures are bogus hold overs from times long past. It all still works.
The last command is setting the initial password for the user.
Now we get to test the user. We are going to do this by pulling down ssh keys from github.
# su - spicywolf
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
--- Type one of the keys in parentheses --- q
devbox%
The user works. That’s good. I pressed q to exit the zsh configuration menu and have it launch next time.
$ cd .ssh
$ wget -O authorized_keys https://github.com/karaiwulf.keys
Finally, lets test pfexec:
$ pfexec whoami
root
Perfect. That works, and everything looks fancy. Exit the user and root shells, then login to test mosh.
$ mosh devbox
You should be all set now to go forth and write some code no matter where you are.