ALSA 配置: 默认静音时用 amixer 解除主音量和 PCM 音量静音

理解和使用 alsa 配置-默认静音,必须先用amixer解除主音量和pcm音量的静音 理解和使用alsa配置-默认静音,必须先用amixer解除主音量和pcm音量的静音 http://blog.chinaunix.net/uid-20564848-id-74727.html ALSA声卡驱动程序的配置 对于声卡驱动程序,除了内核自带的驱动程序之外,您还可以使用Advanced Linux Sound Architecture (ALSA,http://www.alsa-project.org/) 提供的驱动程序。它支持一系列主流声卡,同时它和内核 的声音结构互相兼容,在某种程度上,可以说是内核的声卡驱动模块的补充。 ALSA的声卡驱动程序的一般命名规则是snd-card-<soundcard>。soundcard代表不同类型的声卡。例如,对于所有 的16位Soundblaster声卡,它们对应的驱动程序模块为snd-card-sb16。 若与需要linux内核声音驱动的向后兼容性,您还需要两个模块snd-pcm-oss和snd-mixer-oss。对于amixer设置的多个混音 器,它们都是针对不同的设备的。比如CD通道的设置是针对CD播放器的。而很多应用程序,如象mpg123,xmms,realplayer,都要依赖 PCM通道的设置。MIC代表麦克风。不同的Gain部分对于不同的使用能提供特别的增益。 缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。 amixer -c 0 sset ‘Master’,0 100%,100% unmute amixer -c 0 sset ‘PCM ‘,0 100% unmute 选项包括mute,unmute,capture,nocapture,rec,norec,数字或left:right。amixer不带参数运行时, 返回声卡上所有通道的设置情况。 为了在每次插入声卡驱动模块时,都打开静音,您可以在/etc/modules.conf加入下列语句: post-install snd-card-sb16 amixer -c 0 sset ‘Master’,0 100%,100% unmute && amixer -c 0 sset ‘PCM ‘,0 100% unmute 在成功插入了alsa声卡模块之后,系统会出现/proc/asound目录,这个目录描述了声卡的工作情况,以及创建的设备文件。 在您加载snd-pcm-oss设备模块之后,你也能使用与oss兼容的方式存取声卡,这时如下的映射会被完成: 表 5-3 ALSA设备 OSS设备 次设备号 /dev/snd/pcmC0D0 /dev/audio0 (/dev /audio) 4 /dev/snd/pcmC0D0 /dev /dsp0 (/dev/dsp) 3 ...

Created 1016-01-01 · Updated 9096-10-09 · 2 min · 393 words · -

tr command

tr command # 转大写 echo 'hello' | tr '[:lower:]' '[:upper:]' # 转小写 echo 'HELLO' | tr '[:upper:]' '[:lower:]' # 删除文本中的换行符 tr -d '\n' < input.txt > output.txt # 删除空行 cat file | tr -s "\n" > new_file tr -s "[\012]" < plan.txt tr -s ["\n"] < plan.txt 什么是 tr 命令? tr, translate 的简写 \NNN character with octal value NNN (1 to 3 octal digits) \\ backslash \a audible BEL \b backspace \f form feed \n new line \r return \t horizontal tab \v vertical tab CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order [CHAR*] in SET2, copies of CHAR until length of SET1 [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0 [:alnum:] all letters and digits [:alpha:] all letters [:blank:] all horizontal whitespace [:cntrl:] all control characters [:digit:] all digits [:graph:] all printable characters, not including space [:lower:] all lower case letters [:print:] all printable characters, including space [:punct:] all punctuation characters [:space:] all horizontal or vertical whitespace [:upper:] all upper case letters [:xdigit:] all hexadecimal digits [=CHAR=] all characters which are equivalent to CHAR https://blog.csdn.net/jeffreyst_zb/article/details/8047065 通过使用tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed的 (极其) 简化的变体: 它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr所能够做的。 ...

Created 14146-02-14 · Updated 9096-10-09 · 6 min · 1089 words · -

grub

grub 判断是否由 grub 引导 journalctl -b | grep -i grub https://www.gnu.org/software/grub/manual/grub/grub.html#Simple-configuration GRUB 来自 GRand Unified Bootloader 的缩写。它的功能是在启动时从 BIOS 接管掌控、加载自身、加载 Linux 内核到内存,然后再把执行权交给内核。一旦内核开始掌控,GRUB 就完成了它的任务,也就不再需要了。 GRUB 支持多种 Linux 内核,并允许用户在启动时通过菜单在其中选择。 GRUB 菜单提供了一个 “救援rescue” 内核,用于故障排除或者由于某些原因导致的常规内核不能完成启动过程。 grub.cfg 文件是 GRUB 配置文件。它由 grub2-mkconfig 程序根据用户的配置使用一组主配置文件以及 grub 默认文件而生成。/boot/grub2/grub.cfg 文件在 Linux 安装时会初次生成,安装新内核时又会重新生成。 grub.cfg 文件包括了类似 Bash 脚本的代码以及一个按照安装顺序排序的已安装内核列表。 grub.cfg 的主要配置文件都在 /etc/grub.d 目录。该目录中的每个文件都包含了最终会整合到 grub.cfg 文件中的 GRUB 代码。这些配置文件的命名模式以排序方式设计,这使得最终的 grub.cfg 文件可以按正确的顺序整合而成。每个文件都有注释表明该部分的开始和结束,这些注释也是最终的 grub.cfg 文件的一部分,从而可以看出每个部分是由哪个文件生成。 grub config file path Arch Linux:/boot/grub/grub.cfg RHEL/Fedora:/boot/grub2/grub.cfg EFI 系统:/boot/efi/EFI/<distro>/grub.cfg 临时修改 grub.cfg(直接编辑) 直接编辑 /boot/grub/grub.cfg 可以立即生效,无需重启(下次启动即生效),但不是持久化的——下次运行 grub-mkconfig 时会被覆盖。 ...

