📒 操作系统使用经验和技巧¶
macOS¶
初次使用¶
需要习惯以下几个点:
- 菜单栏(Menu Bar):所有软件的选项都在菜单栏中,不习惯的时候常常会觉得找不到软件的配置选项。
- 触摸板手势:基础手势已经很好用,在网上还可以找到教程开启更多手势,强烈推荐开启三指拖拽功能。
- Spotlight:按住 Cmd+Space 可以快速打开应用程序和文件。
- 键盘:
- macOS 的快捷键与其他系统有些许不同,比如 Cmd+X 不再能够剪切文件,而应当用 Cmd+C 复制文件,然后用 Cmd+Option+V 粘贴文件。可以在网上查找 macOS 常用快捷键的教程。
- MacBook 上的 Cmd 键基本替代了 Ctrl 的功能,而 Ctrl 在各种终端中仍能正常使用。
- 访达:
- 使用空格预览文件。
- 配置工具栏:在访达工具栏右键可以配置工具栏,加入如删除文件等常用按钮可以提升效率。
-
特殊文件属性:从网络上下载的文件会被 macOS 附加文件属性,阻止运行等,可以使用
xattr
命令解除。 -
设置默认应用程序:右键 - 显示简介 - 打开方式 - 全部更改。
Homebrew¶
几个概念:
tap
是一个 GitHub 仓库,当它被tapped
时就可以从该仓库安装软件包。cellar
是软件包安装在本地的位置。formula
是一个软件包或库,Homebrew 会保留其的多个版本。cask
是一个应用程序。
常用命令:
brew install <formula>
:安装软件包brew uninstall <formula>
:卸载软件包brew search <formula>
:搜索软件包brew list
:列出已安装的软件包brew update
:更新 Homebrewbrew upgrade
:更新已安装的软件包brew cleanup
:清理旧版本的软件包brew tap <user>/<repo> <URL>
:添加 tap
网络配置¶
对比 Linux:
Linux | macOS |
---|---|
ip l |
ifconfig |
ip r |
netstat -nr |
launchd¶
Quote
- About Daemons and Services - Apple Developer:官方文档,虽然是 2016 年 OS X 的 Archive,但依然很有参考价值。
- macOS launchctl commands – rakhesh.com:一个精简的入门教程,包含 launchctl 命令和服务示例。
- A launchd Tutorial:一个完善的 launchd 教程。
launchd 是 MacOS 的服务管理器,类似于 Linux 的 systemd(它们都是系统启动时内核运行的第一个进程)。
-
luanchd 服务分为两类:
服务类型 描述 目录 Daemon 系统级别的服务,不需要用户登录就可以运行 /System/Library/LaunchDaemons
或/Library/LaunchDaemons
Agent 用户服务,需要用户登录才能运行 ~/Library/LaunchAgents
-
launchd 的命令行工具是
launchctl
,常用命令有:sudo launchctl load /Library/LaunchDaemons/otelcol-contrib.plist sudo launchctl start otelcol-contrib sudo launchctl list | grep otelcol-contrib sudo launchctl stop otelcol-contrib sudo launchctl unload /Library/LaunchDaemons/otelcol-contrib.plist
- 如果不用
sudo
,则只能操作当前用户的服务。 - 没有
restart
。
- 如果不用
-
服务配置文件是 plist 格式的文件。
- 完整定义见 launchd.plist(5) 手册页。
- 可以使用
plutil
命令检查 plist 文件语法是否正确。 - 修改配置文件后需要
unload
再load
服务。 - 配置为
KeepAlive
的服务会尝试保持运行,不管是异常退出还是手动停止都会重启。
OpenTelemetry Collector 示例配置文件
/Library/LaunchDaemons/otelcol-contrib.plist<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>otelcol-contrib</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>Program</key> <string>/usr/local/bin/otelcol-contrib</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/otelcol-contrib</string> <string>--config=/etc/otelcol-contrib/config.yaml</string> </array> <key>EnvironmentVariables</key> <dict> <key>OTEL_BEARER_TOKEN</key> <string>your_key_here</string> <key>OTEL_CLOUD_REGION</key> <string>zjusct-cluster</string> </dict> <key>StandardOutPath</key> <string>/var/log/otelcol-contrib.log</string> <key>StandardErrorPath</key> <string>/var/log/otelcol-contrib-err.log</string> </dict> </plist>
文件系统¶
macOS 的文件系统布局与 UNIX 有一些显著的不同:
- APFS 下,根目录只读,无法创建文件/目录。可以使用
synthetic.conf
将文件夹映射到根目录,见 finder - Unable to create folder in root of 'Macintosh HD'? - Ask Different。
其他:
- 同样使用
/etc/fstab
挂载 NFS,但参数有所不同,比如不支持default
选项。
Linux¶
- 桌面应用程序无脑选择 Flatkap。
其他问题:
遇到固件问题怎么办?
- 首先,查看发行版的手册和 Wiki,寻找解决固件问题的办法。
- 更新 BIOS 版本。
- 更新 Linux 内核。
- 使用驱动检查工具。
- Debian 安装后无法启动,报错
hdaudio hdaudioC0D2: Unable to configure, disabling
等。- 原因:Debian 使用的 Linux 内核太老,无法识别新核芯显卡。
- 解决方法:在 Grub 的内核命令行中添加
nomodeset
。进入系统后,升级 Linux 内核到最新的可用版本。
OpenWRT¶
Windows¶
cmd.exe
¶
作为 Windows 系统的远古命令解释器,只具有很少的命令,使用 help
就可以查看。
PowerShell¶
-
格式:PowerShell 与其他 Shell 的一个显著区别是它的命令名称,一般为
Verb-Noun
格式,比如Get-Command
。 -
对象:在 PowerShell 中,命令的结果作为对象传递,比如
Get-Process
返回System.Diagnostics.Process
对象。类型的成员的种类(MemberType)可以是属性(Property),也可以是方法(Method)。比如Get-Service
返回的System.ServiceProcess.ServiceController
具有close()
方法,可以直接调用。 -
管道:PowerShell 管道可以对对象进行很多操作,不过在 Linux 中我们最熟悉的是文本处理。可以使用
Get-Content
和Out-File
来进行:
# 关机
Stop-Computer -Force -ComputerName localhost
# 帮助
Update-Help
Get-Verb
Get-Command -Name -Verb -Noun [pattern]
Get-Help
help -Full
# 需要找什么命令直接查询即可,比如服务相关就查 `Get-Command -Name Service`"
# 对象
Get-Member -MemberType
Select-Object -First n -Property Name, Source
Where-Object [condition]
(Get-Service -Name w32time).Stop()
# 创建一个 `PSCustomObject` 类型的变量,具有 `Name` 成员,属性为 `w32time`(这是一个字符串 `System.String`)。
$CustomObject = [pscustomobject]@{
Name = 'w32time'
}
# 管道
'Background', 'Windows' | Out-File -FilePath $env:TEMP\services.txt
Get-Content -Path .\LineNumbers.txt
Get-Item -Path .\LineNumbers.txt | Get-Content -Tail 1
脚本执行权限¶
ExecutionPolicy
影响脚本能否执行,在客户端系统上一般都设置为 Restricted
,任何脚本都无法执行。
更多¶
常用的比较运算符,和 bash 差不多:
'PowerShell' -eq 'powershell'
-eq
-ceq #case sensitive
-gt
# 一个控制片段示例:
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
while ($guess -ne $number)
Utilities¶
除了各 Shell 的内置命令,Windows 上还有一些实用工具:
- 开关机:
shutdown
- 立即关机:
shutdown /p /f
- 重启并自动登录并锁定:
shutdown /sg
- 立即关机:
- 系统管理:
chkdsk
:检查磁盘diskpart
:磁盘分区dism
:Windows 映像管理工具sfc
:系统文件检查
- 进程管理:
tasklist
:列出进程taskkill
:结束进程
- 网络:
ipconfig
:网络配置netstat
:网络状态net
:网络配置route
:路由表
Android¶
ADB¶
adb devices
adb install/uninstall
adb reboot [bootloader|recovery|sideload|sideload-auto-reboot]
adb shell
进入 Shell 后有一些常用的工具,具体用法查看工具自带的帮助。
dumpsys
查询系统、服务状态。如battery
等。wm
窗口管理器,控制显示方面。size [reset|WxH|WdpxHdp]
user-rotation [free|lock] [orientation]
settings
管理各项系统设置。list [system|secure|global]
put NAMESPACE KEY VALUE
pm
包管理器list packages
删除内置应用¶
- 可以在谷歌商店下载 App Inspector 在手机上查阅每个应用的信息,知道包名是对应哪个应用。
- Android 系统组件一定不能卸载,MIUI 系统核心组件替换时必须小心。
- 如:
com.android.provider.
开头的,大部分是 Android 系统 API 接口提供者,应当保留。com.android.
开头的部分软件被 UI 产商替换,可以尝试更改为自己需要的。但一定要注意备份。 com.android
系列软件删除前必须查看上面参考资料中的系统应用清单!!!确定不在不可删除的列表中再决定是否要删除!!!com.android.phone
删除后将导致 SIM 卡无法使用,且由于其为priv-app
中的应用,无法通过 ADB、保留数据的线刷恢复。小心!!!- 当你准备抛弃 MIUI 并使用 Google 套件替换系统功能时,请先退出小米账号,解除手机和小米账号的绑定,再卸载和小米云服务有关的组件。否则将面临手机被锁定且因为缺少服务组件无法解锁的窘境。
- 如:
- 只要你的手机 Bootloader 仍然保持解锁状态,就有无损修复的机会。
个人经历:卸载系统组件后无法进入系统
我删除了小米云服务、小米账号以及相关 SDK 后重启手机,手机即显示“Device Locked”,需要输入绑定的小米账号的密码才能解锁。可是,SDK 都被删除了,输入密码也无法登录,显示 RPC Error
。而且,手机进入锁定状态会自动关闭 ADB 等功能,手机系统处于无法动弹的状态。
以下是我的修复步骤:
- 电脑登录 小米云服务,解除对应设备的找回设备功能。
- 使用物理按键将手机重启至 Fastboot 模式,使用 MIUI 官方线刷工具,以保留数据的方式刷入系统镜像,以补上 MIUI 关键组件。
- 重启手机,此时仍处于锁定状态。连接网络,稍等一下,手机就自动解锁了(小米服务器向手机发送解绑指令)。
修复完成后,小米云服务不再可用,保留数据的线刷并不会还原云服务核心组件。