Serial Console: Difference between revisions

imported>Samueldr
m I can't even into syntax it seems
serial console login
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{expansion}}
{{expansion}}
== Connect to serial device ==
Most serial console programs require you to specify a serial device and a baud rate.
=== With <code>tio</code> ===
  tio -b 115200 /dev/ttyS0
=== With <code>screen</code> ===
  screen /dev/ttyS0 115200
== Serial devices ==
Serial devices under NixOS will get expose with the following file names.
The file names relate to the driver used for the serial interface.
* <code>/dev/ttyS*</code>
* <code>/dev/ttyUSB*</code>
* <code>/dev/ttyACM*</code>
== Use serial interface as TTY ==
To use a serial device <code>ttyS0</code> as a TTY to log into the device, you have to tell the kernel and you boot loader about the serial configuration.
An example for GRUB bootloader:
  boot.kernelParams = [ "console=ttyS0,115200n8" ];
  boot.loader.grub.extraConfig = "
    serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
    terminal_input serial
    terminal_output serial
  ";
== Unprivileged access to serial device ==
Serial devices under NixOS are created with the group <code>dialout</code> by default.
All users that are part of the group <code>dialout</code> can access serial devices.
Add a user to group <code>dialout</code>:
    users.users.<name>.extraGroups = [ "dialout" ];


== Tips ==
== Tips ==
Line 14: Line 58:


This will give you the exact invocation for your current terminal size.
This will give you the exact invocation for your current terminal size.
In case tmux is used an alternative is to add the following snippet to the <code>tmux.conf</code>
  bind R run "echo \"stty columns $(tmux display -p \#{pane_width}); stty rows $(tmux display -p \#{pane_height})\" | tmux load-buffer - ; tmux paste-buffer"
In this case fixing the terminal size can be achieved by pressing R.
== Serial Console Login ==
There is a long thread here: https://github.com/NixOS/nixpkgs/issues/84105
This configuration seems to work<syntaxhighlight lang="nix">
#
# serial-tty.nix
#
# Serial console configuration for /dev/ttyS0
# Enables login via serial interface
# https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/ttys/getty.nix
# https://github.com/NixOS/nixpkgs/issues/84105
{ config, lib, pkgs, ... }:
{
  # Enable serial console on ttyS0
  boot.kernelParams = [
    "console=ttyS0,115200"
  ];
  # Disable the upstream getty module's automatic configuration for serial-getty@
  # This prevents conflicts with our custom configuration
  systemd.services."serial-getty@" = {
    enable = false;
  };
  # Configure our own serial-getty@ttyS0 service
  systemd.services."serial-getty@ttyS0" = {
    enable = true;
    wantedBy = [ "getty.target" ];
    after = [ "systemd-user-sessions.service" ];
    wants = [ "systemd-user-sessions.service" ];
    serviceConfig = {
      Type = "idle";
      Restart = "always";
      Environment = "TERM=vt220";
      ExecStart = "${pkgs.util-linux}/bin/agetty --login-program ${pkgs.shadow}/bin/login --noclear --keep-baud ttyS0 115200,57600,38400,9600 vt220";
      UtmpIdentifier = "ttyS0";
      StandardInput = "tty";
      StandardOutput = "tty";
      TTYPath = "/dev/ttyS0";
      TTYReset = "yes";
      TTYVHangup = "yes";
      IgnoreSIGPIPE = "no";
      SendSIGHUP = "yes";
    };
  };
  # Enable early console output during boot
  #boot.consoleLogLevel = 7;  # Show all kernel messages
  boot.initrd.verbose = true;  # Show initrd messages
}
</syntaxhighlight>