Created 2026-05-02 · Updated 9096-10-09 · 2 min · 415 words · -

Debian Postfix and Dovecot

Debian Postfix and Dovecot 这是 2013 年的 Debian 上手记录:本机装 Postfix + Dovecot,能本地收发。完整邮箱套件(Mailcow 等)和云端方案(AWS SES / Workspace)见 Email Hosting: Mailcow、Postfix 与云端方案。 install postfix sudo apt-get install postfix internet site, wiloon.com; sudo dpkg-reconfigure postfix 4. 编辑main.cf emacs /etc/postfix/main.cf [/shel] 添加以下两行 home_mailbox = maildir/ 这个步骤其实为可选操作。mailbox类型可以是mbox或者是maildir,互有优缺点。但如果将来还打算扩展webmail这类应用,最好选为Maildir,这样兼容性更好一些。对于dovecot pop3而言,倒是无所谓了。具体mbox和maildir有什么区别,去参考《postfix权威指南》 mailbox_command = mydestination = wiloon.com,localhost.localdomain,localhost mydestination mydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要接收什么样的邮件。比如: 你的用户的邮件地址为user@domain.com, 也就是你的域为domain.com, 则你就需要接收所有收件人为user_name@domain.com的邮件。与myorigin一样,缺省地,postfix使用本地主机名作为 mydestination。如: 安装mailutils # apt-get install mailutils 创建用户user1 ```bash sudo useradd -m -s /bin/bash user1 sudo passwd user1 在mydestination后加上wiloon.com,成为这个样子: ...

Created 12126-05-12 · Updated 2026-09-02 · 2 min · 408 words · -

Email Hosting: Mailcow、Postfix 与云端方案

自建邮箱常被说成「装一套 Postfix」,云厂商又常被说成「AWS 有邮件服务」。这两句话都只对了一半:Postfix 只是 SMTP 引擎;AWS 现在给新用户提供的是发信 API,不是完整邮箱。下面按用途把常见方案摊开。 更早的 Debian 上手记录见 Debian Postfix and Dovecot,协议背景见 SMTP 和 Dovecot。 先分清三层 层 解决什么 用户能不能在 Thunderbird / 手机里收信 MTA 在互联网上收发 SMTP 不能。还缺 IMAP/POP3 和存储 完整邮箱 SMTP + IMAP + 反垃圾 + DKIM +(可选)Webmail 能 应用发信 程序发验证码、告警、营销信 不能当个人收件箱 Mailcow 属于第二层,内部的 SMTP 容器仍是 Postfix。Amazon SES 属于第三层。把三者放在同一张「哪个更好」的表里没有意义。 graph TD A["完整邮箱Mailcow / Stalwart / Workspace"] B["MTAPostfix / Exim"] C["应用发信SES / Postal / ACS"] A --> B A -.->|"也可把出站交给"| C C -.->|"不提供 IMAP"| D["S3 / Lambda / webhook"] 自建:Postfix + Dovecot 这一路 底层仍是同一套老软件,差别在谁帮你接线。 ...

Created 2026-09-02 · Updated 2026-09-02 · 5 min · 907 words · -

mktemp: 安全创建临时文件与目录

mktemp mktemp 用来安全地创建临时文件或临时目录,并把路径打印到标准输出。名字里带随机段,避免多个进程同时写死 /tmp/foo 时互相踩踏或被抢占。 脚本里需要临时落盘时,优先用 mktemp,不要手写固定路径。 基本用法 不传参数时,默认在 $TMPDIR(未设置则为 /tmp)下创建文件,模板类似 tmp.XXXXXXXXXX: tmp=$(mktemp) echo "path=$tmp" echo hello > "$tmp" rm -f "$tmp" 输出示例: /tmp/tmp.aB3kX9pQ2r 自定义模板 模板最后一个路径分量里至少要有 3 个连续的 X,X 会被替换成随机字符: # file under /tmp f=$(mktemp /tmp/myapp.XXXXXX) # with suffix f=$(mktemp --suffix=.log /tmp/myapp.XXXXXX) 创建临时目录 -d / --directory 创建目录而不是文件: workdir=$(mktemp -d) # or workdir=$(mktemp -d /tmp/build.XXXXXX) 权限:文件一般为 u+rw,目录一般为 u+rwx(再受 umask 约束)。 指定父目录 -p DIR / --tmpdir[=DIR]:相对某个目录解释模板。未写 DIR 时用 $TMPDIR,再否则 /tmp: f=$(mktemp -p /var/tmp myapp.XXXXXX) d=$(mktemp -d --tmpdir="$HOME/tmp" work.XXXXXX) 脚本里的常见写法 创建后记得清理。可用 trap 在退出时删除: ...

Created 27276-08-27 · Updated 27276-08-27 · 1 min · 132 words · -

archlinux packages

