Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testing rustysd inside of a docker container? #15

Closed
pwFoo opened this issue Jan 31, 2020 · 9 comments
Closed

Testing rustysd inside of a docker container? #15

pwFoo opened this issue Jan 31, 2020 · 9 comments

Comments

@pwFoo
Copy link

pwFoo commented Jan 31, 2020

Hi @KillingSpark ,
have you build a minimal docker image to run rustysd with a simple example unit as docker container pid1 (#9)?

I would like to test it as docker container and maybe build a small system based on rustysd. I use the build tool linuxkit to build an os image based of docker containers. So a minimal image with rustysd as entrypoint would be great as starting point.

Regards

@MggMuggins
Copy link
Contributor

I'm pretty sure what you're talking about is in https://github.com/KillingSpark/rustysd/tree/master/dockerfiles. See the readme there to run it. It worked pretty marvelously for me.

@cdbattags
Copy link

Hi @KillingSpark ,
have you build a minimal docker image to run rustysd with a simple example unit as docker container pid1 (#9)?

I would like to test it as docker container and maybe build a small system based on rustysd. I use the build tool linuxkit to build an os image based of docker containers. So a minimal image with rustysd as entrypoint would be great as starting point.

Regards

I would be very interested in you linuxkit yml files whenever you get this up and running, please!

Also, what use case do you have for a linuxkit unikernel setup? If you don't mind me asking.

@pwFoo
Copy link
Author

pwFoo commented Jan 31, 2020

Yes, I get binaries build, but I need to prepare build env before. Would be nice to run a runstysd/build container with docker and get the binaries to /target directory at the end...

Created a simple alpine based image which starts rustysd with the default unit

# docker run --rm -ti rustysd                                              
[2020-01-31][19:26:03][rustysd::units::loading][TRACE] "./unitfiles/default.target", 1
[2020-01-31][19:26:03][rustysd][TRACE] Finished loading units
[2020-01-31][19:26:03][rustysd::units::dependency_resolving][TRACE] Id 1 references ids: []
[2020-01-31][19:26:03][rustysd][TRACE] Finished pruning units
[2020-01-31][19:26:03][rustysd][TRACE] Unit dependencies passed sanity checks
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Root unit: default.target
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Activate id: 1
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Lock unit: 1
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Locked unit: 1
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Lock status for: default.target
[2020-01-31][19:26:03][rustysd::units::activate][TRACE] Locked status for: default.target
[2020-01-31][19:26:03][rustysd::units::units][TRACE] Reached target default.target

But I'm new with systemd / rustysd and have to learn how to spawn a shell from unit...

I played with linuxkit before to build fully custom systems for example without the typical onboot / services structure or replaced runc / containerd with a custom runc or docker / podman build. Linuxkit is a awesome build environment for that use case!

I think it should be easy to build a running minimal system with rustysd + shell (if I understand how to do it with units and create a rustysd-builder first...

@pwFoo
Copy link
Author

pwFoo commented Jan 31, 2020

Tried a getty service, but fails with:

[getty.service][STDERR] EXECV: "/sbin/getty" ["getty", "-l", "/bin/sh", "-n", "115200", "/dev/tty1"]
[2020-01-31][20:40:17][rustysd::notification_handler][TRACE] Interrupted stdout select because the eventfd fired
[2020-01-31][20:40:17][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-01-31][20:40:17][rustysd::notification_handler][TRACE] Reset eventfd value
[getty.service][STDERR] getty: setsid: Operation not permitted

So I changed it to /bin/sh

# docker run --rm -ti --privileged rustysd 
[2020-01-31][20:41:09][rustysd::units::loading][TRACE] "./unitfiles/default.target", 1
[2020-01-31][20:41:09][rustysd::units::loading][TRACE] "./unitfiles/getty.service", 2
[2020-01-31][20:41:09][rustysd::units::unit_parsing::service_unit][TRACE] UID: Uid(0)
[2020-01-31][20:41:09][rustysd::units::loading][TRACE] "./unitfiles/getty.target", 3
[2020-01-31][20:41:09][rustysd][TRACE] Finished loading units
[2020-01-31][20:41:09][rustysd::units::dependency_resolving][TRACE] Id 1 references ids: [3]
[2020-01-31][20:41:09][rustysd::units::dependency_resolving][TRACE] Id 3 references ids: [1, 2]
[2020-01-31][20:41:09][rustysd::units::dependency_resolving][TRACE] Id 2 references ids: [3]
[2020-01-31][20:41:09][rustysd][TRACE] Finished pruning units
[2020-01-31][20:41:09][rustysd][TRACE] Unit dependencies passed sanity checks
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Root unit: getty.service
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Activate id: 2
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock unit: 2
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked unit: 2
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock status for: getty.service
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked status for: getty.service
[2020-01-31][20:41:09][rustysd::services::services][TRACE] Start service getty.service
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Interrupted stderr select because the eventfd fired
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Interrupted stdout select because the eventfd fired
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-01-31][20:41:09][rustysd::services::fork_parent][TRACE] [FORK_PARENT] Service: getty.service forked with pid: 18
[2020-01-31][20:41:09][rustysd::services::fork_parent][TRACE] [FORK_PARENT] service getty.service doesnt notify
[2020-01-31][20:41:09][rustysd::socket_activation][TRACE] Interrupted socketactivation select because the eventfd fired
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-01-31][20:41:09][rustysd::socket_activation][TRACE] Reset eventfd value
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Interrupted notification select because the eventfd fired
[2020-01-31][20:41:09][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-01-31][20:41:09][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Activate id: 3
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock unit: 3
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked unit: 3
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock status for: getty.target
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked status for: getty.target
[2020-01-31][20:41:09][rustysd::units::units][TRACE] Reached target getty.target
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Activate id: 1
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock unit: 1
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked unit: 1
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Lock status for: default.target
[2020-01-31][20:41:09][rustysd::units::activate][TRACE] Locked status for: default.target
[2020-01-31][20:41:09][rustysd::units::units][TRACE] Reached target default.target
[getty.service][STDERR] EXECV: "/bin/sh" ["sh"]

And I have a running container with rustysd and a sh process...

# docker exec -ti unruffled_joliot ps
PID   USER     TIME  COMMAND
    1 root      0:00 /rustysd
   18 root      0:00 sh
   30 root      0:00 ps

unit file getty.service (=shell)

[Unit]
Description= Start getty on /dev/tty1

[Service]
#ExecStart=/sbin/getty -l /bin/sh -n 115200 /dev/tty1
ExecStart=/bin/sh
Type=simple
Restart=always

#StandardInput=/dev/tty1
#StandardInput=/dev/tty1
#StandardOutput=/dev/tty1
#TTYPath=/dev/tty1
#TTYReset=yes
#TTYVHangup=yes

[Install]
WantedBy=getty.target

So is it possible with rustysd to start getty-service in foreground / interactive / focused tty?

@cdbattags
Copy link

Mind tossing me the linuxkit .yml file so I can try and assist?

@pwFoo
Copy link
Author

pwFoo commented Jan 31, 2020

At the moment it isn't a linuxkit file, just a docker image with alpine linux + rustysd binaries.
Works fine so far as pid1, but can't get a shell if I run it with docker run --rm -ti <IMG>

I try to get a shell in the end of the rustysd boot, but don't know if that really could work as I think and if rustysd supports to move PID1 to the background and end up in a working shell (service)?

@KillingSpark
Copy link
Owner

I am sorry I can't be of too much assistance here but I don't exactly know how docker and getty interact. I think you should look into the error getty throws out

getty: setsid: Operation not permitted

@pwFoo
Copy link
Author

pwFoo commented Feb 1, 2020

Yes, thats right. But I don't find why. Maybe it's getty related,.. agetty works.

@cdbattags
Simplest linuxkit yml

kernel:
  image: linuxkit/kernel:4.19.99
  cmdline: "console=tty0 console=ttyS0 console=ttyAMA0"
init:
  - pwfoo/rustysd:latest

It boots fine with qemu, but you won't end in a working shell / terminal...

[...]
[    1.456426] cdrom: Uniform CD-ROM driver Revision: 3.20
[    1.459274] sr 1:0:0:0: Attached scsi generic sg0 type 5
[    1.467787] Freeing unused kernel image memory: 1584K
[    1.471136] Write protecting the kernel read-only data: 18432k
[    1.474425] Freeing unused kernel image memory: 2028K
[    1.476305] Freeing unused kernel image memory: 1080K
[    1.477948] Run /init as init process
[    1.510152] random: rustysd: uninitialized urandom read (16 bytes read)
[2020-02-01][08:52:14][rustysd::units::loading][TRACE] "./unitfiles/default.target", 1
[2020-02-01][08:52:14][rustysd::units::loading][TRACE] "./unitfiles/getty.service", 2
[2020-02-01][08:52:14][rustysd::units::unit_parsing::service_unit][TRACE] UID: Uid(0)
[2020-02-01][08:52:14][rustysd::units::loading][TRACE] "./unitfiles/getty.target", 3
[2020-02-01][08:52:14][rustysd][TRACE] Finished loading units
[2020-02-01][08:52:14][rustysd::units::dependency_resolving][TRACE] Id 1 references ids: [3]
[2020-02-01][08:52:14][rustysd::units::dependency_resolving][TRACE] Id 3 references ids: [1, 2]
[2020-02-01][08:52:14][rustysd::units::dependency_resolving][TRACE] Id 2 references ids: [3]
[2020-02-01][08:52:14][rustysd][TRACE] Finished pruning units
[2020-02-01][08:52:14][rustysd][TRACE] Unit dependencies passed sanity checks
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Root unit: getty.service[    1.528810] random: rustysd: uninitialized urandom read (16 bytes read)
[    1.530799] random: rustysd: uninitialized urandom read (16 bytes read)

[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Activate id: 2
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock unit: 2
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked unit: 2
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock status for: getty.service
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked status for: getty.service
[2020-02-01][08:52:14][rustysd::services::services][TRACE] Start service getty.service
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Interrupted notification select because the eventfd fired
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Interrupted stdout select because the eventfd fired
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Interrupted stderr select because the eventfd fired
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-02-01][08:52:14][rustysd::notification_handler][TRACE] Reset eventfd value
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-02-01][08:52:14][rustysd::socket_activation][TRACE] Interrupted socketactivation select because the eventfd fired
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] reset pipe eventfd
[2020-02-01][08:52:14][rustysd::platform::eventfd::pipe_eventfd][TRACE] notify eventfd
[2020-02-01][08:52:14][rustysd::services::fork_parent][TRACE] [FORK_PARENT] Service: getty.service forked with pid: 222
[2020-02-01][08:52:14][rustysd::socket_activation][TRACE] Reset eventfd value
[2020-02-01][08:52:14][rustysd::services::fork_parent][TRACE] [FORK_PARENT] service getty.service doesnt notify
[getty.service][STDERR] EXECV: "/sbin/agetty" ["agetty", "--autologin", "root", "--skip-login", "--keep-baud", "tty1"]
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Activate id: 3
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock unit: 3
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked unit: 3
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock status for: getty.target
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked status for: getty.target
[2020-02-01][08:52:14][rustysd::units::units][TRACE] Reached target getty.target
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Activate id: 1
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock unit: 1
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked unit: 1
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Lock status for: default.target
[2020-02-01][08:52:14][rustysd::units::activate][TRACE] Locked status for: default.target
[2020-02-01][08:52:14][rustysd::units::units][TRACE] Reached target default.target
login[223]: root login on 'tty1'

@pwFoo
Copy link
Author

pwFoo commented Feb 1, 2020

rustysd works fine as systemd replacement inside of docker containers! rustysd runs as pid1 and services started.

tty problem was related to qemu / console settings and works fine with hardware on tty1.

So time to play with rustysd 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants