📒 操作系统使用经验和技巧¶
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
:路由表
远程管理¶
远程管理 Windows 系统并不容易,特别是使用微软账户时。可能你都不知道应该怎么指定 SSH 的用户名。这里记录我查找到的解决办法。然而 Windows 系统更新频繁,这里的内容可能随时间而不再适用。
防火墙¶
首先查看以下几个地方,它们可能影响你能否从外部网络访问 Windows
- 网络配置文件:是公有网络还是私有网络?每当你接入一个新的网络时,Windows 都会询问配置文件。而防火墙的某些规则对待不同配置文件起不同作用。
- 防火墙规则:有几条重要的规则需要确保可用
- ICMP:如果你
ping
不通,检查该协议相关的防火墙规则是否允许数据包通过 - 特殊端口:如 22、80 等端口,看你自己需要的服务进行开启
- ICMP:如果你
SSH¶
如何在 Windows 上启用 OpenSSH Server 请查看官方文档,这里记录登录方法。
- 用户名:使用
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
这条 Powershell 指令查询。当你使用微软账户时,直接使用账户主邮箱(显示在设置中的),比如windows@outlook.com
。SSH 命令会有两个@
,这没有关系,会正确识别。 - 密码:仅用于临时测试,建议之后更改为密钥登陆。
- 密钥:请自行查看用户目录下的
sshd_config
文件,你会发现管理员账户的authorized_keys
存放在另一个目录,而不是用户文件夹下。找到那个目录,添加你的密钥即可。
RDP¶
上面这个问题的讨论是我能找到的解决办法最全的了。省流如下:
Further to the above, I believe (from later found articles) that if the user signs in with the Microsoft's account password at least once rather than the PIN the issue may also be fixed. (Have confirmed this as the best fix)
可能当初我们安装系统时,就是直接使用 Microsoft 账户,并随即按照提示设置好了 PIN。上面的回答指出,我们必须至少使用 Microsoft 账户的密码在本机上登录一次后,远程桌面才会接受我们使用 Microsoft 账户密码进行的登录。
设置中 Require Windows Hello sign-in for Microsoft accounts 等选项可能也会有影响,具体可以查阅解答。
安装 Windows 系统时,请从本地账户开始
综合上面的解答和评论来看,安装 Windows 时,先不登录 Microsoft 账号是最好的。
- 你可以自定义本地账户的名称,否则微软会截取你账户名称的前几个字符,使用户文件夹名称看起来很丑。
- 不会出现上面远程登录的这些问题。
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 关键组件。
- 重启手机,此时仍处于锁定状态。连接网络,稍等一下,手机就自动解锁了(小米服务器向手机发送解绑指令)。
修复完成后,小米云服务不再可用,保留数据的线刷并不会还原云服务核心组件。