archlinux packages 本文逐步记录我的 Arch Linux 系统中安装的软件包,目标是了解每个包在当前系统中的用途,以及它是否是必要的依赖(能否安全删除)。 aalib: ASCII art graphic library aardvark-dns: Authoritative DNS server for A/AAAA container records abseil-cpp: Google 开源的 C++ 基础库,补充标准库能力,详见 abseil-cpp adwaita-fonts: GNOME Adwaita 字体,被 wechat 等应用依赖 ansible: IT automation tool ansible-core: Ansible core engine aom: Alliance for Open Media video codec appstream: Provides a standard for creating app stores across distributions archlinux-appstream-data: Arch Linux application database for AppStream-based software centers at-spi2-core: Protocol definitions and daemon for D-Bus at-spi audit: Userspace components of the audit framework avahi: Service Discovery for Linux using mDNS/DNS-SD (compatible with Bonjour) baloo-widgets: KDE Baloo 搜索框架集成小部件 bluez-libs: Deprecated libraries for the bluetooth protocol stack boost-libs: Boost C++ 通用库运行时动态库,详见 boost-libs botan: Crypto library written in C++ bubblewrap: 非特权沙箱工具,详见 bubblewrap btrfs-progs: Userspace utilities to manage btrfs filesystems c-ares: 异步 DNS 解析 C 库,被 curl、Node.js 等广泛使用 ca-certificates-mozilla: Mozilla’s set of trusted CA certificates cfitsio: C/Fortran library for reading and writing FITS data format files clang: C 语言族编译器前端(基于 LLVM),包含 clang-analyzer 和 clang-tools-extra。当前系统被以下包依赖:doxygen(文档生成工具)、kdevelop(KDE 集成开发环境)、shiboken6(Qt6 Python 绑定代码生成器)。 chrony: Lightweight NTP client and server conmon: OCI container runtime monitor cpio: 将文件打包进或提取自 cpio/tar 归档的工具,当前系统被以下包依赖:debugedit(修改调试符号文件中源码路径的工具,被 base-devel 依赖)。 cryptsetup: Userspace setup tool for transparent encryption of block devices using dm-crypt dav1d: AV1 cross-platform decoder focused on speed and correctness expat: C 语言实现的流式 XML 解析库(libexpat),详见 expat fftw: A library for computing the discrete Fourier transform (DFT) fakeroot: 在不具备 root 权限的情况下模拟超级用户权限,常用于 makepkg 构建时在归档中设置 root 属主/属组。当前系统被 base-devel 依赖 fzf: General-purpose command-line fuzzy finder gcr: A library for bits of crypto UI and parsing glslang: OpenGL Shading Language 编译器和验证器,详见 glslang gnutls: A library which provides a secure layer over a reliable transport layer gtk-update-icon-cache: GTK icon cache updater hwdata: Hardware identification databases iproute2: IP routing utilities libavif: Library for encoding and decoding .avif files libgit2: Git 功能的独立可嵌入 C 库,详见 libgit2 libplist: Library to handle Apple Property List files libx11: X11 client-side library openjph: JPEG 2000 Part-15(HTJ2K,高吞吐 JPEG 2000)的开源实现库。当前系统被以下包依赖:openexr(高动态范围图像格式库,被 gst-plugins-bad 和 opencv 依赖)。 openexr: 高动态范围(HDR)图像文件格式库,支持 32 位浮点像素,广泛用于视觉特效和专业图像处理领域。当前系统被以下包依赖:gst-plugins-bad(GStreamer 非稳定插件集合)、opencv(计算机视觉库)。 pcsclite: PC/SC 智能卡中间件库,提供跨平台的智能卡读卡器访问接口(libpcsclite),守护进程 pcscd 负责管理读卡器设备。当前系统被以下包依赖:qt6-connectivity(Qt6 蓝牙/NFC 等近场通信模块)、wpa_supplicant(Wi-Fi 认证客户端,支持基于智能卡的 EAP 认证)。 python-cryptography: 为 Python 提供密码学原语和高层加密接口(包括 AES、RSA、哈希、TLS、X.509 等),底层通过 python-cffi 调用 OpenSSL。当前系统被以下包依赖:ansible-core(Ansible 自动化工具核心)、python-paramiko(Python SSH 客户端库)、python-pip(Python 包安装器)。 abseil-cpp Abseil 是 Google 开源的一套 C++ 基础库,用来补充 C++ 标准库(字符串、容器、同步、哈希、时间等)。2017 年从 Google 内部代码中抽出开源,C++ 命名空间一般是 absl。protobuf、gRPC、TensorFlow 等项目会依赖它。项目介绍见 About Abseil。 ...

Created 6066-05-06 · Updated 24246-08-24 · 3 min · 605 words · -

Pixelbook: 用 MrChromebox 固件安装 Linux

2018 年的旧方法已经过时 早年这篇文章记录的是开发者模式 + crouton 的方案,crouton 项目已经停止维护;后来 ChromeOS 自带的 Crostini 也只是容器化的 Linux,跑在 ChromeOS 内部,不算真正独立的系统。 2026 年推荐的做法是刷 MrChromebox 提供的 coreboot 固件,把 Pixelbook(代号 eve)变成一台标准 UEFI x86_64 笔记本,然后像普通 PC 一样从 U 盘装发行版。下面记录完整流程。 计划:这台 Pixelbook 打算走 UEFI Full ROM 路线(不走 RW_LEGACY 双系统),先把方案和拆机教程记下来,找时间再动手拆机刷机。 进入开发者模式 同时按住 Esc、Refresh、电源键,直到出现 Recovery Mode(提示插入 U 盘的界面),这时按 Ctrl-D(不需要插 U 盘,插了反而会自动进入恢复模式)。 开启开发者模式会清空设备上的数据。 MrChromebox 固件:两种模式 MrChromebox 固件有两种刷法: RW_LEGACY:保留 ChromeOS,做双系统引导 UEFI Full ROM:彻底替换固件,刷完之后就是一台标准 UEFI 笔记本,可以直接用任意发行版的安装 U 盘 装 Linux 用,推荐直接选 Full ROM,体验最接近普通 PC,也省去后续维护 ChromeOS 的麻烦。 关闭硬件写保护 刷 Full ROM 之前必须先关闭主板的硬件写保护(Firmware Write Protect),Pixelbook 没有软件开关,只有两种办法: ...

Created 4046-02-04 · Updated 9096-08-09 · 2 min · 344 words · -

Pixelbook 上安装 Archlinux (MrChromebox Full ROM)

