Port série depuis une VM
Qemu macos
wget http://ports.ubuntu.com/ubuntu-ports/dists/noble/main/installer-arm64/current/images/device-tree/vmlinuz wget http://ports.ubuntu.com/ubuntu-ports/dists/noble/main/installer-arm64/current/images/device-tree/initrd.gz -O initrd.img
- vm.sh
#!/bin/bash -xe if [ -z "$1" ]; then echo "Erreur : serial device needed (/dev/cu*)" echo "Usage: $0 <argument>" exit 1 fi IMG=ubuntu-24.04-server-cloudimg-arm64.img if [ ! -f vm-disk.qcow2 ]; then qemu-img create -f qcow2 -b $IMG -F qcow2 vm-disk.qcow2 10G fi ./cloud-localds seed.img user-data.yaml metadata.yaml qemu-system-aarch64 \ -machine type=virt,iommu=smmuv3 \ -accel hvf \ -cpu max \ -m 6G \ -smp 2 \ -nographic \ -kernel vmlinuz \ -initrd initrd.img \ -append "root=LABEL=cloudimg-rootfs ro console=ttyAMA0 earlycon=pl011,0x09000000" \ -rtc base=utc \ -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \ -device virtio-net-pci,netdev=net00 \ -drive if=virtio,format=raw,file=seed.img \ -drive if=virtio,format=qcow2,file=vm-disk.qcow2 \ -virtfs local,path=/Users/jumper/projets/diy,mount_tag=hostshare,security_model=mapped-xattr \ -chardev serial,path=$1,id=hostusbserial -device pci-serial,chardev=hostusbserial
- metadata.yaml
instance-id: iid-local01 local-hostname: cloudimg
- user-data.yaml
password: abcdefgh chpasswd: expire: False ssh_pwauth: True ssh_authorized_keys: - ssh-ed25519 AA... pub key jumper@host.com timezone: Europe/Paris package_update: true packages: - picocom - bindfs write_files: - path: /usr/local/bin/mount-local.sh permissions: '0755' owner: root:root content: | #!/bin/bash -e mkdir -p /home/ubuntu/diy mount -t 9p -o trans=virtio,version=9p2000.L hostshare /home/ubuntu/diy bindfs --map=501/1000:@dialout/@1000 /home/ubuntu/diy /home/ubuntu/diy - path: /etc/systemd/system/mount-local.service permissions: '0644' owner: root:root content: | [Unit] Description=Mount local After=network.target [Service] Type=simple ExecStart=/usr/local/bin/mount-local.sh RemainAfterExit=no [Install] WantedBy=multi-user.target runcmd: - echo 'export LC_TIME=fr_FR.UTF-8' >> /etc/profile.d/24h.sh - systemctl daemon-reload - systemctl enable mount-local.service - systemctl start mount-local.service
cloud-localds pour macos (getopt sous macos ne se comporte pas de la même manière que la version GNU)
https://gist.github.com/coughingmouse/ab76deae36cf411e96f8010250c55d58?permalink_comment_id=4991685
brew install cdrtools curl curl -fsSL https://raw.githubusercontent.com/canonical/cloud-utils/main/bin/cloud-localds -o cloud-localds sed -i '' -e 's/genisoimage/mkisofs/g' cloud-localds sed -i '' -e 's/.*confused by additional args/\[ \$\# \-le 9 \] \|\| bad_Usage \"confused by additional args/g' cloud-localds sed -i '' -e 's/output\=\$1/output\=\$7/' cloud-localds sed -i '' -e 's/userdata\=$2/userdata\=\$8/' cloud-localds sed -i '' -e 's/metadata\=$3/metadata\=\$9/' cloud-localds chmod +x cloud-localds
Connecter l'adaptateur puis déterminer le device créé :
ls /dev/cu.* /dev/cu.Bluetooth-Incoming-Port /dev/cu.debug-console /dev/cu.usbserial-0001
Lancer la VM :
./vm.sh /dev/cu.usbserial-0001 [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x610f0000] [ 0.000000] Linux version 6.8.0-71-generic (buildd@bos03-arm64-036) (aarch64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:44:45 UTC 2025 (Ubuntu 6.8.0-71.71-generic 6.8.12) [ 0.000000] KASLR enabled [ 0.000000] random: crng init done [ 0.000000] Machine model: linux,dummy-virt .... [ OK ] Finished cloud-final.service - Cloud-init: Final Stage. [ OK ] Reached target cloud-init.target - Cloud-init target. Ubuntu 24.04.3 LTS cloudimg
Se logguer sur la VM
ssh -o StrictHostKeyChecking=no ubuntu@localhost -p 2222
Vérifier la présence du port série
$ sudo dmesg | grep tty [ 0.000000] Kernel command line: root=LABEL=cloudimg-rootfs ro console=ttyAMA0 earlycon=pl011,0x09000000 [ 0.028217] 9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq = 13, base_baud = 0) is a PL011 rev1 [ 0.029005] printk: legacy console [ttyAMA0] enabled [ 1.021747] 0000:00:03.0: ttyS0 at I/O 0x1160 (irq = 31, base_baud = 115200) is a 16550A [ 2.561681] systemd[1]: Created slice system-serial\x2dgetty.slice - Slice /system/serial-getty. [ 2.566955] systemd[1]: Expecting device dev-ttyAMA0.device - /dev/ttyAMA0...
2 tty sont trouvées :
- /dev/ttyAMA0 : utilisée par le noyau pour envoyer les logs de démarrage sur la stdout
- /dev/ttyS0 : celle connectée à l'adaptateur série
Pour tester, il faut relier les pin RX et TX de l'adaptateur puis lancer picocom :
sudo picocom /dev/ttyS0 picocom v3.1 port is : /dev/ttyS0 flowcontrol : none baudrate is : 9600 parity is : none databits are : 8 stopbits are : 1 escape is : C-a local echo is : no noinit is : no noreset is : no hangup is : no nolock is : no send_cmd is : sz -vv receive_cmd is : rz -vv -E imap is : omap is : emap is : crcrlf,delbs, logfile is : none initstring : none exit_after is : not set exit is : no Type [C-a] [C-h] to see available commands Terminal ready
Taper n'importe quel caractère, ils doivent apparaitre sur la console. Si ce n'est pas le cas, vérifier le nom du device fournit en entrée à la VM. Si l'adaptateur a été débranché puis rebranché pendant que la VM tourne, il faut la relancer.
Taper CTRL + a suivi de CTRL + x pour sortir de picocom.