{"id":20801297,"url":"https://github.com/geekrainy/linux-guide","last_synced_at":"2025-12-24T14:28:45.266Z","repository":{"id":43626349,"uuid":"71680933","full_name":"geekrainy/linux-guide","owner":"geekrainy","description":"Linux 配置、应用、资源。","archived":false,"fork":false,"pushed_at":"2023-07-25T10:27:29.000Z","size":191,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-18T12:32:28.947Z","etag":null,"topics":["guidline","linux","linux-mint","tutorial"],"latest_commit_sha":null,"homepage":"http://linux.rainylog.com","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/geekrainy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-23T04:08:07.000Z","updated_at":"2023-07-25T10:27:40.000Z","dependencies_parsed_at":"2025-01-18T12:36:54.901Z","dependency_job_id":null,"html_url":"https://github.com/geekrainy/linux-guide","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geekrainy%2Flinux-guide","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geekrainy%2Flinux-guide/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geekrainy%2Flinux-guide/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geekrainy%2Flinux-guide/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/geekrainy","download_url":"https://codeload.github.com/geekrainy/linux-guide/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243147271,"owners_count":20243745,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["guidline","linux","linux-mint","tutorial"],"created_at":"2024-11-17T18:17:30.331Z","updated_at":"2025-12-24T14:28:45.252Z","avatar_url":"https://github.com/geekrainy.png","language":null,"readme":"# Linux 配置及应用\n\n\u003e 个人日常使用发行版为 [Linux Mint](https://www.linuxmint.com/), Debian 系发行版大部分可套用或稍加改动使用。RedHat 系发行版可能随之后的使用情况而修订增加相关内容。\n\u003e\n\u003e 部分内容为使用 centos 或 oracle linux 中的内容，非 RedHat 系发行版需要搜索以确认相同配置文件的不同路径及其它差异。\n\u003e\n\u003e *Linux 发行版的区别大同小异，学习 Linux 重在学习一种通用的解决方案或思路，不必过分纠结使用何种发行版，迷失在发行版之间差异的细枝末节中！*\n\n* [Linux 配置及应用](#linux-mint-配置及应用)\n     * [基本配置](#基本配置)\n         * [联网](#联网)\n         * [终端](#终端)\n            * [bd](#bd)\n         * [内核回退](#内核回退)\n         * [字体](#字体)\n         * [美化](#美化)\n         * [输入法](#输入法)\n            * [输入法词库](#输入法词库)\n         * [Java 开发环境配置](#java-开发环境配置)\n         * [NFS 附件共享](#nfs-附件共享)\n         * [Unison 文件同步](#unison-文件同步)\n     * [应用软件](#应用软件)\n         * [浏览器](#浏览器)\n         * [Chrome Apps](#chrome-apps)\n         * [编辑器](#编辑器)\n         * [Markdown 写作](#markdown-写作)\n         * [效率](#效率)\n         * [开发环境](#开发环境)\n         * [同步工具](#同步工具)\n         * [代理工具](#代理工具)\n         * [文档阅读](#文档阅读)\n         * [办公教育](#办公教育)\n         * [下载工具](#下载工具)\n         * [系统管理](#系统管理)\n     * [Windows 兼容](#windows-兼容)\n         * [虚拟机 Tips](#虚拟机-Tips)\n            * [VMWare 克隆虚拟机后克隆机无法连接网络](#vmware-克隆虚拟机后克隆机无法连接网络)\n     * [Tips](#tips)\n         * [Linux Mint 安装 git-lfs](#linux-mint-安装-git-lfs)\n         * [普通用户无法使用-sudo](#普通用户无法使用-sudo)\n         * [救援模式更改 root 密码](#救援模式更改-root-密码)\n         * [配置密钥登陆](#配置密钥登陆)\n            * [开启免密登陆](#开启免密登陆)\n            * [配置 Linux 服务器仅使用密钥认证](#配置-linux-服务器仅使用密钥认证)\n         * [计划任务](#计划任务)\n         * [使用本地镜像源](#使用本地镜像源)\n         * [LVM 磁盘挂载、扩容、分区](#lvm-磁盘挂载扩容分区)\n            * [创建和管理 LVM](#创建和管理-lvm)\n            * [错误执行 lvreduce 后的恢复](#错误执行-lvreduce-后的恢复)\n         * [建立 Swap 分区](#建立-swap-分区)\n            * [创建用于交换分区的文件](#创建用于交换分区的文件)\n            * [设置交换分区文件](#设置交换分区文件)\n            * [立即启用交换分区文件](#立即启用交换分区文件)\n            * [开机时启用 swap 分区](#开机时启用-swap-分区)\n         * [更改主机名](#更改主机名)\n            * [方法一](#方法一)\n            * [方法二](#方法二)\n\n\n\n## 基本配置\n\n### 解决 shell 弹出报错\n\n在 shell 中使用 `zenity` 弹出框，报错：\n\n```\nWARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files\n```\n\n在 debian 系可以安装 `at-spi2-core` 包解决。\n\n可能还会有的报错：\n\n```\nGtk-Message: GtkDialog mapped without a transient parent. This is discouraged.\n```\n\n该报错可以安全地忽略。\n\n### 联网\n\n1. 锐捷官方客户端\n\n   ```bash\n   sudo chmod +x ./rjsupplicant.sh\n   sudo ./rjsupplicant.sh --help # 配置使用\n   ```\n\n2. Mentohust\n\n   安装 [mentohust_0.3.4-1_amd64.deb](https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/mentohust/mentohust_0.3.4-1_amd64.deb) 包。\n\n   Mentohust 使用 `notify-osd` `libnotify-dev` 提供气泡提示（Unity 桌面默认通知方式，Cinnamon 桌面需要手动安装包）。关于通知的文档：https://wiki.archlinux.org/index.php/Desktop_notifications\n\n   ```bash\n   # 修复提示 “！！打开libnotify失败，请检查是否已安装该库文件。”\n   sudo ln -s /usr/lib/x86_64-linux-gnu/libnotify.so.4.0.0 /usr/lib/libnotify.so.1\n   ```\n\n   配置文件位置 `/etc/mentohust.conf`:\n\n   组播地址：标准\n\n   DHCP 方式：二次认证\n\n### 终端\n\n安装 zsh:\n\n```bash\nsudo apt-get install zsh\n```\n\n切换默认 zsh:\n\n```bash\nchsh -s /bin/zsh\n```\n\n安装 `oh-my-zsh`:\n\n```bash\nsh -c \"$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)\"\n```\n\n配置文件 `~/.zshrc`:\n\n```bash\n# 定义 zsh 主题\nZSH_THEME=\"ys\"\n\n# 设置别名\nalias sudo=\"sudo \"                # 授予 sudo 别名权限\nalias rj=\"mentohust\"              # 联网\nalias qrj=\"mentohust -k\"          # 退出联网\n# alias xl=\"docker start xware\"   启动讯雷下载容器\n# alias qxl=\"docker stop xware\"   停止讯雷远程下载容器\n```\n\n#### [bd](https://github.com/vigneshwaranr/bd)\n\n`bd` 可以方便地在当前路径的父级别目录切换，安装可以点击项目链接查看文档中的安装说明。\n\n\u003e 默认安装不会在非 bash 终端中配置 `bd` 运行的别名，需要手动设置。\n\u003e\n\u003e 例如使用 `zsh` 终端，需要在 `.zshrc` 中增加：\n\u003e\n\u003e ```shell\n\u003e alias bd=\". bd -si\"\n\u003e ```\n\n### 内核回退\n\n\n\n### 字体\n\n下载符号字体解决 wps 符号字体缺失：\n\n[symbol-fonts_1.2_all.deb](https://pan.baidu.com/share/link?uk=505215462\u0026shareid=3369982571)\n\n下载全套 Windows 字体：\n\n[winfonts_1.3_all.deb](https://pan.baidu.com/share/link?uk=505215462\u0026shareid=1223565760)\n\n同时使用 Infinality 优化字体渲染：\n\n\u003e 参考文章：http://www.webupd8.org/2013/06/better-font-rendering-in-linux-with.html\n\n```bash\nsudo add-apt-repository ppa:no1wantdthisname/ppa\nsudo apt-get update\nsudo apt-get upgrade\nsudo apt-get install fontconfig-infinality\n```\n\n设置风格为 `Infinality`：\n\n```bash\nsudo bash /etc/fonts/infinality/infctl.sh setstyle\n```\n\n设置渲染风格：\n\n```bash\n# 修改 USE_STYLE 为 UBUNTU\nsudo vim /etc/profile.d/infinality-settings.sh\n```\n\n启用 `Hinting full`。\n\n### 美化\n\n1. 壁纸\n\n   安装所有 Linux Mint 历史版本自带壁纸：\n\n   ```bash\n   sudo apt-get install mint-backgrounds-*\n   ```\n\n2. 图标\n\n   1. 经典 Numix-Circle 图标适配全，更新快：\n\n      ```bash\n      sudo add-apt-repository ppa:numix/ppa\n      sudo apt-get update\n      sudo apt-get install numix-icon-theme-circle\n      ```\n\n   2. 扁平化 Paper 图标，适合扁平化主题：\n\n      ```shell\n      sudo add-apt-repository ppa:snwh/pulp\n      # update repository info\n      sudo apt-get update\n      # install icon theme\n      sudo apt-get install paper-icon-theme\n      # install gtk theme\n      sudo apt-get install paper-gtk-theme\n      # install cursor theme\n      sudo apt-get install paper-cursor-theme\n      ```\n\n3. 主题\n\n   1. 添加 Numix PPA 后，安装 gtk 主题：\n\n      ```bash\n      sudo apt-get install numix-gtk-theme\n      ```\n\n      对于 Cinnamon 桌面而言，改变 Panel 主题可下载 `Numix-Cinnamon-2` 主题设置使用。\n\n   2. 添加 Adapta PPA 后，安装主题：\n\n      ```shell\n      sudo apt-get install adapta-gtk-theme\n      ```\n\n4. 登录窗口\n\n   同样选择 Numix 主题来统一风格，自定义背景修改 `/usr/share/mdm/html-themes` 路径下主题文件。\n\n### 输入法\n\nFcitx 搭配 Cinnamon 会产生一个僵尸进程，搜狗输入法容易导致概率性 CPU 占用 100%。所以使用[小小输入法](http://yongim.ys168.com/)。\n\n解压到主目录 `~/.yong`:\n\n```bash\nsudo chmod +x ./yong-tool.sh\nsudo ./yong-tool.sh --install\n```\n\n#### 输入法词库\n\n小小输入法内置词库少，可使用工具将其他词库转换后导入：https://github.com/studyzy/imewlconverter\n\n导入说明：https://github.com/studyzy/imewlconverter/wiki/Xiaoxiao\n\n### Java 开发环境配置\n\n默认 JDK 安装：\n\n```shell\nsudo apt-get update\nsudo apt-get install default-jre\n```\n\nOracle JDK 安装：\n\n```shell\nsudo add-apt-repository ppa:webupd8team/java\nsudo apt-get update\nsudo apt-get install oracle-java6-installer # JDK 6\nsudo apt-get install oracle-java7-installer # JDK 7\nsudo apt-get install oracle-java8-installer # JDK 8\n```\n\n版本之间切换：\n\n```shell\nupdate-alternatives --config java\nupdate-alternatives --config javac\n```\n\n### NFS 附件共享\n\n#### 安装\n客户端和服务端分别安装相关软件\n```shell\nyum -y install rpcbind nfs\nchkconfig rpcbind on # 开机启动 rpcbind 服务\nchkconfig nfs on # 开机启动 nfs 服务\n```\n启动相关服务：\n```shell\nservice rpcbind start\nservice nfs start\n```\n\u003e 以下示例中，分别使用两台本地虚拟机测试，服务端 ip:192.168.221.100，客户端 ip:192.168.221.101\n\n#### 服务端配置\n编辑配置文件 `/etc/exports`\n添加\n`/home/uploads 192.168.221.101(rw,all_squash,anonuid=0,anongid=0)`\nid 为文件夹所属的 uid 和 gid.\n查看该 uid 和 gid:\n```shell\nls -nd /home/uploads\n```\n\u003e 在 NFS 服务端，若该用户不存在，则会显示相应的 uid 和 gid 而非用户名和组名，需要在服务端创建 uid 和 gid 对应的用户名和组名，即可正确显示。\n\n配置说明：\n```\n192.168.221.101 客户端 ip\nrw 读写 ro 只读\nall_squash 无论客户端以何用户连接服务端，对服务端而言均为匿名用户\nanonuid 匿名用户的 uid\nanongid 匿名用户的 gid\n```\n\u003e uid 和 gid 最好为客户端和服务端均存在的 uid 和 gid 值\n\n#### 配置生效\n执行：\n```shell\nservice rpcbind restart\nservice nfs restart\n# service nfs reload   调整 /etc/exports 配置文件后进行服务重载\n```\n\n##### 查看\n服务端使用 showmount 命令查看 nfs 的共享状态\n```shell\nshowmount -e # 默认查看自己的状态，前提是要能解析自己\nshowmount -a # 显示已经与客户端连接的目录信息\n```\n客户端查看\n```shell\nshowmount -e 192.168.221.100\n```\n成功则显示目录，失败则会报错\n\n##### 错误解决\n1.  执行客户端查看命令后报错\n    \u003e `clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)`\n    \u003e 在服务端防火墙配置添加端口规则：\n\n    ```shell\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT\n    ```\n2.  执行上述操作后依然报错\n    \u003e `rpc mount export: RPC: Unable to receive; errno = No route to hostrpc mount export: RPC: Unable to receive; errno = No route to host`\n\n    在客户端上执行 `rpcinfo  -p  192.168.221.100`\n    查看列出的所有端口。\n\n    在服务端上，将列出的所有端口在防火墙中配置通过：\n\n    ```shell\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 43888 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 39912 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 47611 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 10235 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 64815 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 54924 -j ACCEPT\n    -A INPUT -m state --state NEW -m tcp -p tcp --dport 31590 -j ACCEPT\n    -A INPUT -m state --state NEW -m udp -p udp --dport 62105 -j ACCEPT\n    ```\n    执行成功。\n3.  若挂载目录为 `/root/*` 类似目录，则会报错：\n    \u003e `mount.nfs: access denied by server while mounting 192.168.221.100:/root/uploads/`\n\n    原因是由于 `/root/` 目录权限问题，更改权限为 `755` 可解决，或者挂载非 `/root/` 目录。\n\n#### 客户端配置\n重启服务：\n```shell\nservice rpcbind restart\nservice nfs restart\n```\n查看可用挂载\n```shell\nshowmount -e 192.168.221.100\n```\n出错参见上述出错解决方案\n#### 设置自动挂载\n创建本地挂载目录，例如和服务器相同，使用 `/home/uploads` 目录。\n编辑客户端 `/etc/fstab` 文件，追加一行\n```\n192.168.221.100:/home/uploads/ /home/uploads/ nfs defaults 0 0\n```\n挂载测试\n```shell\nmount -a\n```\n查看挂载\n```shell\nnfsstat -m\ndf -h\n```\n#### 卸载\n```shell\numount -l /home/uploads\n```\n#### 测试\n在服务端创建文件，看客户端是否共享，反之亦可。\n\n### Unison 文件同步\n\n#### 配置 SSH 免密登陆\n\n同步文件的服务器之间要求配置免密登陆，参见 [配置密钥登陆](#配置密钥登陆)\n\n#### 安装 Unison\n\n在两台服务器同时安装 Unison.\n\n官方仓库下载 https://github.com/bcpierce00/unison/releases 或直接下载编译好的 rpm 包。\n[ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/unison-2.40.63-1.el6.rf.x86_64.rpm](ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/unison-2.40.63-1.el6.rf.x86_64.rpm)\n\n安装：\n```shell\nrpm -ivh unison-2.40.63-1.el6.rf.x86_64.rpm\n```\n\n新建用户目录下 `.unison` 中的配置文件。\n例：新建一个 `test.prf` 配置文件\n\n```shell\n# Unison preferences\n# 全自动模式，接受缺省动作，并执行\nbatch = true\n# 根据创建时间来比较，而非内容，建议开启\nfastcheck = true\n# 保持同步文件的文件组信息\ngroup = true\n# 忽略文件\nignore = Path a/*\nlog = true\n# 日志文件路径，需要先创建\nlogfile = /root/unison/logs/webapp.log\n# 同步时最大线程数\nmaxthreads = 300\n# 保持同步过来的文件所有者\nowner = true\n# 保持读写权限\nperms = -1\n# 间隔 60 秒开始一次新的同步检查\nrepeat = 60\n# 失败重试次数\nretry = 3\n# 本地同步目录\nroot = /root/100\n# 远程同步目录\nroot = ssh://root@192.168.221.100//root/101\n# 第一次同步需要开启追踪所有文件，之后关闭来实现差异性同步，该配置同本地 root 配置\nforce = /root/100\n# 激活 rsync 传输模式\nrsync = true\n# 静默模式\nsilent = true\n# 同步修改时间\ntimes = true\n# 不变目录，扫描时可忽略\nxferbycopying = true\n```\n\n#### 配置脚本\n新建或编辑 `../unison/scripts/test.sh`.\n检测 unison 状态\n```shell\n#!/bin/bash\nresult=`ps -ef | grep \"/usr/bin/unison test\" | grep -v grep`;\nif [ -z \"$result\" ];then\n/usr/bin/unison test;\nfi\n```\n配置脚本定时启动\n```shell\ncrontab -e\n\nsh ../unison/scripts/test.sh \u003e/dev/null 2\u003e\u00261\n```\n#### 查看日志\n查看配置参数中指定的日志文件。\n\n#### 重新同步\n1.  注释配置文件中的 force 参数\n2.  运行 `unison test` 进行同步\n3.  注释配置文件中的 force 参数\n\n## 应用软件\n\n### 浏览器\n\n1. Chrome\n\n   ```bash\n   wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb\n   ```\n\n\n2. Firefox Dev\n\n   ```bash\n   # 使用 Umake 安装\n   umake web firefox-dev \n   ```\n\n### Chrome Apps\n\n1. Google Keep\n2. 豆瓣电台\n3. Enjoy Music Player\n4. Polarr\n5. All-in-One\n6. Postman\n\n### 编辑器\n\nVisual Studio Code - https://code.visualstudio.com/\n\n### Markdown 写作\n\n```bash\n# optional, but recommended\nsudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE\n# add Typora's repository\nsudo add-apt-repository 'deb https://typora.io ./linux/'\nsudo apt-get update\n# install typora\nsudo apt-get install typora\n```\n\n### 效率\n\n1. 白噪音 `ANoise`:\n\n   ```bash\n   sudo add-apt-repository ppa:costales/anoise\n   sudo apt-get update\n   sudo apt-get install anoise\n   ```\n\n2. 剪贴板管理 `Diodon`:\n\n   ```bash\n   sudo add-apt-repository ppa:diodon-team/stable\n   sudo apt-get update\n   sudo apt-get install diodon\n   ```\n\n3. 截图 `Shutter`:\n\n   ```bash\n   sudo apt-get install shutter\n   ```\n\n   设置快捷键命令 `shutter -s`，实现矩形选区截图。\n\n4. 护眼 `Redshift`:\n\n   ```bash\n   sudo apt-get install redshift\n   ```\n\n   初次启动可能提示缺少 `Geoclue` 组件，安装后可以使用自动网络定位。\n\n   手动配置文件 `~/.config/redshift.conf`:\n\n   ```bash\n   temp-day=6500        # 适应可设为 5500\n   temp-night=5500      # 适应可设为 4100\n\n   gamma=0.8            # 纠正笔记本大白屏幕的好方式\n   ```\n\n5. 录屏 GIF 工具: [peek](https://github.com/phw/peek)\n\n   ```shell\n   sudo add-apt-repository ppa:peek-developers/stable\n   sudo apt update\n   sudo apt install peek\n   ```\n\n\n\n### 开发环境\n\n1. [NVM](https://github.com/creationix/nvm)\n\n2. [Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/)\n\n3. Umake\n\n   Umake 是 Ubuntu 官方的一款用来安装开发环境及开发工具的工具，同样在 Linux Mint 下可用。预装已有 Umake 工具，但支持较少，通过 ppa 来升级。\n\n   ```bash\n    $ sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make\n    $ sudo apt-get update\n    $ sudo apt-get upgrade\n   ```\n\n4. [DBeaver](http://dbeaver.jkiss.org/): 跨平台数据库管理工具。\n\n5. [DiffMerge](https://sourcegear.com/diffmerge/): 跨平台 GUI 代码比较工具。\n\n6. [Wireshark](https://www.wireshark.org/): 跨平台抓包工具\n\n   ```shell\n   sudo add-apt-repository ppa:wireshark-dev/stable\n   sudo apt-get update\n   sudo apt-get install wireshark\n   ```\n\n   将本地用户加入 `wireshark` 用户组：\n\n   ```shell\n   sudo usermod -a -G wireshark rainy\n   ```\n\n   若打开提示无权限，首先给普通用户抓包权限：\n\n   ```shell\n   setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap\n   ```\n\n   然后进行权限控制，只有特定组，即 wireshark 用户组的用户才可以抓包：\n\n   ```shell\n   chown root /usr/bin/dumpcap\n   chmod u+s /usr/bin/dumpcap\n   groupadd wireshark\n   usermod -a -G wireshark username\n   chgrp wireshark /usr/bin/dumpcap\n   chmod o-rx /usr/bin/dumpcap\n   ```\n\n   [参考文档](https://wiki.wireshark.org/CaptureSetup/CapturePrivileges#Other_Linux_based_systems_or_other_installation_methods)\n\n7. [Code::Blocks](http://www.codeblocks.org/)\n\n   Daily Builds:\n\n   ```shell\n   sudo add-apt-repository ppa:damien-moore/codeblocks\n   sudo apt-get update\n   sudo apt-get install codeblocks\n   ```\n\n   Release Builds:\n\n   ```shell\n   sudo add-apt-repository ppa:damien-moore/codeblocks-stable\n   sudo apt-get update\n   sudo apt-get install codeblocks codeblocks-contrib\n   ```\n\n### 同步工具\n\n1. [坚果云](https://www.jianguoyun.com/)\n\n2. [Dropbox](https://www.dropbox.com/)\n\n   安装过程中需要联网下载，故需使用 `Proxychains` 来启动安装。\n\n   Dropbox 默认目录在 `~/Dropbox` 进行同步，备份目录只需要创建一个软链接到此目录即可。\n\n### 代理工具\n\n1. Shadowsocks\n\n   推荐使用 [Shadowsocks-qt5](https://github.com/shadowsocks/shadowsocks-qt5) 来设置。\n\n   ```bash\n   sudo add-apt-repository ppa:hzwhuang/ss-qt5\n   sudo apt-get update\n   sudo apt-get install shadowsocks-qt5\n   ```\n\n   在 Shadowsocks 启动后，会运行一个 `8123` 端口的 http 本地代理，不支持 socks 代理的可以使用此 http 代理方式。\n\n2. Proxychains\n\n   代理终端命令中的网络请求。在源中安装：\n\n   ```bash\n   sudo apt-get install proxychains\n   ```\n\n   然后配置文件 `/etc/proxychains.conf`。\n\n3. [Proxychains-ng](https://github.com/rofl0r/proxychains-ng)\n\n   Proxychains-ng 是 Proxychains 的增强版本，\n\n4. [Lantern](https://getlantern.org/)\n\n5. polipo(已停止维护)\n\n   polipo 是一个轻量级的缓存web代理程序，将 socks 代理转换为 http 代理。\n\n   ```bash\n   sudo apt-get install polipo\n   ```\n\n   配置文件 `/etc/polipo/config`：\n\n   ```bash\n   # This file only needs to list configuration variables that deviate\n   # from the default values.  See /usr/share/doc/polipo/examples/config.sample\n   # and \"polipo -v\" for variables you can tweak and further information.\n\n   logSyslog = true\n   logFile = /var/log/polipo/polipo.log\n\n   proxyAddress = \"0.0.0.0\"\n\n   socksParentProxy = \"127.0.0.1:1080\"\n   socksProxyType = socks5\n\n   chunkHighMark = 50331648\n   objectHighMark = 16384\n\n   serverMaxSlots = 64\n   serverSlots = 16\n   serverSlots1 = 32\n   ```\n\n   默认运行在 8123 端口，启动服务并为当前会话配置代理：\n\n   ```bash\n   sudo service polipo start\n   export http_proxy=\"http://127.0.0.1:8123/\"\n   ```\n\n### 文档阅读\n\n1. [Zeal](https://zealdocs.org/)\n\n   ```bash\n   $ sudo add-apt-repository ppa:zeal-developers/ppa\n   $ sudo apt-get update\n   $ sudo apt-get install zeal\n   ```\n\n2. Calibre\n\n   ```bash\n   sudo -v \u0026\u0026 wget -nv -O- https://raw.githubusercontent.com/kovidgoyal/calibre/master/setup/linux-installer.py | sudo python -c \"import sys; main=lambda:sys.stderr.write('Download failed\\n'); exec(sys.stdin.read()); main()\"\n   ```\n\n### 办公教育\n1. [QtiPlot](http://www.qtiplot.com/)\n\n   可以替代 OriginLab.\n\n   ```shell\n   sudo apt-get install qtiplot\n   ```\n\n2. [WPS Office](http://linux.wps.cn/)\n\n   许久未见更新，半死不活的样子。Linux 版本无法编辑公式，无法正确显示公式。只适合阅读不适合编辑。\n\n### 下载工具\n\n1. [Xware](https://github.com/yinheli/docker-thunder-xware)\n\n   会用 Docker 的一看就懂。\n\n2. [You-Get](https://github.com/soimort/you-get)\n\n   视频下载神器，同样地，下载 Youtube 视频用 Proxychains 代理。\n\n### 系统管理\n\n1. Gparted\n\n   图形化磁盘分区管理工具。\n\n   ```shell\n   sudo apt-get install gparted\n   ```\n\n## Windows 兼容\n\nLinux 平台下的应用虽然数量多，但质量也参差不齐。许多应用需要进行虚拟机或 wine 等方式来曲线救国。\n\n1. [CrossOver](https://www.codeweavers.com)\n\n   作为 wine 项目的商业支持版本，可以很方便安装一系列 Windows 平台软件。对于 Deepin Linux 用户已经预装在系统中，包含批量授权。其他发行版用户需要购买。\n\n2. Microsoft Office\n\n   鉴于 WPS for Linux 功能有限且字体各方面显示不尽人意，借助 CrossOver 可以完美安装 Microsoft Office 系列。但为了消除字体等造成的差异，还是选择在虚拟机下使用 Office。\n\n3. 虚拟机方案及优化\n\n   （待编辑）\n\n### 虚拟机 Tips\n\n#### VMWare 克隆虚拟机后克隆机无法连接网络\n\n编辑 eth0 的配置文件：\n\n```shell\nvi /etc/sysconfig/network-scripts/ifcfg-eth0\n```\n删除 `HWADDR` 和 `UUID` 的行，更改相应的虚拟机 ip，防止冲突。\n有必要再清空文件 `/etc/udev/rules.d/70-persistent-net.rules`.\n\n## Tips\n\n### Linux Mint 安装 git-lfs\n\ngit-lfs 提供了一个[安装文档](https://github.com/git-lfs/git-lfs/blob/master/INSTALLING.md)，但是在使用 Linux Mint 进行安装时需要按照文档中的说明进行变通。原脚本的自动检测功能并没有发挥作用，需要手动设置为兼容的上游发行版源，参见 [#1074](https://github.com/git-lfs/git-lfs/issues/1074).\n\n例如，使用 Linux Mint 18.x 进行安装时，需要设置为 ubuntu 16.04 的源。\n\n```shell\ncurl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | os=ubuntu dist=xenial sudo -E bash\n```\n\n然后就可以正常安装：\n\n```shell\nsudo apt-get update\nsudo apt-get install git-lfs\n```\n\n*Deepin 操作系统安装注意*\n\n上述安装脚本无法识别 Deepin 操作系统版本，由于 Deepin 最新版基于 debain jessie 开发，因而可以手动添加 debian jessie 源来安装。\n\n```shell\nsudo vim /etc/apt/source.list.d/github_git-lfs.list\n```\n\n内容如下：\n\n```\ndeb https://packagecloud.io/github/git-lfs/debian/ jessie main\ndeb-src https://packagecloud.io/github/git-lfs/debian/ jessie main\n```\n\n安装 apt-key:\n\n```shell\nsudo apt-get install curl gnupg\ncurl -L https://packagecloud.io/github/git-lfs/gpgkey | sudo apt-key add -\nsudo apt-get update\nsudo apt-get install debian-archive-keyring\nsudo apt-get install apt-transport-https -y\n```\n\n随后即可正常安装：\n\n```shell\nsudo apt-get install git-lfs\n```\n\n\u003e 由于 github 的 lfs 文件存储在 Amazon S3 服务器，所以在传送大文件时可能因为网络原因造成失败。所以可以通过配置 `hosts` 文件来使其走香港节点，来提高速度。\n\u003e\n\u003e 在 `hosts` 文件中添加：\n\u003e\n\u003e ```shell\n\u003e 219.76.4.4 github-cloud.s3.amazonaws.com\n\u003e ```\n\u003e\n\u003e 而通过配置代理方式来加速暂未成功，待更新。\n\n### 普通用户无法使用 sudo\n\n\u003e xxx is not in the sudoers file. This incident will bereported (xxx 为用户名)\n\n在超级用户模式下执行\n```\nchmod u+w /etc/sudoers\n```\n编辑该文件，找到\n```\nroot ALL=(ALL) ALL\nxxx  ALL=(ALL) ALL # 追加此行，xxx 为用户名\n```\n为了安全，修改结束后将用户写权限禁用\n```\nchmod u-w /etc/sudoers\n```\n### 救援模式更改 root 密码\n\n**以 centos 为例**\n\n添加光盘镜像：\n选择 `rescue install system`，进入 bash 后原系统将被挂载再 `/mnt/sysimage/` 下，之后执行\n\n```shell\nchroot /mnt/sysimage\n```\n若成功则 shell 提示符变为 `sh-4.1#`，之后即可对原系统进行恢复救援操作。\n\n### 配置密钥登陆\n\n在 xshell 中，点击 “工具 -\u003e 新建用户密钥生成向导 -\u003e ...\"\n生成之后，将公钥传输到 `.ssh` 下，执行\n\n```shell\ncat *.pub \u003e\u003e authorized_keys\n```\n此时生成的 `authorized_keys` 权限可能有问题，需要将权限改为 `600`.\n或者在本机将公钥传输\n```shell\nssh-copy-id -i ~/.ssh/id_rsa.pub root@xxx.xxx.xxx.xxx\n```\n本机为 windows 系统，用 git bash 传输，注意公钥的保存路径。\n执行权限更改操作以防安全\n```shell\nchmod 700 .ssh\nchmod 600 .ssh/authorized_keys\n```\n#### 开启免密登陆\n编辑 `sshd_config` 文件\n```shell\nvim /etc/ssh/sshd_config\n\nRSAAuthentication yes\nPubkeyAuthentication yes\nAuthorsizedKeysFile .ssh/authorized_keys\n```\n#### 配置 Linux 服务器仅使用密钥认证\n编辑 `sshd_config` 文件\n```shell\nvim /etc/ssh/sshd_config\n\n# 禁用密码认证\nPasswordAuthentication no\n# 启用密钥认证\nRSAAuthentication yes\nPubkeyAuthentication yes\n# 指定公钥数据库文件\nAuthorsizedKeysFile .ssh/authorized_keys\n```\n脚本执行上述修改\n```shell\nsed -i \"s/^PasswordAuthentication.*/PasswordAuthentication no/g\" /etc/ssh/sshd_config\nsed -i \"s/^#RSAAuthentication.*/RSAAuthentication yes/g\" /etc/ssh/sshd_config\nsed -i \"s/^#PubkeyAuthentication.*/PubkeyAuthentication yes/g\" /etc/ssh/sshd_config\nsed -i \"s/^#AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\\/authorized_keys/g\" /etc/ssh/sshd_config\n```\n重启 SSH 服务器启用，**保留一个会话以防不测**\n```shell\n# RPM 系\nservice sshd restart\n# DEB 系\nservice ssh restart\n# 老 Debian\n/etc/init.d/ssh restart\n```\n可以在每个用户的公钥后加入用户标识进行管理\n```shell\necho 'ssh-rsa XXXX' \u003e\u003e /root/.ssh/authorized_keys\n```\n### 计划任务\n\n1.  编辑 crontab 服务文件\n\n    ```shell\n    crontab -e\n    ```\n\n    ​\n\n2.  查看该用户下的 crontab 服务是否创建成功，用 crontab -l 命令\n\n3.  启动 crontab 服务\n    执行\n    ```shell\n    service crond start\n    service crond restart # 重启服务\n    ```\n    查看服务是否已运行：\n    ```shell\n    ps -ax | grep cron\n    ```\n\n4.  crontab 命令\n    ```shell\n    crontab -u # 设定某个用户的 cron 服务\n    crontab -l # 列出某个用户 cron 服务的详细内容\n    crontab -r # 删除某个用户的 cron 服务\n    crontab -e # 编辑某个用户的 cron 服务\n    ```\n    在编辑时，编辑内容要符合格式：\n    ```\n    */1 * * * * ls \u003e\u003e /tmp/ls.txt\n    ```\n    语法说明\n    ```\n    分    小时    日    月    星期    命令\n    0-59  0-23   1-31  1-12  0-6     command\n    ```\n    `*` 代表取值范围内的数字\n    `/` 代表每\n    `-` 代表从某个数字到某个数字\n    `,` 分开几个离散的数字\n\n### 使用本地镜像源\n\n对于 Oracle Linux\n\n```shell\ncd /etc/yum.repos.d/\nmv public-yum-ol6.repo public-yum-ol6.repo.bak # 绕过网络镜像\nmv packagekit-media.repo packagekit-media.repo.bak # 备份本地镜像源\n```\n将镜像挂载\n```shell\nmount /dev/cdrom /mnt/\n```\n新建本地镜像源\n```shell\nvim /etc/yum.repos.d/local.repo\n```\n```\n[local-media]\nname=local\nbaseurl=file:///mnt/\ngpgcheck=0 # 默认不检查 gpg\nenabled=1\n```\n### LVM 磁盘挂载、扩容、分区\n\nLVM是在磁盘分区和文件系统之间添加的一个逻辑层，来为文件系统屏蔽下层磁盘分区布局，提供一个抽象的盘卷，在盘卷上建立文件系统。首先我们讨论以下几个LVM术语。\n\nPV: 是物理的磁盘分区，一个硬盘分区组成一个 pv。\nVG: LVM 中的物理磁盘分区，必须加入 VG，VG 理解为一个大仓库。\nLV: 从 VG 中划分的逻辑分区\n\n下图为 LVM 逻辑卷管理示意图，来自 [维基百科](https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)#/media/File:Lvm.svg)\n\n![LVM 逻辑卷管理](images/Lvm.svg \"LVM 逻辑卷管理 \")\n\n#### 创建和管理 LVM\n\n\n1.  挂载新硬盘\n    新挂载硬盘的设备名为 `/dev/sdb`\n    管理开机挂载的文件在 `/etc/fstab`\n2.  创建分区\n    LVM 的分区类型为 8e。\n    使用 fdisk 创建分区，根据设备文件的绝对路径(/dev/sda)进入分区管理。\n    ```shell\n    fdisk /dev/sdb\n    ```\n    - 输入 n 创建新分区\n    - 输入 p 创建基本分区（p 是基本分区，e 是扩展分区）\n    - 选择分区编号，1~4，选择没使用的，新磁盘则使用 1\n    - 选择分区起始点，默认\n    - 选择分区终点，默认\n    - 回车，分区完成\n    - 输入 t，更改分区编号\n    - 输入 L，查看所有编号，选择 8e\n    - 保存退出，输入 w，写入磁盘\n\n    初始化分区 `sdb` 为物理卷 pv\n    ```shell\n    pvcreate /dev/sdb1\n    Physical volume \"/dev/sdb1\" successfully created\n    ```\n    显示物理卷信息\n    ```shell\n    pvdisplay\n    ...\n    \"/dev/sdb1\" is a new physical volume of \"10.00 GiB\"\n    --- NEW Physical volume ---\n    PV Name               /dev/sdb1\n    VG Name               \n    PV Size               10.00 GiB\n    Allocatable           NO\n    PE Size               0   \n    Total PE              0\n    Free PE               0\n    Allocated PE          0\n    PV UUID               1KxYdf-RKzH-ZC6u-j58D-B7d3-Bf3J-snknHS\n    ```\n    创建逻辑卷组 vg，将 `/dev/sdb` 加入到这个卷组里。\n    ```shell\n    vgcreate vg_other /dev/sdb\n    ```\n3.  对已有的卷组进行扩容\n    ```shell\n    vgextend vg_hand /dev/sdb1\n    ```\n    查看 vg 的容量已经增加\n    ```shell\n    vgdisplay\n    ```\n    查看已经存在的 lv 信息，以 LogVol01 为例\n    ```\n    lvextend -L 10G /dev/vg_hand/LogVol01 # 扩展 LV\n    ```\n    或者直接将剩余空间全部扩展\n    ```\n    lvextend -l +100%FREE /dev/vg_hand/logVol01 # 扩展剩余所有空间到 logVol01\n    ```\n    执行重设\n    ```shell\n    resize2fs /dev/vg_hand/LogVol01\n    ```\n4.  创建lv\n    ```shell\n    lvcreate -L 10G -n lv_new vg_hand\n    ```\n    然后进行格式化，查看系统的文件类型\n    ```shell\n    df -Th\n    ```\n    格式化 lv\n    ```shell\n    mkfs.ext4 /dev/vg_hand/new_lv\n    ```\n5.  lv 删除后，再次扫描或扩容，报错 LV missing，原因是需要刷新 VG，执行如下命令。\n    ```\n    vgchange -a y /dev/vg_hand\n    ```\n6.  从 vg 移除并删除 pv\n    ```shell\n    vgreduce vg_hand /dev/sda4\n    pvremove /dev/sda4\n    ```\n    删除该硬盘的 lvm 分区\n    ```shell\n    fdisk /dev/sda4\n    ```\n    - p 显示分区情况\n    - d 删除分区\n\n#### 错误执行 lvreduce 后的恢复\n执行 `lvreduce` 操作时，需要按顺序执行。\n- 若有挂载目录，需要先卸载目录 `umount /dir`\n- 文件系统检查 `e2fsck -f /dev/mapper/vg_hand-lv_dir`\n- 文件系统大小变更 `resize2fs /dev/mapper/vg_hand-lv_dir 10G`\n- lv 缩减 `lvresize -L 10G /dev/mapper/vg_hand-lv_dir`\n- 挂载所有 `/etc/fstab` 中的记录。\n\n若在执行 `lvreduce` 或 `lvresize` 之前没有执行文件系统大小变更的操作，则可能开机报错。\n```\nwrong fs type, bad option, bad superblock on /dev/mapper/vg_hand-lv_root\n```\n无法进入系统，需要进行恢复，恢复操作。\n挂载 iso 镜像，进入第三项。\n\n![进入恢复系统](images/lvm_restore1.png \"进入恢复系统\")\n\n之后若检测不到本机系统，则只进入 Shell 环境进行恢复操作。\n\n![点击继续](images/lvm_restore2.png \"点击继续\")\n\n若可以进入则系统被挂载在 `/mnt/sysimage` 下\n\n![挂载系统](images/lvm_restore3.png \"挂载系统\")\n\n```shell\nlvextend -L 5G /dev/vg_hand/lv_root # 扩展到原来的大小即可恢复\n```\n\n### 建立 Swap 分区\n\n阿里云和腾讯云默认不开启 swap，建立 swap 分区执行以下步骤。\n\n#### 创建用于交换分区的文件\n```shell\ndd if=/dev/zero of=/mnt/swap bs=block_size count=number_of_block\n```\n注：block_size、number_of_block 大小可以自定义，比如bs=1M count=1024 代表设置1G大小\n\n#### 设置交换分区文件\n```shell\nmkswap /mnt/swap\n```\n\n#### 立即启用交换分区文件\n```shell\nswapon /mnt/swap\n```\n如果在/etc/rc.local中有swapoff -a 需要修改为swapon -a\n\n#### 开机时启用 swap 分区\n修改文件 /etc/fstab 中的 swap 行。\n添加 `/mnt/swap swap swap default 0 0`\n\n设置后执行 `free -m` 命令查看效果。\n\n### 更改主机名\n\n阿里云默认主机名为随机生成，为区分需要修改主机名。\n\n#### 方法一\n```shell\nhostnamectl set-hostname 新主机名\n```\n\n#### 方法二\n```shell\nvim /etc/hosts\n```\n修改主机名：\n```shell\nvim /etc/sysconfig/network\n```\n修改 HOSTNAME。","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeekrainy%2Flinux-guide","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeekrainy%2Flinux-guide","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeekrainy%2Flinux-guide/lists"}