前提:先刷好 Full ROM 固件 这篇文章原本记录的是 Crostini 容器里跑 Archlinux 的方法,Crostini 只是 ChromeOS 内部的容器化 Linux,性能和硬件访问都受限。2026 年推荐先按 Pixelbook: 用 MrChromebox 固件安装 Linux 完成开发者模式、关闭硬件写保护(拆机或用 SuzyQ 调试线)、刷入 MrChromebox 的 Full ROM UEFI 固件。刷完之后 Pixelbook(代号 eve)就是一台标准 UEFI x86_64 笔记本,可以直接从 U 盘装 Archlinux,不再依赖 ChromeOS。 通用安装步骤 分区、pacstrap、bootloader 这些通用步骤跟普通 PC 装 Arch 完全一样,参考 archlinux install,这篇只记录 Pixelbook 硬件相关、跟通用步骤不一样的地方。 Pixelbook 硬件专属问题 Pixelbook 是 2017 年的硬件,装上主流发行版的新内核(参考 pixelbook.md 里 Fedora / Ubuntu 优先的建议)大多能直接工作,但自己装 Arch 用较老的内核配置时,以下几个点容易遇到问题,遇到时优先查这些方向: 触摸屏 / 触控板:老款 Chromebook 常用的触控芯片在原厂内核之外的社区补丁里支持更全,可以参考 tsowell/linux-samus 和 yusefnapora/pixelbook-linux 这两个针对 Chromebook 硬件整理的内核补丁/配置仓库 音频:ChromeOS 自己用的是 cras(Chromium Audio Server)驱动这套硬件,标准 ALSA/PulseAudio 在部分型号上需要额外配置才能出声,同样可以参考上面两个仓库里的音频配置部分 键盘背光 / 待机唤醒:偶发问题,社区论坛(如 chrultrabook 论坛)能搜到具体机型的报告和修复办法 这些细节变化比较快,遇到问题建议直接搜对应内核版本 + eve 关键字,而不是死抠某一份补丁。 ...

Created 8086-09-08 · Updated 9096-08-09 · 1 min · 136 words · -

linux apps

Linux Apps 跨平台常用软件统一维护于 my apps,本文只记录 Linux 专属工具。 说明 pacman — sudo pacman -S aur — yay -S apt — sudo apt install Essentials 跨平台工具详见 my apps,以下是 Linux 上的安装命令速查: app source notes kitty pacman terminal neovim pacman 编辑器 flameshot pacman 截图+标注 bitwarden pacman 密码管理 btop pacman top 替代 wechat aur visual-studio-code-bin aur VSCode 官方二进制版 Browser Ubuntu install Chrome curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb Terminal app source notes termite pacman 支持 32 位色 Text Editor app source notes mousepad pacman 轻量文本编辑器 nixnote2-git aur Evernote Linux 客户端 Screenshot / Recording app source notes spectacle pacman KDE 原生截图 simplescreenrecorder pacman 录屏 gtk-recordmydesktop aur 录屏 shutter aur 截图,需配合 perl-goo-canvas System Monitor app source notes ncdu pacman/apt 命令行磁盘空间分析 netdata pacman 系统资源监控 indicator-sysmonitor apt 任务栏系统资源监控 nethogs pacman 网络流量监控 dstat pacman 查看系统性能 dstat -cdlmnpsy slurm aur 网络监控 hardinfo-git aur 硬件信息查看 System Info app source notes fastfetch pacman 打印发行版 logo neofetch pacman/apt 系统信息(已停止维护) stress pacman 压力测试 hdparm pacman 磁盘参数查看 procmon aur 微软的进程监控工具 File Management app source notes filelight pacman 图形化磁盘空间管理 baobab apt 硬盘占用分析工具 catfish pacman 文件搜索 tree apt 树形目录显示 tree -L N nautilus apt Ubuntu 默认文件管理器 Archive / Compression app source notes ark pacman KDE 压缩包管理器 file-roller pacman zip/7z/rar 支持 rar/unrar apt Media / Graphics app source notes digikam pacman KDE 最佳图片管理 gwenview pacman KDE 图片查看 eog apt Eye of Gnome 图片查看 okular pacman PDF reader gpick pacman 颜色拾取工具 Remote Desktop app source notes chrome-remote-desktop aur Google 远程桌面主机 remmina pacman GTK 远程桌面客户端 freerdp pacman remmina RDP 支持包 rdesktop pacman Development Tools app source notes base-devel pacman 编译工具链 lsof pacman hexyl pacman 彩色 hex 编辑器 lrzsz pacman zmodem binutils pacman 二进制文件处理工具集 inetutils pacman telnet 等网络工具 kotlin pacman glow pacman 命令行 markdown 预览 Fonts app source notes ttf-wqy-microhei apt 文泉驿-微米黑 ttf-wqy-zenhei apt 文泉驿-正黑 xfonts-wqy apt 文泉驿-点阵宋体 ttf-consolas-with-yahei-powerline-git aur Consolas+雅黑 ttf-wps-fonts aur WPS 字体依赖 KDE sudo pacman -S powerdevil kmix kscreen ark gwenview kcolorchooser app source notes powerdevil pacman 电源管理,休眠按钮 kmix pacman 音量调节 kscreen pacman 多显示器管理 kcolorchooser pacman 颜色拾取 KDE Widget name notes netspeed widget 网络监控 resources monitor CPU/内存监控 Plasma Week Number 显示周数 Virtualization app source notes kvm pacman wine pacman 需开启 Multilib 仓库 playonlinux pacman Wine 图形前端 podlet aur podman 辅助工具 Utilities app source notes rsibreak pacman 番茄钟 gnome-shell-pomodoro apt Pomodoro pavucontrol apt Chrome 音频输出设置 sl pacman 小火车 x11-apps apt xclock, xserver 测试用 pamac-aur aur 图形界面的 pacman libiconv aur 编码转换 Ventoy — 各种 ISO 安装盘引导工具 References Arch Linux List of Applications 维护记录 时间 修改内容 原因 2026-07-28 Development Tools 表格补充 glow(命令行 markdown 预览工具) 新增常用软件

Created 5056-05-05 · Updated 28286-07-28 · 2 min · 404 words · w10n

Linux TTY 与伪终端 PTY

