realisations:esp32:serie

Port série depuis une VM

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.

  • realisations/esp32/serie
  • Dernière modification : 2025/09/01 07:06