Category: Linux
Linux 操作系统
ch341-uart converter now disconnected from ttyUSB0
usb 1-3.4: USB disconnect, device number 18
usb 1-3.1: new full-speed USB device number 19 using xhci_hcd
usb 1-3.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.54
usb 1-3.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 1-3.1: Product: USB2.0-Ser!
ch341 1-3.1:1.0: ch341-uart converter detected
ch341-uart ttyUSB0: break control not supported, using simulated break
usb 1-3.1: ch341-uart converter now attached to ttyUSB0
usb 1-3.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1
ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
ch341 1-3.1:1.0: device disconnected
Solution
sudo mv /usr/lib/udev/rules.d/90-brltty-device.rules /usr/lib/udev/rules.d/90-brltty-device.rules.disabled
sudo mv /usr/lib/udev/rules.d/90-brltty-uinput.rules /usr/lib/udev/rules.d/90-brltty-uinput.rules.disabled
sudo udevadm control --reload-rules
Increase /tmp size for systemd container
# systemd-nspawn --tmpfs=/tmp:nosuid,size=256M ...
faccessat2 workaround for old systemd
The faccessat2 system call is denied by old systemd container, this is a workaround to make it works again and without re-build from source code.
faccessat function is a known way to use the faccessat2 system call in glibc, editing libc.so binary to fallback to the user-space implementation.
00000000000de3e0 <faccessat>: ..... de448: 7100989f cmp w4, #0x26 de44c: 540005e1 b.ne de508 <faccessat+0x128> ..... => ..... de448: 7100989f cmp w4, #0x26 de44c: d503201f nop .....
Equivalent to the C source code:
int
__faccessat (int fd, const char *file, int mode, int flag)
{
int ret = INLINE_SYSCALL_CALL (faccessat2, fd, file, mode, flag);
#if __ASSUME_FACCESSAT2
return ret;
#else
if (ret == 0 /* || errno != ENOSYS */)
return ret;
if (flag & ~(AT_SYMLINK_NOFOLLOW | AT_EACCESS))
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
if ((flag == 0 || ((flag & ~AT_EACCESS) == 0 && ! __libc_enable_secure)))
return INLINE_SYSCALL (faccessat, 3, fd, file, mode);
struct stat64 stats;
if (__fstatat64 (fd, file, &stats, flag & AT_SYMLINK_NOFOLLOW))
return -1;
mode &= (X_OK | W_OK | R_OK); /* Clear any bogus bits. */
# if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH
# error Oops, portability assumptions incorrect.
# endif
if (mode == F_OK)
return 0; /* The file exists. */
uid_t uid = (flag & AT_EACCESS) ? __geteuid () : __getuid ();
/* The super-user can read and write any file, and execute any file
that anyone can execute. */
if (uid == 0 && ((mode & X_OK) == 0
|| (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
return 0;
int granted = (uid == stats.st_uid
? (unsigned int) (stats.st_mode & (mode << 6)) >> 6
: (stats.st_gid == ((flag & AT_EACCESS)
? __getegid () : __getgid ())
|| __group_member (stats.st_gid))
? (unsigned int) (stats.st_mode & (mode << 3)) >> 3
: (stats.st_mode & mode));
if (granted == mode)
return 0;
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EACCES);
#endif /* !__ASSUME_FACCESSAT2 */
}
Systemd network DHCP and Static at same time
/etc/systemd/network/eth0.network
[Match] Name=eth0 [Network] DHCP=yes [Address] Address=104.21.64.95/32 [Address] Address=2606:4700:3037::ac43::1/64
Linux socket bind IPv6 only
Socket options
IPv6 support some protocol-specific socket options that can be set with setsockopt and read with getsockopt. The socket option level for IPv6 is IPPROTO_IPV6. A boolean integer flag is zero with it is false, otherwise true.
IPV6_V6ONLY
If this flag is set to true (nonzero), then the socket is restricted to sending and receiving IPv6 packets only. In this case, an IPv4 and an IPv6 application can bind to a single port at the same time.
If this flag is set to false (zero), then the socket can be used to send and receive packets to and from an IPv6 address or an IPv4-mapped IPv6 address.
The argument is a pointer to a boolean value in an integer.
The default value for this flag is defined by the contents of the file /proc/sys/net/ipv6/bindv6only. The default value for that file is 0 (false).
Example
int one = 1; setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof (one));
IP addr-label persistent by systemd
This is an example shows how to make IP address label persistent by systemd-networkd.
/etc/systemd/network/eth0.network :
[Match] Name=eth0 [Network] Address=192.168.0.1/24 Gateway=192.168.0.254 DNS=192.168.0.254 [IPv6AddressLabel] Label=100 Prefix=2409::/16 [IPv6AddressLabel] Label=100 Prefix=2606::/16
It’s successful if you can see labels that you configured :
$ ip addrl
prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2606::/16 dev br0 label 100 prefix 2409::/16 dev br0 label 100 prefix 3ffe::/16 label 12 prefix 2002::/16 label 2 prefix fec0::/10 label 11 prefix fc00::/7 label 5 prefix ::/0 label 1
Decrease the tabs bar height in gnome terminal
~/.config/gtk-3.0/gtk.css:
/* Decrease the tabs bar height in gnome-terminal
* See:
* https://stackoverflow.com/questions/36869701/decrease-the-tabs-bar-height-in-gnome-terminal
*/
terminal-window notebook > header.top button {
padding: 0 0 0 0;
background-image: none;
border: 0;
margin-right: 10px;
}
terminal-window notebook > header.top > tabs > tab {
margin: 0 0 0 0;
padding: 0 0 0 0;
}
terminal-window notebook > header.top > tabs > tab label {
padding: 0 0 0 0;
margin: 0 0 0 0;
}
Before
After
From: https://stackoverflow.com/questions/36869701/decrease-the-tabs-bar-height-in-gnome-terminal
RK3399: Tune ethernet irq affinity
Handle interrupts of ethernet device on high performance cpus.
/etc/systemd/system/irq-eth0.service
[Unit] Description=IRQ SMP Affinity After=network.target [Service] Type=oneshot ExecStart=/usr/bin/bash -c 'echo 4-5 > /proc/irq/31/smp_affinity_list' [Install] WantedBy=multi-user.target
Creating swap files faster
sudo fallocate -l 100G /path/to/swap.img
sudo chmod 0600 /path/to/swap.img
sudo mkswap /path/to/swap.img