TTY 是什么 tty 一词源自 teletype(电传打字机):通过串行线,键盘输入和打印机输出来回传递信息的设备,现在这个词泛指所有类型的终端设备。终端是一种字符型设备。 在支持多任务的计算机出现之前,两台 teletype 直接用物理线路相连: +----------+ Physical Line +----------+ | teletype |<--------------------->| teletype | +----------+ +----------+ 计算机支持多任务之后,人们把这些 teletype 接到计算机上当终端用(一是当时已有大量现成的 teletype 设备,二是相关网络已经比较成熟),连接方式变成: +----------+ +----------+ +-------+ Physical Line +-------+ +------+ | | | Terminal |<->| Modem |<--------------------->| Modem |<->| UART |<->| Computer | +----------+ +-------+ +-------+ +------+ | | +----------+ 左边的 Terminal 就是各种 teletype;物理线路两端接的 Modem 就是我们常说的"猫";UART 负责把 teletype 的信号转换成计算机能识别的信号。 /dev 下的几类终端设备文件 类型 设备文件 说明 串行端口终端 /dev/ttySn(如 /dev/ttyS0) 通过计算机串口连接的终端,对应 DOS 下的 COM1、COM2 等;echo test > /dev/ttyS1 可以把 test 发送到接在该端口上的设备 伪终端 /dev/pty/(成对出现,如 ptyp3/ttyp3) 一对逻辑终端设备,不直接对应物理硬件;一端读写会反映到另一端,类似管道;ttyp3 供普通程序当串口用,ptyp3 需要专门设计的程序(如 telnet、getty)使用 控制终端 /dev/tty 当前进程的控制终端;ps -ax 可查看进程关联的控制终端,tty 命令可查看具体对应哪个实际设备 控制台终端 /dev/ttyn、/dev/console UNIX 里显示器通常称为控制台;tty1-tty6 是虚拟终端,Alt+F1~F6 切换,tty0 是当前虚拟终端的别名,系统信息统一发到这里 其它 例如 /dev/ttyIn 针对 ISDN 等具体设备的终端特殊文件 pty:伪终端 如果是远程 telnet 到主机,或者用 xterm,并没有物理终端,这时候就要靠伪终端 pty(pseudo-tty)。 ...

Created 11116-08-11 · Updated 26266-07-26 · 7 min · 1464 words · -

BDEV, CDEV

ls -l 文件类型标识 ls -l 输出第一列的第一个字符表示文件类型: 字符 类型 - 普通文件 d 目录 l 符号链接(symbolic link) c 字符设备(character device) b 块设备(block device) p 命名管道(named pipe / FIFO) s socket 例如 /dev/pts/2 这样的伪终端设备文件,ls -l 第一个字符是 c,因为它是字符设备:数据按字节流顺序读写,不支持像块设备那样按"块"随机寻址。下面分别展开字符设备和块设备的区别。 字符设备, character device 提供连续的数据流,应用程序只能顺序读取,没有寻址(seek)的概念——不能像访问数组那样跳到任意位置读取。此类设备按字节/字符读写数据,键盘、串口、调制解调器都是典型的字符设备。 块设备, block device 块设备以"块"为单位存储数据,典型的如磁盘设备、硬盘、软盘、光盘或者优盘/闪存。在 Linux 系统中一切皆文件,磁盘设备也是文件。应用程序可以随机访问设备数据,自行确定读取数据的位置;数据的读写只能以块(通常是 512 字节)的倍数进行。 ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 1 07:15 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 1 07:15 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 1 07:15 /dev/sda2 brw-rw---- 1 root disk 8, 3 Apr 1 07:15 /dev/sda3 字符设备与块设备:谁支持随机访问 两者的根本区别在于能否被随机访问——即能否在访问设备时随意跳转到任意位置。 ...

Created 24246-12-24 · Updated 26266-07-26 · 2 min · 386 words · -

STDIN, STDOUT, STDERR

三个标准文件 Unix/Linux/BSD 都有三个特别文件: 文件 设备路径 说明 shell 里的代号(fd) 标准输入 STDIN /dev/stdin 一般指键盘输入 0 标准输出 STDOUT /dev/stdout 一般指终端(显示器) 1 标准错误 STDERR /dev/stderr 也指终端,专门用来发送错误信息 2 stdin 与文件描述符表、pty、键盘的关系 stdin 不是一个独立的东西,它是文件描述符表(file descriptor table,每个进程私有)里 fd 0 这个槽位的习惯叫法。fd 0 具体指向什么取决于进程是怎么启动的——可能重定向到文件、接在管道后面,也可能像交互式 shell 一样连到终端。 在交互式终端场景下,从键盘到 stdin 的完整链路是: 键盘硬件 │ 内核输入子系统 (evdev) ▼ 终端模拟器进程 / SSH 客户端-服务端 <- 用户态进程,把按键翻译成字符 │ write() 进 /dev/ptmx(pty master 端) ▼ 内核 pty 子系统转发 master -> slave ▼ /dev/pts/N(pty slave,字符设备,内核模拟出来的) ▼ shell 进程的 fd 0(即 stdin)read() 读到这些字节 要点: ...

Created 19196-11-19 · Updated 26266-07-26 · 2 min · 394 words · -

CFS, Completely Fair Scheduler 完全公平调度器

