Bought an SMC 8648T 48-port Gigabit managed switch for $135. It runs an IOS-like management interface, but it has some quirks.
Saving Configuration
Good old "wr mem" does not work!
Vty-0#wr m Write to FLASH Programming. Write to FLASH finish. Success. Vty-0#
Instead, the shortest form to save config is:
Vty-0#cop r s Startup configuration file name [startup.cfg]: Write to FLASH Programming. Write to FLASH finish. Success. Vty-0#
VLAN 1 Special Case
If you want to use VLAN 1 as part of an 802.1Q trunk things get a little tricky. It is the default native VLAN (PVID) for all ports on the switch. You cannot simply disable the native VLAN feature, the switch requires something to be there! This means making a bogus VLAN:
Vty-0(config)#vlan database Vty-0(config-vlan)#vlan 4094 name BLACKHOLE media ethernet state suspend
Notice that this VLAN is created and immediately suspended. Next, to associate the VLAN with the port:
Vty-0(config)#interface ethernet 1/1 Vty-0(config-if-e1/1)#switchport mode hybrid Vty-0(config-if-e1/1)#switchport allowed vlan add 4094 untagged Vty-0(config-if-e1/1)#switchport native vlan 4094 Vty-0(config-if-e1/1)#switchport allowed vlan remove 1 Vty-0(config-if-e1/1)#switchport allowed vlan add 1 tagged
Notice that VLAN 4094 needs to be added as untagged first before it can be set as the native VLAN. VLAN 1 is removed from untagged and then re-added as tagged. This has an unsettling effect:
interface ethernet 1/1 switchport allowed vlan add 1,4094 untagged switchport native vlan 4094 switchport allowed vlan add 1 tagged
where VLAN 1 is both tagged and untagged on the same port at the same time! However, testing shows that despite this contradictory configuration, VLAN egress frames always emerge tagged. This is now the desired effect of being able to use VLAN 1 as part of a trunk.