CFS(Completely Fair Scheduler,完全公平调度器)是 Linux 普通进程(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE)曾经使用的调度算法,自 2007 年发布的 Linux 2.6.23 版本起取代了此前的 O(1) 调度器,用红黑树替代了原来的按优先级分桶的数组结构(调度器体系的整体介绍见 Linux 进程调度)。 需要先说明的是:CFS 已经不是当前内核的默认实现。从 2023 年 10 月发布的 Linux 6.6 起,普通进程的默认调度算法换成了 EEVDF,CFS 退居历史。本文仍以 CFS 为主,因为它的 vruntime 和红黑树是理解现在这套调度器的基础。 EEVDF:6.6 之后的默认调度器 EEVDF(Earliest Eligible Virtual Deadline First,最早合格虚拟截止时间优先)由 Peter Zijlstra 实现并在 Linux 6.6 合入,取代 CFS 成为 SCHED_NORMAL 等普通调度策略的默认算法。算法本身并不新,出自 Ion Stoica 和 Hussein Abdel-Wahab 1995 年的一篇论文。 它要解决的是 CFS 的一个短板:CFS 只保证长期的 CPU 时间份额公平,但对"什么时候该轮到我"没有约束,交互式任务的调度延迟不好控制。CFS 时期只能靠 sched_latency_ns 之类的旋钮和一些启发式补偿去调,效果有限。 EEVDF 引入两个概念: lag:进程"应得的 CPU 时间"与"实际获得的 CPU 时间"之差。lag 大于等于 0 说明它还欠着账,才有资格(eligible)被调度;lag 为负说明它已经超额使用,暂时靠边。 virtual deadline:在合格的进程中,按各自请求的时间片长度算出一个虚拟截止时间,调度器每次挑选虚拟截止时间最早的那个。 这样一来,份额公平由 lag 保证,响应延迟由 deadline 保证,需要低延迟的任务可以通过请求更短的时间片来更频繁地被调度,而不必牺牲它的总 CPU 份额。 ...

Created 14146-07-14 · Updated 19196-07-19 · 2 min · 350 words · -

chezmoi

chezmoi(发音近似 shay-mwah,音标 /ʃeɪ mwɑ/,法语 chez moi「在我家」)是一个跨平台的 dotfiles 管理工具,使用 Go 编写,支持模板、加密 secret、多机器差异配置。 安装 # Arch Linux pacman -S chezmoi # macOS brew install chezmoi # 通用安装脚本 sh -c "$(curl -fsLS get.chezmoi.io)" 初始化 # 初始化(本地,不关联远程仓库) chezmoi init # 初始化并关联远程 git 仓库(自动 clone 到 ~/.local/share/chezmoi/) chezmoi init git@github.com:用户名/仓库名.git # 用 GitHub 用户名简写(默认找 dotfiles 仓库) chezmoi init <github-username> chezmoi init 可以在任意目录执行,source 目录固定克隆到 ~/.local/share/chezmoi/,不需要手动指定位置。 日常改配置流程 改已托管的配置时,记住三层: source:~/.local/share/chezmoi(git 仓库,真相源) destination:home 下的实际文件(如 ~/.zshrc) 远程:source 对应的 git remote chezmoi edit 只改 source,不会自动写入 home,也不会 push。完整顺序: ...

Created 5056-05-05 · Updated 19196-07-19 · 3 min · 598 words · -

Linux Process Scheduling, 进程调度

进程调度概述 操作系统要实现多进程,进程调度必不可少。进程调度是对 TASK_RUNNING 状态的进程进行调度(进程状态详见 Linux Process State, 进程状态)。如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系。 所以,如果系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程,那么进程调度也就不会太重要,哪个进程可执行就让它执行去,没有什么需要多考虑的。 反之,如果系统负载非常高,时时刻刻都有 N 多个进程处于可执行状态,等待被调度运行,那么进程调度程序为了协调这 N 个进程的执行,必定得做很多工作。协调得不好,系统的性能就会大打折扣,这个时候,进程调度就是非常重要的。 尽管我们平常接触的很多计算机(如桌面系统、网络服务器等)负载都比较低,但是 Linux 作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。 当然,这些设计对于低负载(且没有什么实时性要求)的环境没多大用。极端情况下,如果 CPU 的负载始终保持 0 或 1(永远都只有一个进程或没有进程需要在 CPU 上运行),那么这些设计基本上都是徒劳的。 优先级 现在的操作系统为了协调多个进程的"同时"运行,最基本的手段就是给进程定义优先级。定义了进程的优先级,如果有多个进程同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠结的了。 进程的优先级该如何确定呢?有两种方式:由用户程序指定、由内核的调度程序动态调整。Linux 内核将进程分成两个级别:普通进程和实时进程。实时进程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。 实时进程的调度 实时,原本的涵义是"给定的操作一定要在确定的时间内完成"。重点并不在于操作一定要处理得多快,而是时间要可控(在最坏情况下也不能突破给定的时间)。 这样的"实时"称为"硬实时",多用于很精密的系统之中(比如火箭、导弹之类的)。一般来说,硬实时的系统是相对比较专用的。 像 Linux 这样的通用操作系统显然没法满足这样的要求,中断处理、虚拟内存等机制的存在给处理时间带来了很大的不确定性,硬件的 cache、磁盘寻道、总线争用也会带来不确定性。 比如考虑 i++; 这么一句 C 代码,绝大多数情况下它执行得很快,但是极端情况下还是有这样的可能: i 的内存空间未分配,CPU 触发缺页异常,而 Linux 在缺页异常的处理代码中试图分配内存时,又可能由于系统内存紧缺而分配失败,导致进程进入睡眠; 代码执行过程中硬件产生中断,Linux 进入中断处理程序而搁置当前进程,而中断处理程序的处理过程中又可能发生新的硬件中断,中断永远嵌套不止…… 而像 Linux 这样号称实现了"实时"的通用操作系统,其实只是实现了"软实时",即尽可能地满足进程的实时需求。 如果一个进程有实时需求(它是一个实时进程),则只要它是可执行状态的,内核就一直让它执行,以尽可能地满足它对 CPU 的需要,直到它完成所需要做的事情,然后睡眠或退出(变为非可执行状态)。 而如果有多个实时进程都处于可执行状态,则内核会先满足优先级最高的实时进程对 CPU 的需要,直到它变为非可执行状态。于是,只要高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到 CPU;只要一直有实时进程处于可执行状态,普通进程就一直不能得到 CPU。 后来,内核添加了 /proc/sys/kernel/sched_rt_runtime_us 和 /proc/sys/kernel/sched_rt_period_us 两个参数,限定了在以 sched_rt_period_us 为周期的时间内,实时进程最多只能运行 sched_rt_runtime_us 这么多时间,这样就在一直有实时进程处于可执行状态的情况下,给普通进程留了一点点能够得到执行的机会。 那么,如果多个相同优先级的实时进程都处于可执行状态呢?这时就有两种调度策略可供选择: SCHED_FIFO:先进先出,直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。在这种策略下,先来的进程可以调用 sched_yield 系统调用,自愿放弃 CPU,以让权给后来的进程; SCHED_RR:轮转调度,内核为实时进程分配时间片,在时间片用完时,让下一个进程使用 CPU; 强调一下,这两种调度策略仅仅针对于相同优先级的多个实时进程同时处于可执行状态的情况。 ...

Created 10106-02-10 · Updated 14146-07-14 · 3 min · 584 words · -

Linux Process State, 进程状态

Linux(本文以 4.8.4 内核为例)下,进程状态大致有 7 种: 进程状态 说明 TASK_RUNNING 可运行状态。未必正在使用 CPU,也许是在等待调度 TASK_INTERRUPTIBLE 可中断的睡眠状态。正在等待某个条件满足 TASK_UNINTERRUPTIBLE 不可中断的睡眠状态。不会被信号中断 __TASK_STOPPED 暂停状态。收到某种信号,运行被停止 __TASK_TRACED 被跟踪状态。进程停止,被另一个进程跟踪 EXIT_ZOMBIE 僵尸状态。进程已经退出,但尚未被父进程或者 init 进程收尸 EXIT_DEAD 真正的死亡状态 在 include/linux/sched.h 中,进程状态的定义并没有那么少: /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task_state(). * * We have two separate sets of flags: task->state * is about runnability, while task->exit_state are * about the task exiting. Confusing, but this way * modifying one set can't modify the other one by * mistake. */ #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define __TASK_STOPPED 4 #define __TASK_TRACED 8 /* in tsk->exit_state */ #define EXIT_DEAD 16 #define EXIT_ZOMBIE 32 #define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) /* in tsk->state again */ #define TASK_DEAD 64 #define TASK_WAKEKILL 128 #define TASK_WAKING 256 #define TASK_PARKED 512 #define TASK_NOLOAD 1024 #define TASK_NEW 2048 #define TASK_STATE_MAX 4096 #define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPNn" extern char ___assert_task_state[1 - 2*!!( sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; /* Convenience macros for the sake of set_task_state */ #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) #define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) /* Convenience macros for the sake of wake_up */ #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) #define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) /* get_task_state() */ #define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \ __TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD) TASK_RUNNING TASK_RUNNING 是教科书中两种状态的结合:一种是正在占用 CPU 的 RUNNING 状态,一种是 RUNNING 状态的进程时间片耗尽、或者主动让出 CPU、或者被更高优先级进程抢占后,进入的 READY 状态。处于 TASK_RUNNING 状态的进程要么正在 CPU 上运行,要么随时都可以投入运行,只不过 CPU 资源有限,调度器暂时没有选中它们。 ...

Created 14146-06-14 · Updated 14146-07-14 · 7 min · 1324 words · -

Compress and Extract 压缩与解压

Compress and Extract 压缩与解压 .tar.gz 和 .tgz .tgz 和 .tar.gz 是同一个东西, .tgz 可以认为是 .tar.gz 是简写, 在远古时代比如 DOS 系统, 文件扩展名只能是三个字符, 所以有了 .tgz, 后来限制解除之后就能支持 .tar.gz 这种后缀了, 后者能更清晰地表达打包格式和压缩方式. https://stackoverflow.com/questions/11534918/are-tar-gz-and-tgz-the-same-thing 这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多 CPU 的,而且可以得到一个非常理想的压缩率 默认 tar 打包和系统默认的压缩工具是单线程的,pigz 是 gzip 的多线程实现, 默认用当前逻辑 cpu 个数来并发压缩,无法检测个数的话,则并发8个线程 压缩 tar -czvf all.tar.gz *.jpg # 排除掉文件 tar -czvf tomcat.tar.gz --exclude=tomcat/logs tomcat # 设置压缩级别 GZIP=-9 tar cvzf file.tar.gz /path/to/directory 压缩到指定目录 tar -zcvf /data/tmp/foo.tar.gz /data/server/source # 解压到指定目录 tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.1.tgz tar.gz, tgz 解压 tar -xf foo.tar.gz # 解压 tar.gz 文件时, 不使用 z 参数, 貌似 tar 会检测文件类型 自动 用 gzip 解压... tar xvf all.tar.gz tar zxvf all.tar.gz tar -zxvf all.tar.gz 解压到指定目录 tar zxvf /path/to/foo.tar.gz -C /path/to/target/dir/ tar -zxvf /path/to/foo.tar.gz -C /path/to/target/dir/ sudo pacman -S pigz # 压缩 tar --use-compress-program=pigz -cvpf package.tgz ./package # 解压 tar --use-compress-program=pigz -xvpf package.tgz -C ./package #tar –use-compress-program=pigz表示指定pigz来进行打包 #c表示create创建 x表示extract解压 v表示verbose详细 f表示指定压缩文件 C表示指定目录 #-cvpf package.tgz ./ 表示将./package目录打包为package.tgz #-xvpf package.tgz -C ./表示将package.tgz解压到./package目录下 \-v, --verbose #详细显示处理的文件 \-f, --file [HOSTNAME:]F #指定存档或设备 (缺省为 /dev/rmt0) \-z, --gzip, --ungzip #用 gzip 对存档压缩或解压 \-x, --extract, --get #从存档展开文件 解压多个文件 ls *.gz|xargs -t -n1 gunzip gunzip *.gz .rar # 解压 unrar x foo.rar # 压缩 rar e FileName.rar # 解压 rar a FileName.rar 解压并指定输出目录 gunzip -c /data/tmp/foo.tar.gz | tar xf - -C /data/server/bar .7z yum install p7zip pacman -S p7zip sudo apt install p7zip-full p7zip-rar # 压缩 7z a -t7z -r manager.7z /home/manager/* # a 代表添加文件/文件夹到压缩包 # -t 是指定压缩类型 一般我们定为7z # -r 表示递归所有的子文件夹,manager.7z 是压缩好后的压缩包名,/home/manager/* 是要压缩的目录,*是表示该目录下所有的文件。 7z x filename.7z .zip pacman -S zip unzip zip 压缩 zip all.zip *.jpg # 指定压缩文件目录 zip ~/all.zip *.jpg # 压缩的是个文件夹, -r 表示调用递归压缩 zip -r temp.zip temp # 密码 zip -P password0 foo.zip foo.txt # 压缩目录并加密码 (-r 递归, -P 指定密码) zip -r -P password0 foo.zip foo/ # 交互式输入密码(更安全,密码不会暴露在命令历史中) zip -r -e foo.zip foo/ # 指定压缩某几个文件 zip foo.zip foo.txt bar.txt zip 分卷压缩 # 分卷压缩的话,需要先将文件打包成一个zip包,然后执行 zip -s SIZE origin.zip --out new.zip # SIZE为分卷的大小4m,4g,4t等 # 解压的时候需要先将它合并才能正常解压 zip spiltfile.zip -s=0 --out single.zip zip 列出内容(不解压) unzip -l myfile.zip unzip -l /path/to/myfile.zip | head -l(list)只列出压缩包内文件清单,不解压。输出列依次为原始大小、日期、时间、文件名。想先看包里有什么、或确认路径对不对时用这个。 ...

Created 4046-11-04 · Updated 27276-06-27 · 7 min · 1382 words · -

Cursor

背景 Arch Linux 工作站上我同时保留了两套 Cursor:AUR 的 cursor-bin 和 官方 AppImage。不是重复安装玩,而是两条更新通道各管一件事——AUR 省心,AppImage 跟官网更快。 为什么装两份 最初用 AUR 安装 cursor-bin,日常 paru -Syu 就能升级,和系统其他包一起维护。但 AUR 版本依赖上游维护者跟进官方发布,往往比官网慢几天到一两周。想试用新功能或修 bug 时,等 AUR 更新会比较被动。 Linux 版 Cursor 也有应用内自动更新(Help → Check for Updates),但我这边用起来不太稳,偶尔报错。所以另装了一份官方 AppImage,需要新版本时从官网拉,比等 AUR 或碰运气点内置更新更可控。 两套安装共用 ~/.config/Cursor 和 ~/.cursor,配置、扩展、MCP 设置不用搬。约束是同一时刻只开一个版本——切换前先完全退出当前实例。 stable 与 latest 发布通道 Cursor 官方下载 API 用 releaseTrack 区分通道(Linux AppImage 脚本安装靠这个接口): https://www.cursor.com/api/download?platform=linux-x64&releaseTrack=stable|latest 返回 JSON,含 downloadUrl、version 等字段。论坛里也有人确认过这个接口。 通道 定位 说明 stable 保守、生产向 官方认为足够稳、适合大多数人默认用的构建;更新节奏较慢 latest 官网最新正式版 下载 CDN 上当前最新的正式发布,通常是比 stable 更新的 patch 两者都是正式发布构建,不是每日实验版。差别在发布节奏:stable 更保守,latest 更快拿到新 patch。 ...

Created 23236-06-23 · Updated 23236-06-23 · 2 min · 298 words · -

Debian 安装 FTP 服务器(vsftpd)

Debian安装FTP服务器,使用vsftpd简单实现 http://wudixiaozi.com/1694.html Debian安装FTP服务器,使用vsftpd简单实现 June 27th, 2013无敌小子Leave a commentGo to comments Debian自己安装的时候若没有勾选FTP服务器的话,那就需要在后期手动安装了!这里简单介绍一下debian如何安装和配置FTP服务器! Debian下实现FTP的软件很多,我这里推荐vsftpd,因为他非常的短小精干,只要设置得当还是不错的!那我们就按照下面的命令一步步的来完成! 首先我们更新下软件源: aptitude update 安装vsftpd apt-get install vsftpd 安装完毕以后我们来配置vsftpd,使用nano编辑器打开 nano /etc/vsftpd.conf 打开后我们找到anonymous_enable=YES 替换成anonymous_enable=NO 找到local_enable=YES,将前面的#去掉 找到Write_enable=NO将前面的#去掉,改成YES 然后在配置文件的最后一行加上: chroot_local_user=YES 目的是让登陆用户锁定在指定目录里面!放置用户可以返回上层目录! 接下来创建用户组: groupadd ftp 一般会提示用户组ftp已存在,我们忽略他! 创建用户 useradd -g ftp -d /var/www user 这里需要修改的就量个,/var/www是你想创建的用户登陆后锁定在哪个目录里面,上面的user是用户名,你这里可以改成你自己想要的! 然后我们给添加的ftp的user更改密码 passwd user 输入两次后就改好了! 重启vsftpd服务,让配置生效 invoke-rc.d vsftpd restart 为了让设定的/var/www可读写,我们还要设定下目录权限 chmod -R 777 /var/www/ 大功告成,这时候可以使用类似flashFXP这种FTP客户端登陆测试看看! 维护记录 时间 修改内容 原因 2026-06-15 文件从中文名重命名为 vsftpd.md;url 改为 vsftpd;title 整理为规范格式;categories 从 Inbox 改为 Linux 文件名含中文不符合规范,URL 为中文无法正常使用,分类不准确

Created 17176-07-17 · Updated 15156-06-15 · 1 min · 71 words · -