├── .gitignore ├── README.md ├── database ├── SQL-basic.md ├── mongodb配置.md ├── mysql-mriadb │ ├── mysql-backupdb.sh │ ├── mysql-mariadb-安装和基本配置.md │ ├── mysql主从-互备-读写分离.md │ └── 用户及权限.md ├── postgresql基本配置和使用.md ├── postgresql高可用.md └── 常用语句.md ├── file-type-association_文件类型的程序关联设置.md ├── git基本操作.md ├── hardware ├── hardware-info-tools-硬件信息查看工具.md └── storage-summary存储概述.md ├── infosec └── 安全渗透测试和防御.md ├── linux ├── README.md ├── archlinux │ ├── archlinux安装.md │ ├── customise-archiso.md │ └── vps2arch.sh ├── cluster │ ├── ansible-basic.md │ ├── cobbler-deployment.md │ ├── ohpc-warewulf部署.md │ ├── pdsh的基本使用.md │ ├── scheduler.md │ └── xcat-deployment.md ├── command-line-tools │ ├── awk.md │ ├── background-task后台任务.md │ ├── cmd-line-tips.md │ ├── expect.md │ ├── sed.md │ ├── shell │ │ ├── bash.md │ │ ├── csh-tcsh.md │ │ └── shell-tips.md │ ├── special-dir-usage.md │ ├── stty-tput终端控制.md │ ├── terminal-shell-skills终端常用快捷键和技巧.md │ ├── tmux.md │ ├── vim │ │ ├── vim-modes.md │ │ └── vim-tips.md │ └── 常用文本处理工具cat-head-tail-sort-uniq-cut-tr-grep-comm-diff.md ├── config-backup │ ├── etc │ │ ├── bluetooth │ │ │ └── audio.conf │ │ ├── default │ │ │ └── grub │ │ ├── environment │ │ ├── etckeeper │ │ │ ├── etckeeper-init.sh │ │ │ └── pre-commit.d │ │ │ │ └── 40pkglist │ │ ├── libvirt │ │ │ └── libvirtd.conf │ │ ├── locale.gen │ │ ├── pacman.conf │ │ ├── polkit-1 │ │ │ ├── localauthority │ │ │ │ └── 50-local.d │ │ │ │ │ └── color.plka │ │ │ └── rules.d │ │ │ │ └── 50-libvirt.rules │ │ ├── proxychains.conf │ │ ├── security │ │ │ └── limits.d │ │ │ │ └── 00.conf │ │ ├── sudoers │ │ ├── sysctl.d │ │ │ ├── 40-max-user-watches.conf │ │ │ ├── 80-disable-coredump.conf │ │ │ └── 90-vm.conf │ │ ├── systemd │ │ │ ├── coredump.conf │ │ │ ├── journald.conf │ │ │ ├── logind.conf │ │ │ └── system │ │ │ │ └── nvidia-enable.service │ │ ├── tlp.conf │ │ └── xrdp │ │ │ └── xrdp.ini │ └── userhome │ │ ├── .bashrc │ │ ├── .condarc │ │ ├── .config │ │ ├── Typora │ │ │ └── conf │ │ │ │ └── conf.user.json │ │ ├── dconf │ │ │ ├── README.md │ │ │ ├── backup-dconf.sh │ │ │ ├── dconf.conf │ │ │ └── gnome-settings-backup.conf │ │ ├── fcitx5 │ │ │ ├── conf │ │ │ │ ├── chttrans.conf │ │ │ │ ├── classicui.conf │ │ │ │ ├── clipboard.conf │ │ │ │ ├── cloudpinyin.conf │ │ │ │ ├── notifications.conf │ │ │ │ ├── pinyin.conf │ │ │ │ └── punctuation.conf │ │ │ ├── config │ │ │ └── profile │ │ ├── fontconfig │ │ │ └── conf.d │ │ │ │ └── cn-font.conf │ │ ├── mimeapps.list │ │ ├── starship.toml │ │ └── user-dirs.dirs │ │ ├── .gitignore_global │ │ ├── .tmux.conf │ │ ├── .vimrc │ │ ├── .vnc │ │ ├── config │ │ └── xstartup │ │ ├── .xinitrc │ │ ├── .xprofile │ │ ├── .zlogout │ │ ├── .zshrc │ │ └── zshrc-ohmyzsh-version ├── desktop-environment │ ├── desktop-environment.md │ ├── gnome配置.md │ └── wine │ │ ├── wine-fonts-adjust.reg │ │ ├── wine-fonts-adobe-source-sans.reg │ │ ├── wine-fonts-wqy-microhei.reg │ │ └── wine-fonts.md ├── filesystem │ ├── SAN-fc-iscsi-multipath.md │ ├── btrfs分区.md │ ├── ceph-delpy.md │ ├── common-fs-errors.md │ ├── file-permission文件权限.md │ ├── filesystem-basic.md │ ├── glusterfs配置.md │ ├── linux-file-info查看文件信息.md │ ├── lustre │ │ └── lustre-deployment.md │ ├── lvm逻辑卷管理.md │ ├── mount-fs挂载文件系统.md │ ├── nfs网络文件系统.md │ ├── pack-unpack-compression-extract-linux常用打包解包压缩解压.md │ └── samba服务.md ├── laptop笔记本相关.md ├── module-environment_模块环境切换.md ├── network │ ├── DNS域名服务.md │ ├── Infiniband配置.md │ ├── NAT.md │ ├── network-bridge-网桥配置.md │ ├── network-manage-tools.md │ └── ssh │ │ ├── complie-openssh.md │ │ ├── dropbear-ssh-usage.md │ │ └── ssh-usage-ssh使用.md ├── package-manager │ ├── archlinux-aur打包.md │ ├── buld-rpm-from-src.rpm.md │ ├── deb-mirror本地源.md │ ├── flatpak-packge-building.md │ ├── package-manager-tips包管理器.md │ └── rpm本地源.md ├── pve │ └── pve-tips.md ├── remote-desktop │ ├── vnc.md │ └── xrdp.md ├── security │ ├── fail2ban-config.sh │ ├── firewall.md │ ├── polkit-management.md │ └── user-security.md ├── softwares我的软件列表.md ├── system-maintain │ ├── IPMI.md │ ├── arbtd.md │ ├── at-cron-scheduled-task计划任务.md │ ├── cgroup-资源限制.md │ ├── cpu-utilization-monitoring.md │ ├── forget-password-and-reset重置系统密码.md │ ├── kernel.md │ ├── linux备份还原.md │ ├── log-system日志系统.md │ ├── ntp-时间设置相关.md │ ├── process进程管理.md │ ├── pxe部署系统.md │ ├── ssd固态硬盘优化.md │ ├── sysctl调节.md │ ├── vnc远程重装系统.md │ └── 编译升级glibc与修复.md ├── update-alternatives-multi-vers-switch多版本软件环境切换.md ├── user-management │ ├── freeipa.md │ ├── ldap │ │ ├── ldap客户端接入.md │ │ ├── ldap简介.md │ │ ├── openLDAP搭建.md │ │ └── pGina-ldap-config │ │ │ ├── enable-ldap-plugin.png │ │ │ ├── enable-pgina-service.png │ │ │ └── ldap-config.png │ ├── nis网络信息服务.md │ ├── sssd加入windows-AD域.md │ └── user-management.md ├── virtualization&container │ ├── docker-basic.md │ ├── podman-basic.md │ └── qemu-kvm.md └── web-server │ ├── lnmp搭建.md │ ├── nginx │ ├── conf.d │ │ ├── auth-pages │ │ │ └── auth-templ │ │ ├── demo.conf │ │ ├── donotvisitbyip.conf │ │ └── public │ │ │ ├── 40x-50x │ │ │ ├── forcessl │ │ │ ├── index-view │ │ │ ├── php │ │ │ └── ssl-tpl │ ├── nginx.conf │ └── nginx常用配置.md │ └── vsftpd.conf ├── macos ├── automater │ ├── Open Terminal.app.tar.xz │ └── Open iTerm.app.tar.xz ├── macos-launctl-自动任务.md └── macos-tips.md ├── programming ├── C-basic.md ├── GCC编译.md ├── R-lang-basic.md ├── go │ ├── go-basic.md │ ├── go-io-file.md │ ├── go-performance优化.md │ └── goroutine-concurrency.md ├── python │ ├── excel-csv-operation.md │ ├── python-basic.md │ ├── python-concurrent-programming.md │ ├── python-io.md │ └── python_virtualenv-venv-and-conda_env.md ├── rust-basic.md ├── tcl.md ├── web-frontend │ ├── CSS3新特性.md │ ├── CSS居中.md │ ├── JavaScript获取和设置CSS属性.md │ ├── canvas笔记.md │ ├── dom-event-事件相关.md │ ├── float浮动相关.md │ ├── js作用域、上下文、this和闭包.md │ ├── proxy监听对象属性.md │ └── 遍历-reduce-filter-map-foreach-forin-forof.md └── 位运算.md ├── regular-expression正则表达式笔记.md ├── symbols-names常用符号名.md ├── test-benchmark ├── disk-io-testing硬盘测试.md ├── fio.md ├── high-performance-linpack(hpl)-benchmark.md ├── iops.md ├── iozone.md ├── memory-test.md └── network-testing网络测试.md ├── windows ├── reg-files │ ├── get-administrator-permission-in-right-click-menu.reg │ ├── remove-get-administrator-permission-from-right-click-menu.reg │ ├── utc.reg │ └── 小鹤双拼.reg ├── windows-comands.md ├── windows-terminal │ └── Profile.ps1 ├── windows-tips.md └── wsl2-archlinux.md └── 自签名的TLS.md /.gitignore: -------------------------------------------------------------------------------- 1 | .directory 2 | desktop.ini 3 | .temp* 4 | .*sync* 5 | .tmp* 6 | .git.nosync 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 文档有大量引用或转述它处的内容,原本这些文档仅作为个人日常笔记,故许多引用或转述内容难以一一标注,笔记公开仅为互相学习之用。 2 | 3 | 一些收藏的链接 4 | 5 | - [正则表达式](https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md) 6 | 7 | github仓库,多国语言,在线练习。 8 | 9 | - [MDN](https://developer.mozilla.org/zh-CN/) 10 | 11 | Mozilla web 文档库,以web开发技术为主。 12 | 13 | - [命令行艺术- the art of commandline](https://github.com/jlevy/the-art-of-command-line) 14 | 15 | github仓库,众多人员参与编写改进的命令相关资料,以Linux下的Bash为主,也包含一些OSX和Windows命令行技巧。 16 | 17 | - [hello 算法](https://github.com/krahets/hello-algo) 18 | 19 | 《Hello 算法》:动画图解、一键运行的数据结构与算法教程。 20 | -------------------------------------------------------------------------------- /database/mongodb配置.md: -------------------------------------------------------------------------------- 1 | 安装mongodb,启动`mongodb`服务。 2 | 3 | Mongodb安装后自身是没有密码的,用户连接只需填写id地址,端口号,数据库名称即可。 4 | 5 | 默认监听27017端口,可指定端口和数据库目录: 6 | 7 | ``` 8 | mongod --port 27017 --dbpath /data/db1 9 | ``` 10 | 11 | # 修改数据库默认目录 12 | 13 | 编辑/etc/mongodb.conf的dbpath 14 | 15 | # 迁移数据 16 | 17 | 需要安装有`mongodb-tools`,以提供相关命令 。 18 | 19 | ## 导出 20 | 21 | ```shell 22 | mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 导出到的目录 23 | ``` 24 | 25 | 如果不指定`-d`数据库,则会导出所有数据库到该目录。 26 | 27 | 28 | 29 | ## 导入 30 | 31 | ```shell 32 | mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 包含数据库的目录 33 | ``` 34 | 35 | `--drop`参数将删除所有先前的记录信息。 36 | 37 | 如果不指定`-d`数据库,将导入该目录下所有数据库。 38 | 39 | -------------------------------------------------------------------------------- /database/mysql-mriadb/mysql-backupdb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/sh 2 | user= 3 | password= 4 | database= 5 | table='*' 6 | path=~/backup 7 | prefix= 8 | timestamp=$(date +%F) 9 | num=7 10 | 11 | [[ -d $path ]] mkdir -p $path 12 | 13 | mysqldump -u$user -p$password $database --skip-lock-tables | xz > $path/$prefix-$timestamp.sql.xz 14 | 15 | cd $path 16 | 17 | find . -name '*.sql.xz' -mtime $num -exec rm {} \; 18 | 19 | #restore 20 | #xz -d xx.xz 21 | #mysql -uuser -ppassword < xxx.sql -------------------------------------------------------------------------------- /database/mysql-mriadb/用户及权限.md: -------------------------------------------------------------------------------- 1 | # 创建 2 | 3 | ```shell 4 | create user user1 identified by 'passwd1'; 5 | grant all privileges on db1.* to user1@'%' identified by 'passwd1'; 6 | flush privileges; 7 | ``` 8 | 9 | 查看当前登录的用户 10 | 11 | ```sql 12 | select user(); 13 | ``` 14 | 15 | 16 | 17 | 18 | 19 | ```sql 20 | 21 | grant all privileges on *.* to 'user1'@'%' 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /database/常用语句.md: -------------------------------------------------------------------------------- 1 | 查看表是否存在 2 | 3 | ```sql 4 | select count(*) from pg_class where relname = "table_A"; 5 | ``` 6 | 7 | 如果存在返回count值为1 8 | 9 | ```sql 10 | select tablename from pg_tables where schemaname = 'public'; 11 | ``` 12 | 13 | 用户自定义的表如未经特殊处理,默认都是放在名为public的schema下,以上语句会返回所有表。 14 | 15 | 16 | -------------------------------------------------------------------------------- /hardware/hardware-info-tools-硬件信息查看工具.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Linux 4 | 5 | ## lspci 6 | 7 | 查看pci设备 8 | 9 | ```shell 10 | lspci 11 | ``` 12 | 13 | 14 | 15 | ## dmidecode 16 | 17 | DMI(Desktop Management Interface)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。 SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force (DMTF)起草的开放性的技术标准,其中DMI设计适用于任何的平台和操作系统。 18 | ```shell 19 | dmidecode 20 | 21 | #dmidecode -t <类型> 22 | dmidecode -t #查看所有可选择类型 23 | 24 | dmidecode -t system #SMBIOS data获取系统信息(如制造商,型号) 25 | 26 | #内存 27 | dmidecode -t memory 28 | 29 | #内存条数量 30 | dmidecode -t memory|grep -i Size|grep -vi No|wc -l 31 | 32 | #总物理内存大小 33 | dmidecode -t memory|grep -i Size|grep -vi No| awk '{sum += $2};END{print sum}' 34 | ``` 35 | 36 | 37 | 38 | ## lshw 39 | 40 | 可以查看详细的硬件信息 41 | 42 | ```shell 43 | lshw #查看所有硬件 44 | lshw -short #-short 简略模式 45 | lshw -c disk,storage -short #-c 或 -class 显示指定类型 46 | lshw -class cpu -short #查看CPU cpu或processor 47 | ``` 48 | 49 | 50 | 51 | ## hwloc、hwloc-ls 、lstopo-no-graphics 和 hwloc-gui 52 | 53 | hwloc,haredware location list topology,General information about hwloc ("hardware locality"),输出硬件信息: 54 | 55 | ```shell 56 | hwloc-info 57 | ``` 58 | 59 | hwloc-ls和lstopo-no-graphics是一样的,Show the topology of the system,用于显示硬件拓扑结构。 60 | 61 | ```shell 62 | hwloc-ls 63 | hwloc-ls --only pci #只显示pci设备 64 | hwloc-ls --only NUMANode 65 | hwloc-ls --no-io #不显示io设备 66 | ``` 67 | 68 | hwloc-gui是General information about hwloc ("hardware locality"),可输出硬件信息的结构图: 69 | 70 | ```shell 71 | lstopo --of png > hardward-topology.png 72 | ``` 73 | 74 | 75 | 76 | 77 | 78 | # Windows 79 | 80 | ## aid64 -------------------------------------------------------------------------------- /hardware/storage-summary存储概述.md: -------------------------------------------------------------------------------- 1 | # 存储类型 2 | 3 | ## 集中式存储 4 | 5 | 传统存储的集中式存放数据到中心设备中。 6 | 7 | 传统磁盘存储: 8 | 9 | - **封闭系统的存储**(主要指大型机 略) 10 | 11 | - **开放系统的存储** 12 | 13 | - **内置存储** 14 | 15 | - **外挂存储**(*根据连接方式分类*) 16 | 17 | - **DAS** - **直连式存储**(或称为直接连接存储Direct Attached Storage) 18 | 19 | ​ **存储设备**<--->**客户端FS**<--->**客户端应用程序** 20 | 21 | 将外部存储设备使用SCSI/FC等方式直接连接到计算机上使用。 22 | 23 | - **FAS** - **网络化存储**(Fabric-Attached Storage)(*根据传输协议分类*) 24 | 25 | - **NAS** - 网络接入存储(Network Attached Storage) 26 | 27 | 通过TCP、UDP等网络协议将目录共享给客户端。输出的是文件级别。 28 | 29 | 典型应用:NFS、SAMBA 30 | 31 | - **SAN** - 存储区域网络(Storage Area Network) 32 | 33 | **存储设备**<--->**FC/ISCSI**<--->**客户端FS**<--->**客户端应用程序** 34 | 35 | 将传输网络模拟成SCSI总线来使用,通过网络将存储设备(一般是磁盘阵列)以块文件方式映射到计算机上。 36 | 37 | - IP-SAN/ISCSI-SAN 基于以太网 38 | 39 | **iSCSI**(Internet Small Computer System Interface,发音为/ˈаɪskʌzi/),Internet小型计算机系统接口,又称为IP-SAN,基于因特网和SCSI-3协议下的存储技术。 40 | 41 | - FC-SAN 基于光纤通道 42 | 43 | 44 | ## 分布式存储 45 | 46 | Distributed data store,DDS 47 | 48 | 数据分散在多个存储节点上,各个节点通过网络相连,对这些节点的资源进行统一的管理。 49 | 50 | - 块存储 51 | - 对象存储系统 52 | - 文件存储系统 53 | 54 | 55 | 56 | # 硬盘分类 57 | 58 | 按照存储介质分类: 59 | 60 | - HDD Hard Disk Drive 硬盘(为了与固态硬盘相区分称“机械硬盘”或“传统硬盘”) 61 | 62 | 按照接口协议分类参看后问硬盘接口协议,按照常规尺寸分类主要是2.5寸和3.5寸。 63 | 64 | 例如:1TB 10000转 SAS 3.5寸硬盘,包含了容量、转速、数据接口协议类型以及尺寸。 65 | 66 | - SSD Solid State Drive 固态硬盘 67 | 68 | 固态硬盘一般首先按照外观结构接口分类,再按照支持的逻辑设备接口(驱动程序)与总线协议分类。 69 | 70 | 例如:512G M.2接口 Nvme协议 PCIex4总线 71 | 72 | - HHD Hybrid drive或Solid state hybrid drive 混合固态硬盘 73 | 74 | 75 | 76 | ## 接口类型 77 | 78 | 物理设备接口的外观形态 79 | 80 | - IDE Integrated Drive Electronics,电子集成驱动器 81 | 82 | - SATA 83 | 84 | AHCI协议,SATA总线 85 | 86 | - SATAe AHCI协议,SATA总线,两个SATA接口和一个辅助接口组合而成(提升速度),目前多被M.2接口取代 87 | 88 | - SCSI 89 | 90 | - SAS 91 | 92 | AHCI协议,SATA总线 93 | 94 | - mSATA (mini-SATA) 95 | 96 | AHCI协议,SATA总线 97 | 98 | - M.2(前身NGFF,标准名称为PCI Express M.2 Specification) 99 | 100 | 用于固态硬盘,尺寸小,替代mSATA 101 | 102 | 按照接口处的缺口形态区分: 103 | 104 | - Bkey(socket 2) 105 | 106 | 1个 缺口在左侧,缺口左方6引脚(金手指) 107 | 108 | SATA总线或PCIex2总线 109 | 110 | - Mkey(socket 3) 111 | 112 | 1个缺口在右侧,缺口右方5引脚 113 | 114 | 使用NVMe协议,PCIex4总线 115 | 116 | - B&M key 117 | 118 | 两个缺口(为B和M的缺口位置) 119 | 120 | PCIex2总线 121 | 122 | - U.2 123 | 124 | NVMe协议口,PCIe总线,外观上和SAS接口一致 125 | 126 | - PCIe PCI Express(也简称PCI-E) 直连 CPU,速度快 127 | 128 | 可有 PCIe 2.0x2、PCIe 2.0x4、PCIe 2.0x8、PCIe 3.0x4等等 129 | 130 | 有兼容SATA、不带NVMe、带NVMe等类型 131 | 132 | 133 | 134 | ## 传输协议 135 | 136 | - ACHI 137 | - iSCSI 138 | - NVMe 139 | 140 | 141 | 142 | ## 传输总线 143 | 144 | 计算机多个电子元器(如CPU,内存,硬盘等)之间**传输数据的公用通道**。 145 | 146 | - PCIe 147 | - SATA 148 | - ATA 149 | - SCSI 150 | - SAS -------------------------------------------------------------------------------- /linux/README.md: -------------------------------------------------------------------------------- 1 | 优秀Linux相关文档: 2 | 3 | - 红帽文档(RedHat doc) 4 | 5 | [红帽官网](https://access.redhat.com/)在产品&服务(produt&service)中选择某项产品,进入后选择Product Documentation即可看到相关文档,一般有英文中文等多国语言。 6 | 7 | 例如关于[红帽企业版8的文档](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/)(RHEL)的基础性文档(不少内容对其他Linux发行版适用)。 8 | 9 | - [archlinux wiki](https://wiki.archlinux.org/) 10 | 11 | - [debian wiki](https://wiki.debian.org/DebianWiki) 12 | 13 | - [opensuse wiki](https://zh.opensuse.org/index.php?title=首页&variant=zh) -------------------------------------------------------------------------------- /linux/archlinux/customise-archiso.md: -------------------------------------------------------------------------------- 1 | 参看https://wiki.archlinux.org/title/Archiso 2 | 3 | 4 | 5 | 1. 安装archiso包 6 | 7 | 2. 复制模板配置 8 | 9 | `/usr/share/archiso/configs`下有两个模板目录: 10 | 11 | - baseline 最小archlinux livecd iso配置 12 | - releng 每月构建的archlinux livecd iso配置 13 | 14 | ```shell 15 | cp -r /usr/share/archiso/configs/baseline/ archlive 16 | ``` 17 | 18 | 19 | 20 | 3. 各种自定义操作 21 | 22 | 例如: 23 | 24 | - 修改root密码 25 | 26 | ```shell 27 | #例如设置root密码为root 28 | echo "root:$(echo root |openssl passwd -6 -stdin):14871::::::" > archlive/airootfs/etc/shadow 29 | ``` 30 | 31 | 4. 构建archiso 32 | 33 | ```shell 34 | mkarchiso -v archlive #-o ./archlinux-2024.12.12-x86_64.iso 35 | ``` 36 | 37 | 如不指定`-o`,将默认生成iso到out目录中。 38 | 39 | 40 | 41 | --- 42 | 43 | tips: 44 | 45 | - archlinux live iso会默认启动sshd 46 | - 如果在本地网络中安装archlinux,可使用`ssh root@archiso.local`访问 47 | 48 | -------------------------------------------------------------------------------- /linux/cluster/ansible-basic.md: -------------------------------------------------------------------------------- 1 | [ansible doc](https://docs.ansible.com) 2 | 3 | # 安装 4 | 5 | [ansible installation](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) 6 | 7 | 参看文档确定系统环境满足[ansible使用要求](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#prerequisites),一般需要: 8 | 9 | - 控制节点(安装和执行ansible的主机) 10 | 11 | - python2.7+(建议python3+) 12 | - *nix (Unix及衍生版,Linux),windows系统不可以做控制主机 13 | 14 | - 被管理节点 15 | 16 | - python2.7+(建议python3+) 17 | 18 | - 开启sshd 19 | 20 | 管理主机默认使用ssh与托管节点通信,使用 sftp传输文件,如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式。 21 | 22 | - 如果开启了selinux,需要安装`libselinux-python` 23 | 24 | # 配置 25 | 26 | ## 配置文件 27 | 28 | * `ANSIBLE_CONFIG`环境变量对应的文件 29 | 30 | ```shell 31 | export ANSIBLE_CONFIG=/path/to/conf_file 32 | ``` 33 | 34 | * 当前目录(`$PWD`)中的ansible.cfg 35 | 36 | * `~/.ansible.cfg` 37 | 38 | * ansible程序默认的config文件,例如包管理安装的ansbile的配置文件一般是`/etc/ansible/ansible.cfg` 39 | 40 | 41 | 42 | ### anisble-config工具 43 | 44 | `ansible-config`工具:实用程序允许用户查看所有可用的配置设置、它们的默认值、如何设置它们以及它们的当前值来自何处,其参数的作用如下: 45 | 46 | > ```shell 47 | > list Print all config options 48 | > dump Dump configuration 49 | > view View configuration file #查看当前生效的配置文件 50 | > ``` 51 | 52 | 53 | 54 | ### 配置文件安全 55 | 56 | 注意配置文件的读写权限:如果允许从全局可写(其他任何用户都可写)的当前工作目录中加载ansible.cfg,会造成严重的安全风险;因此,如果配置目录全局写入,则不会自动从当前工作目录中加载配置文件。 57 | 58 | 一般不建议在配置文件中写上ssh的密码信息(使用密码认证),建议配置好控制节点到被管理节点的密钥认证。 59 | 60 | 61 | 62 | ### ansible主配置文件 63 | 64 | INI格式的一种变体,哈希号(#)和分号(;)都可以作为注释标记。但是,如果注释与规则值内联,则只允许分号引入注释。 65 | 66 | ```ini 67 | [defaults] ;默认的配置项,可在inventory文件中覆盖这些项的值 68 | inventory = ~/.ansible/hosts ;库存文件 该文件配置被管理主机信息 69 | #library = /usr/share/my_modules/ ;Ansible模块位置 70 | #remote_tmp = ~/.ansible/tmp 71 | #local_tmp = ~/.ansible/tmp 72 | log_path=/var/log/ansible.log ;默认不记录 73 | #--- 74 | #ansible在被管理节点使用的ssh相关配置项,这些值也可在inventory文件中设置 75 | host_key_checking = False 76 | #ansible_ssh_user=root 77 | #an 78 | #ansible_ssh_port=22 79 | #ansible_ssh_pass=pwd@root 80 | #ansible_ssh_key=/root/.ssh/id_rsa 81 | #private_key_file = ~/.ssh/id_rsa 82 | #--- 83 | forks = 16 ;并发连接数,默认为5 84 | 85 | [privilege_escalation] ;用户权限相关 86 | #become=True ;是否使用sudo 87 | #become_method=sudo 88 | #sudo_user=root ;默认执行命令的用户 89 | #ask_sudo_pass = True 90 | #ask_pass = True ;如果主机清单没有配置远程密码,则执行ansible命令会询问密码 91 | #--- 92 | #timeout=60 93 | #--- 94 | #ansible_shell_type = ;默认sh(现在Linux发行版中实际sh多指向bash/dash等) 95 | #interpreter_python = /usr/bin/python3 ;被管理节点使用的python路径 96 | ``` 97 | 98 | 99 | 100 | ### inventory文件 101 | 102 | 文件格式支持ini和yaml两种格式。一个inventory文件示例(INI): 103 | 104 | ```ini 105 | #-----未分组的主机,一行一个主机地址 106 | manage-server 107 | 10.0.0.201 108 | #--如果ssh端口不是默认的22,可在主机名后指定ssh的端口 109 | login01:10022 110 | #--在主机后面可以添加为本主机特别指定的环境变量 111 | db01 ansible_ssh_port=10022 112 | #--连接类型,默认smart,会使用ssh且启用ssh的ControlPersist保持连接(如果可用) 113 | mgt01 ansible_connection=local ;本机使用local 114 | 115 | #-----主机分组 116 | [computing] ;方括号中是组名 117 | fat01 118 | #--前缀相同,而后缀有一定连续递增的规律的主机可使用简写形式 119 | cn[01:03] ;数字简写,表示cn01 cn02 cn03 120 | gpu-[a:c] ;字母简写,表示gpu-a gpu-b gpu-c 121 | 122 | #-----组变量 123 | [computing:vars] ;组名:vars 124 | nterpreter_python = /usr/bin/python 125 | 126 | [vm] 127 | vm[01:06] 128 | 129 | #-----一个组可包含其他组 130 | [clients:children] ;组名:children 其他组成为本组的子组 131 | computing 132 | vm 133 | 134 | ``` 135 | 136 | 137 | 138 | ### 主机环境变量文件 139 | 140 | 在 inventory 主文件中保存所有的变量并不是最佳的方式,还可以保存在与 inventory 文件保持关联的独立的文件中,文件格式为 YAML。 141 | 142 | ```yaml 143 | ``` 144 | 145 | 146 | 147 | # 使用 148 | 149 | ```shell 150 | ansible [options] 151 | ``` 152 | 153 | `` 指定模块名称,如不指定,默认使用`command`模块(设置默认模块可以修改`module_name`变量) 160 | 161 | 162 | 163 | ```shell 164 | ansible all --list-host #查看所有主机 165 | 166 | #简单的测试,-m指定使用ping模块,检查所有主机连通性 167 | ansible all -m ping 168 | 169 | #对于没有进行ssh密钥认证的主机,也可以调用authorized_key模块完成公钥上传 170 | ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=yes" --ask-pass 171 | 172 | #再不指定module的情况 173 | ``` 174 | 175 | ansible 返回的类型是一个键值对的 json 格式的数据,`ping`返回内容示例: 176 | 177 | >```shell 178 | >localhost | SUCCESS => { 179 | > "changed": false, 180 | > "ping": "pong" 181 | >} 182 | >``` 183 | 184 | 185 | 186 | ## 模块 187 | 188 | -------------------------------------------------------------------------------- /linux/cluster/pdsh的基本使用.md: -------------------------------------------------------------------------------- 1 | # 安装 2 | 3 | - 从源安装(以yum安装为例) 4 | 5 | ```shell 6 | #yum安装确保已经安装epel源,pdhs位于该源中 7 | yum install epel-release 8 | yum install pdsh 9 | #不同发行版打包不同,rhel/centos中pdsh的相关mod单独打包 10 | #pdsh-mod-dshgroup.x86_64 : Provides dsh-style group file support for pdsh 11 | #pdsh-mod-genders.x86_64 : Provides libgenders support for pdsh 12 | #pdsh-mod-netgroup.x86_64 : Provides netgroup support for pdsh 13 | #pdsh-mod-nodeupdown.x86_64 : Provides libnodeupdown support for pdsh 14 | #pdsh-mod-torque.x86_64 : Provides support for running pdsh under Torque jobid 15 | #pdsh-rcmd-rsh.x86_64 : Provides bsd rcmd capability to pdsh 16 | #pdsh-rcmd-ssh.x86_64 : Provides ssh rcmd capability to pdsh 17 | ``` 18 | 19 | - 编译安装 20 | 21 | 下载[pdsh编译](https://github.com/chaos/pdsh/releases)。常用的几个编译选项: 22 | 23 | ```shell 24 | bash bootstrap 25 | ./configure --prefix=/usr/local/pdsh --with-ssh --with-exec machines=/path/to/machines --with-dshgroups --with-timeout=15 --with-readline 26 | ``` 27 | 28 | - `--with-ssh` ssh模块(支持ssh) 29 | 30 | - `--with-dshgroups` 支持dsh风格的主机分组 31 | 32 | - `--with-machines=` 主机列表文件路径 33 | 34 | 在该文件中写入主机地址(或主机名——需要在hosts中写好主机解析),每行一个。 35 | 36 | 存在machines文件,使用`pdsh`执行时若不指定主机,则默认对machines文件中所有主机执行该命令。 37 | 38 | - `--with-exec` exec模块 39 | 40 | - `--with-timeout` 超时,默认10s 41 | 42 | - `--with-nodeupdown` 节点宕机功能 43 | 44 | - `--with-readline` 支持交互式输入模式 双击tab自动补全 45 | 46 | 47 | 具体可参看[文档](https://github.com/chaos/pdsh)。 48 | 49 | # 使用 50 | 51 | ## 命令介绍 52 | 53 | 一条pdsh命令分为三部分:`pdsh` + `参数` + `并行执行的命令`。 54 | 55 | 参数部分不一定是必须的,该部分中一般会指定要执行的命令的主机信息。 56 | 57 | 如果只输入前面两部分,回车后可进入pdsh交互式命令行(若是编译安装需要启用`--with-readline`),再输入并行执行的命令部分,如: 58 | 59 | ```shell 60 | pdsh -w 192.168.0.[1-9] #回车后进入交行命令行 61 | ``` 62 | 63 | 64 | 65 | 常用参数: 66 | 67 | - `-w` 指定主机 `-x` 排除指定的主机 68 | 69 | 目标主机可以使用Ip地址或主机名(确保该主机名已经在`/etc/hosts`中存在解析) 70 | 71 | 多个主机之间可以使用逗号分隔,可重复使用该参数指定多个主机;可以使用简单的正则(参看下面的示例)。 72 | 73 | - `-g` 指定主机组 `-X` 排除指定主机组 74 | 75 | - `-l ` 超时时间(单位:秒) 82 | 83 | - `-N` 用来关闭目标主机所返回值前的主机名显示。 84 | 85 | - `-b` 禁止Ctrlc特性,使用该选项和,按下Ctrlc将kill所有并行的任务。 86 | 87 | 88 | 89 | ## 环境变量 90 | 91 | 重要环境变量(参看`man pdsh`) 92 | 93 | - `DSHGROUP_PATH` 分组主机列表文件存放目录 94 | 95 | - `WCOLL` 默认主机列表文件路径 96 | 97 | - `PDSH_RCMD_TYPE` 同`-R`选项,设置rcmd模块,默认为rsh,可以设置为ssh 98 | 99 | ```shell 100 | export PDSH_RCMD_TYPE=ssh 101 | ``` 102 | 103 | - `PDSH_SSH_ARGS` 设置ssh参数 104 | 105 | - `PDSH_SSH_ARGS_APPEND` 设置追加的ssh参数(如ssh的`-q`参数) 106 | 107 | - `DPATH` 设置远程主机的`PATH`变量 108 | 109 | 110 | 111 | 112 | ## 主机列表文件 113 | 114 | 主机列表文件包含一个或多个主机信息,当存在该文件时,直接使用`pdsh`命令而不指定主机列表,将默认指定主机列表中的主机执行后续命令。 115 | 116 | 注意:如果是编译安装,需要`--with-machines`启用该功能并指定主机列表文件路径。 117 | 118 | `WCOLL`环境变量也设置主机列表文件路径: 119 | 120 | ```shell 121 | [ -r ~/pdsh/nodes ] && export WCOLL=~/pdsh/nodes 122 | ``` 123 | 124 | 125 | 主机列表文件示例: 126 | 127 | ```shell 128 | c[01-11] 129 | c11 130 | ``` 131 | 132 | 133 | 134 | 使用示例: 135 | 136 | 137 | ```shell 138 | pdsh hostname  #主机列表文件对应的文件中的所有主机执行hostname命令 139 | pdsh -w c[01-10] -w 10.0.0.1 date #对c01--c10主机和10.0.0.1执行date命令 140 | pdsh -w c[01-10] -x c2 poweroff #对c01--c10但排除c02 执行关机命令 141 | pdsh -w c01,c10,master reboot #对c1,c10,master执行重启命令 142 | pdsh -w c[01-10] -l test id #使用test用户在c01--c10执行id命令 143 | ``` 144 | 145 | 146 | 147 | ## 主机分组 148 | 149 | 如果安装有dshgroup模块(编译安装需要启用`--with-dshgroups`,rpm包需要安装pdsh-mod-dshgroup),可使用主机分组功能。 150 | 151 | 默认的主机组定义文件存放目录是`/etc/dsh/group/`或`~/.dsh/group/`,该目录中可包含一个或多个主机列表文件,其环境变量为`DSHGROUP_PATH`,可以定义主机列表的存放目录,如: 152 | 153 | ```shell 154 | [ -d ~/pdsh/group ] && export DSHGROUP_PATH=~/pdsh/group 155 | ``` 156 | 157 | 例如在主机组目录中添加了`group1`和`group2`两个主机列表文件: 158 | 159 | ```shell 160 | pdsh -g group1 hostname #在group1组的主机上执行hostname命令 161 | pdsh -g group2 uname -r #在group2组的主机上执行uname -r命令 162 | ``` 163 | 164 | 165 | 166 | ## pdcp 167 | 168 | pdsh提供的多主机并行复制工具,该功能需要每个主机都装有pdsh。 169 | 170 | 用法类似cp。 171 | 172 | -------------------------------------------------------------------------------- /linux/cluster/scheduler.md: -------------------------------------------------------------------------------- 1 | # 调度器简介 2 | 3 | ## PBS系列变迁 4 | 5 | ### PBS 6 | 7 | [PBS](https://en.wikipedia.org/wiki/Portable_Batch_System),即Portable Batch System。 8 | 9 | - 1991年6月17日开始:NASA合同项目,开发源代码的主要承包商是MRJ Technology Solutions公司。 10 | 11 | - 20世纪90年代末:Veridian收购MRJ。 12 | 13 | - 2003年:Altair Engineering于从Veridian获得了所有PBS技术和知识产权的权利,并雇佣了NASA的原始开发团队。 14 | 15 | 16 | 17 | NASA项目PBS,MRJ承接开发PBS ---> Verdidian收购MRJ ---> Altair从Verdidian获得PBS 18 | 19 | 20 | 21 | ### PBS Pro 22 | 23 | 即PBS Professional,Altair公司提供的PBS版本,具有开源(PBS许可)和商业双重许可。 24 | 25 | 26 | 27 | ### openPBS 28 | 29 | - 1998年:从MRJ开源的PBS版本上进行开发,后开发不活跃,而其分支[torque](#torque)活跃开发,被广泛使用。 30 | - 2018年5月起:Altair将开源许可的PBS pro命名为[openPBS](https://www.openpbs.org)。 31 | 32 | 33 | 34 | ### torque--从开源走向闭源 35 | 36 | [torque](https://en.wikipedia.org/wiki/TORQUE),即Terascale Open-source Resource and QUEue Manager,AdaptiveComputing Enterprises Inc.(原Cluster Resources,Inc.)维护的openPBS分支。 37 | 38 | - 2003年到2018年6月期间维护的OpenPBS的分支为开源软件 39 | - 2018年6月起:转为非自由软(none-free software)。 40 | 41 | 42 | 43 | 44 | 45 | ## LSF系列--LSF变更与openlava的终结 46 | 47 | [LSF](https://en.wikipedia.org/wiki/Platform_LSF),即Load Sharing Facility。 48 | 49 | - 1993年:加拿大多伦多大学[Utopia](https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.121.1434)(乌托邦)项目为LSF前身,Platform Computing公司(由Utopia的几个开发者成立)发布LSF。 50 | 51 | - 2007年-2011年:2007年,Platform Computing公司发布LSF的简化开源版本——Plaform Lava 1.0(基于老版本的LSF 4.2,使用GPL v2),无后续发布。 52 | 53 | - 2011年6月:[openLava](https://en.wikipedia.org/wiki/OpenLava) 1.0发布到github,其由Platform Computing员工David Bigagli基于Platform Lava派生,使用GPL v2。 54 | 55 | - 2012年1月:IBM收购Platform Computing公司,LSF更名为IBM Platform LSF,为商业授权,9.1.3版本后停止更新以维护为主。IBM后推出10.x的LSF,商业名称为[IBM Spectrum LSF](https://www.ibm.com/products/hpc-workload-management)。 56 | 57 | - 2014年:Teraproc Inc.(由Platform Computing公司的一些前员工成立)为openLava提供开源支持,并基于开源openlava提供商业支持业务(附加一些开源版本的openlava没有的特性)。 58 | 59 | - 2018年9月18日:IBM取得对Teraproc Inc.的胜诉(2016年10月IBM提起版权诉讼),openlava被禁止,导致openlava 3.0和4.0版本(最新版本)源码从github下架,[openlava](https://github.com/shapovalovts/openlava) 2.2版本仍向开源社区提供。 60 | 61 | 62 | 63 | Utopia ---> Platform LSF ---> IBM Platform LSF ---> IBM Spectrum LSF 64 | 65 | Platform LSF---> Platform Lava ---> openLava 66 | 67 | openlava只支持Linux,LSF(指当前的IBM商业版)支持Linux和Windows。 68 | 69 | 70 | 71 | ## SGE系列更迭—OGE--UGE 72 | 73 | SGE,即Sun Grid Engine。 74 | 75 | - 1999年:Genias Software推出Grid Engine ,而后Genias Software和Gridware Inc.合并。 76 | 77 | Grid Engine可追溯到1993年,使用过**CODINE**(Computing in Distributed Networked Environments)和**GRD**(Global Resource Director)作为名称。 78 | 79 | - 2000年:SUN收购Gridware,之后正式改名**Sun Grid Engine**,SGE之名来源于此。 80 | 81 | - 2001年:SUN发布开源版SGE。 82 | 83 | - 2010年:Oracle收购SUN,改名为Oracle Grid Engine(OGE),OGE自6.2u6版本改为闭源,不提供源代码。原来开源项目的资料库禁止用户修改。 84 | 85 | Grid Engine社区开始开源版本的SGE(Son of Grid Engine)项目。由于存在版权风险,SGE已长期无维护和更新。 86 | 87 | - 2011年1月18日:Univa宣布已经聘用了SUN公司开发Grid Engine的主要工程师,Univa公司内部称该派生自Grid Engine的项目为Univa Grid Engine (UGE),与Oracle Grid Engine展开商业竞争。 88 | 89 | - 2013年10月22日:Univa宣布其已获得 Grid Engine的知识产权和商标所有权,接管对Oracle Grid Engine的客户支持,成为Grid Engine(UGE)唯一供应商。 90 | 91 | - 2020年9月14日:Altair Engineering公司宣布已收购Univa,获得Grid Engine。 92 | 93 | 94 | 95 | ​ Grid Engine ---> SUN Grid Engine ---> Oracle Grid Engine 96 | 97 | ​ SUN Grid Engine ---> opensource SUN Grid Engine ---> Son of Grid Engine 98 | 99 | ​ SUN Grid Engine ---> Univa Grid Engine ---> Univa Grid Engine (Altair) 100 | 101 | 102 | 103 | ## Slurm--保持开源 104 | 105 | [Slurm](https://slurm.schedmd.com/documentation.html),即Simple Linux Utility for Resource Management。 106 | 107 | 前期主要由劳伦斯利弗莫尔国家实验室、SchedMD、Linux NetworX、Hewlett-Packard 和 Groupe Bull 负责开发,受到闭源软件Quadrics RMS的启发。 108 | 109 | Slurm目前由社区和SchedMD公司共同维护,使用GPL协议。SchedMD公司提供商业支持。 110 | 111 | -------------------------------------------------------------------------------- /linux/command-line-tools/awk.md: -------------------------------------------------------------------------------- 1 | [toc] 2 | 3 | # 简介 4 | 5 | AWK是一种处理文本文件的语言,也是一个强大的文本分析工具。 6 | 7 | > AWK取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。 8 | 9 | awk处理的数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。 10 | 11 | 12 | 13 | # awk命令用法 14 | 15 | ```shell 16 | awk [options] 'script' var=value file(s) 17 | awk [options] -f scriptfile var=value file(s) 18 | ``` 19 | 20 | - options:awk的选项 21 | 22 | 常用选项: 23 | 24 | - `-F ` fs指定输入分隔符 25 | 26 | fs可以是字符串或正则表达式。默认为空白分隔符(一个或多个tab、空格等组成的空白区域)。 27 | 28 | 分隔符将一行文本内容分成若干字段,字段的编号从1开始,使用对应的变量为`$1`,最后一个字段内容可使用变量`$NF`表示。 29 | 30 | 例如一个文件test1内容如下: 31 | 32 | ``` 33 | 1 aaa 11a aa11 34 | 2 bbb 22b bb22 35 | ``` 36 | 37 | 使用awk处理: 38 | 39 | 以空格为分隔符(可省略) 40 | 41 | 打印(awk命令print)第一个字段和最后一个字段内容,打印的两个字段之间有一个`:` 42 | 43 | > ```shell 44 | > $ awk -F " " '{print $1":"$NF}' test1 45 | > 1:aa11 46 | > 2:bb22 47 | > ``` 48 | 49 | - `-v ` 赋值一个用户定义变量,将外部变量传递给awk 50 | 51 | - `-f ` 从脚本文件中读取awk命令 52 | 53 | 54 | 55 | - script:awk的语句 ;scriptfile:使用awk语言编写的脚本文件 56 | 57 | 其内容即awk语言编写的语句。 58 | 59 | 60 | 61 | - file:要处理的文件 62 | 63 | 也可以处理标准输入的内容。 64 | 65 | 示例,通过管道符传递数据给awk处理: 66 | 67 | ```shell 68 | head -n 10 testfile | awk -F ":" '{print $1" : "$NF}' 69 | ``` 70 | 71 | 72 | 73 | # awk语言语法 74 | 75 | ## 语句组成 76 | 77 | awk语句由*pattern*和*action*组成: 78 | 79 | ```shell 80 | awk '{pattern + action}' {filenames} 81 | ``` 82 | 83 | 84 | 85 | - pattern——AWK在查找(或者说匹配到)的数据 86 | 87 | pattern可以没有,也可以是以下几种内容: 88 | 89 | - /正则表达式/:使用通配符的扩展集 90 | 91 | - 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 92 | 93 | - 模式匹配表达式:使用运算符`~`(匹配)和`~!`(不匹配) 94 | 95 | - BEGIN语句块、pattern语句块、END语句块 96 | 97 | 98 | 99 | - action——对找到匹配内容时所执行的一系列命 100 | 101 | 由**大括号包裹**的一个或多个命令、函数、表达式组成,如果由**多个**组成,则每个**之间**由换行符或**分号(建议使用)隔开**。 102 | 103 | 一般建议使用单引号`''`将大括号包裹起来。 104 | 105 | action可以没有,也可以是以下几种内容: 106 | 107 | - 变量或数组赋值 108 | - 输出命令 109 | - 内置函数 110 | - 控制流语句 111 | 112 | 113 | 114 | ## 执行流程 115 | 116 | 一个awk命令结构示例,实际每个awk语句不一定包括该示例的所有部分: 117 | 118 | ```shell 119 | awk 'BEGIN{ commands } pattern{ commands } END{ commands }' 120 | ``` 121 | 122 | 执行顺序: 123 | 124 | 1. 执行 `BEGIN {commands}` 内的语句块 125 | 126 | 该语句块只会执行一次,在通过stdin读入数据前就被执行,常用于变量初始化,打印表头信息等。 127 | 128 | 2. 按行处理数据,每读取一行就使用 **`pattern{commands}`** 处理 129 | 130 | 3. 执行 `END{ commands }` 131 | 132 | 该语句块之后执行一次,在所有行处理完后执行,例如打印一些统计结果。 133 | 134 | 135 | 136 | ## 内置变量 137 | 138 | awk常用内置变量 139 | 140 | | 变量 | 说明 | 141 | | :---------- | :----------------------------------------- | 142 | | ARGC | 命令行参数的数目 | 143 | | ARGIND | 命令行中当前文件的位置(从0开始算) | 144 | | ARGV | 包含命令行参数的数组 | 145 | | CONVFMT | 数字转换格式(默认值为%.6g) | 146 | | ENVIRON | 环境变量关联数组 | 147 | | ERRNO | 最后一个系统错误的描述 | 148 | | FIELDWIDTHS | 字段宽度列表(用空格键分隔) | 149 | | FILENAME | 当前输入文件的名 | 150 | | FNR | 同NR,但相对于当前文件 | 151 | | FS | 字段分隔符(默认是任何空格) | 152 | | IGNORECASE | 如果为真,则进行忽略大小写的匹配 | 153 | | NF | 表示字段数,在执行过程中对应于当前的字段数 | 154 | | NR | 表示记录数,在执行过程中对应于当前的行号 | 155 | | OFMT | 数字的输出格式(默认值是%.6g) | 156 | | OFS | 输出字段分隔符(默认值是一个空格) | 157 | | ORS | 输出记录分隔符(默认值是一个换行符) | 158 | | RS | 记录分隔符(默认是一个换行符) | 159 | | RSTART | 由match函数所匹配的字符串的第一个位置 | 160 | | RLENGTH | 由match函数所匹配的字符串的长度 | 161 | | SUBSEP | 数组下标分隔符(默认值是34) | 162 | 163 | -------------------------------------------------------------------------------- /linux/command-line-tools/expect.md: -------------------------------------------------------------------------------- 1 | > **Expect**是[Unix](https://zh.wikipedia.org/wiki/Unix)系统中用来进行自动化控制和测试的软件工具,由[Don Libes](https://zh.wikipedia.org/w/index.php?title=Don_Libes&action=edit&redlink=1)制作,作为[Tcl](https://zh.wikipedia.org/wiki/Tcl)脚本语言的一个扩展,应用在交互式[软件](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6)中。 2 | 3 | expect是由[tcl语言](https://link.jianshu.com?t=http://www.tldp.org/HOWTO/TclTk-HOWTO-3.html#ss3.1)演变而来,需要tcl的支持。 4 | 5 | # 常用参数 6 | 7 | - `-c` 指定要执行的命令 8 | - `-f` 指定要执行的文件 9 | - `-d` 开启debug模式 (调试并且观看expect的执行过程) 10 | - `-i` 开启交互 11 | 12 | # expect脚本 13 | 14 | 在脚本文件开始时使用shebang指定expect解释器,例如`#!/bin/expect`。 15 | 16 | 可在shebang 后面直接使用参数(如`-d`开启debug) 17 | 18 | ## 常用命令 19 | 20 | 在expect脚本中最关键的四个命令: 21 | 22 | - `spawn`:启动新的进程 23 | 24 | spawn执行的命令结果会被expect捕捉到 25 | 26 | - `expect`:从进程接收字符串(可以使用通配符如`*`) 27 | 28 | - `send`:向进程发送字符串 29 | 30 | 将需要的信息发送给spawn启动的那个进程(模拟用户的输入) 31 | 32 | 一些特殊按键需要使用其相应的ANSI escapte code表示,例如: 33 | 34 | - `\r `回车 35 | 36 | - `\t` 制表符(tab) 37 | 38 | 39 | spawn、expect和send最基本的组合——单分支: 40 | 41 | ```tcl 42 | spawn #启动一个进程 43 | expect "some strings*" #如果程序运行后出现了字符串中指定内容 44 | send "some words you want to input" #模拟用户输入一些内容 45 | ``` 46 | 47 | 多分支: 48 | 49 | ```tcl 50 | spawn 51 | expect{ #匹配下列行中任意一个字符串都会发送相应的内容 52 | "strings1" {send "word1"} 53 | "strings2" {send "word2"} 54 | } 55 | ``` 56 | 57 | - `interact`:允许用户交互模式(让用户输入) 58 | 59 | - `set timeout ` 设置超时时间为n秒 60 | 61 | 如果一个指令超时后则会直接执行下一条 62 | 63 | - timeout是内置的变量 **默认值为10** 64 | - 如果n取值为`-1` 表示不超时 65 | 66 | - `send_user` 发送内容给用户 67 | 68 | - `set ` 设置变量 69 | 70 | - `exp_continue` 继续进行下一项匹配 71 | 72 | - `expect eof` 结束对spawn程序输出信息的捕获 73 | 74 | **如果程序不以interact结尾,应该在最后写上`expect eof`结束本次expect。** 75 | 76 | - 命令行参数 77 | 78 | - `$argv0` 脚本本身 79 | - `$argv`命令行参数 80 | - `[lrange $argv 0 0]` 或`[lindex $argv 0]` 第1个参数` 81 | - `[lrange $argv m n]` 第m个到第n个参数 82 | 83 | # 在shell中使用expect 84 | 85 | 这里的shell指的是bash shell。在bash中的expect语句均放置在字符串中,可以方便地在该expect内容的字符串中使用bash的变量。 86 | 87 | bash shell中使用expect的几种方式: 88 | 89 | - 将expect脚本内容作为字符串,使用EOF将expect内容重定向给expect程序,示例: 90 | 91 | ```shell 92 | #!/bin/sh 93 | #上传ssh密钥 94 | /usr/bin/expect << EOF 95 | set timeout 10 96 | spawn ssh-copy-id root@host1 97 | expect{ 98 | "*yes/no*" { send "yes" \r } 99 | "password*" { send "root"\r } 100 | } 101 | EOF 102 | ``` 103 | 104 | - `expect -c ` `-c`参数指定expect要执行的命令 105 | 106 | ```shell 107 | user=root 108 | hosts=192.168.0.1 109 | port=22 110 | password=root 111 | 112 | #ssh登录 113 | expect -c " 114 | spawn ssh $user@$host -p $port 115 | expect { 116 | "yes/no" { send "yes"\r } 117 | "*password*" { send $password\r } 118 | } 119 | interact #进入交互式 120 | " 121 | 122 | #上传ssh密钥 123 | expect -c " 124 | spawn ssh-copy-id $user@$host -p $port 125 | expect { 126 | "yes/no" { send "yes"\r } 127 | "*password*" { send $password\r } 128 | } 129 | expect eof 130 | " 131 | ``` 132 | 133 | - `expect -f ` 使用expect执行指定(脚本)文件 134 | -------------------------------------------------------------------------------- /linux/command-line-tools/shell/shell-tips.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 零散 4 | 5 | - `sh`中没有`source` 6 | 7 | - shell文件格式化工具`shfmt` 8 | 9 | - `$BASHPID` 当前bash的pid(非bash终端变量名不同),相当于`$$` 10 | 11 | 12 | 13 | # 随机数 14 | 15 | `RANDOM`变量会生成0--32767的整数。 16 | 17 | 生成一定范围内的整数 18 | 19 | ```shell 20 | echo $(($RANDOM%99)) #生成0-99的数 21 | echo $(($RANDOM%82+6)) #生成6-87(81+6)的数 22 | ``` 23 | 24 | 从shell数组中随机选择一个元素 25 | 26 | ```shell 27 | arr=(1 3 5 7 9) 28 | rand_index=$(($RANDOM % ${#a[*]})) #随机获取一个下标值 29 | echo ${arr[$rand_index]} 30 | ``` 31 | 32 | 注意:csh、zsh,数组元素下标从1开始 33 | 34 | 35 | 36 | # 加密shell文件 37 | 38 | ## gzexe 39 | 40 | gzexe只能简单压缩,解密很简单。 41 | 42 | 加密 43 | 44 | ```shell 45 | gzexe test.sh #原文件变成了test.sh~ 46 | ``` 47 | 48 | 解密 49 | 50 | cat加密后内容可以看到有一行叫skip=44(或其他数字),它告诉我们从第44行起才是原来压缩之前文件的内容。 51 | 52 | ```shell 53 | tail -n +44 test.sh > test1.gz 54 | gunzip test1.gz #得到test1.sh 内容和源文件一样 55 | ``` 56 | 57 | 58 | 59 | ## shc 60 | 61 | 改写为c语言然后编译成二进制文件。 62 | 63 | ```shell 64 | orig_name=test.sh 65 | 66 | shc -r -f $orig_name 67 | rm -f $orig_name $orig_name.x.c #删除含有源码的文件 68 | mv $orign_name.x $orig_name 69 | ``` 70 | 71 | 以原文件名为test.sh为例,加密后,原文件还在,共有3个相关文件: 72 | 73 | - test.sh 原文件 74 | - test.sh.x 可执行的二进制文件 75 | - test.sh.x.c test.sh.x的源码文件(c语言) 76 | 77 | 注意,shc加密的脚本文件里面要声明shengbang,如: 78 | 79 | ```shell 80 | #!/bin/bash 81 | ``` 82 | 83 | 不能使用`#!/bin/env bash`方式。 84 | -------------------------------------------------------------------------------- /linux/command-line-tools/special-dir-usage.md: -------------------------------------------------------------------------------- 1 | # 家目录 2 | 3 | ```shell 4 | echo $HOME 5 | cd $HOME 6 | cd ~ 7 | ``` 8 | 9 | 10 | 11 | # 当前/工作目录 12 | 13 | ```shell 14 | echo $PWD 15 | pwd 16 | ``` 17 | 18 | 19 | 20 | # 目录堆栈记录 21 | 22 | 目录栈是用户最近访问过的系统目录列表,并以堆栈的形式管理。栈中的内容与Shell环境变量DIRSTACK的值对应 23 | 24 | ## dirs 25 | 26 | 显示当前目录栈中的所有记录。不带选项使用是,记录以空白分隔,第一条总是当前目录: 27 | 28 | >```dirs 29 | >$ dirs 30 | >/tmp /etc ~ 31 | >``` 32 | 33 | 常用选项: 34 | 35 | - `-l` 以完整格式显示 36 | - `-c` 清除记录 37 | - `-p` 一行一条记录 38 | - `-v` 一行一条记录且带行号 39 | - `+N` / `-N` 显示 从左到右 / 从右到左 40 | 41 | ## pushd和popd 目录记录入栈和出栈 42 | 43 | pushd和popd命令根据 LIFO(后进先出)原则工作: 44 | 45 | - pushd 把一个目录压入栈 46 | - popd 把一个目录弹出栈 47 | 48 | 49 | 50 | push和popd的选项相同,只是操作行为不同,目录栈记录从左到右或从右到左均以0开始索引,使用`+N`或`-N`可将记录中的某个目录入栈或出栈 51 | 52 | | 参数 | pushd | popd | 53 | | ---- | ------------------------ | ------------------------ | 54 | | +N | 将第N个目录移至栈顶 | 将第N个目录删除 | 55 | | -N | 将倒数第N个目录移至栈顶 | 将倒数第N个目录删除 | 56 | | -n | 将目录入栈时,不切换目录 | 将目录出栈时,不切换目录 | 57 | 58 | 这里的`N`(大写的N)要替换成具体的正整数数字,例如`-1`、`+2`。 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /linux/command-line-tools/stty-tput终端控制.md: -------------------------------------------------------------------------------- 1 | # 终端相关全局变量 2 | 3 | - `LINES` 行数(高度) 4 | - `COLUMNS` 列数(宽度) 5 | 6 | - `LINENO` 当前行号 7 | 8 | # stty终端设置 9 | 10 | ## 终端信息 11 | 12 | ```shell 13 | stty -a #以容易阅读的方式打印当前的所有配置 14 | stty size #打印终端行数和列数 15 | ``` 16 | 17 | ## 终端输出控制 18 | 19 | - 改变 Ctrl D 按键作用(默认表示文件结束) 20 | 21 | ```shell 22 | stty eof "string" 23 | ``` 24 | 25 | - 屏蔽和恢复回显(echo) 26 | 27 | ```shell 28 | stty -echo #此后输入内容均不会显示 29 | stty echo #恢复回显 30 | 31 | #示例,禁止密码回显 #当然也能通过read -s 实现 32 | echo "input password (will not echo anything)" 33 | stty -echo 34 | read password 35 | stty echo 36 | echo "set password done." 37 | ``` 38 | 39 | - 忽略和恢复回车符 40 | 41 | ```shell 42 | stty igncr #开启 43 | stty -igncr #恢复 44 | ``` 45 | 46 | - 小写字母转大写 47 | 48 | ```shell 49 | stty olcuc #开启 50 | stty -olcuc#恢复 51 | ``` 52 | 53 | # tput操纵终端显示 54 | 55 | > **tput命令**将通过 terminfo 数据库对您的终端会话进行初始化和操作。通过使用 tput,您可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。 56 | 57 | ## 终端信息 58 | 59 | ```shell 60 | tput lines #获取终端行数(高) 61 | tput cols #获取终端列数(宽) 62 | ``` 63 | 64 | ## 设置终端 65 | 66 | ```shell 67 | tput init #初始化终端 68 | tput reset #重置终端 69 | ``` 70 | 71 | ### 光标控制 72 | 73 | - 位置存储 74 | 75 | ```shell 76 | tput sc # 保存当前光标位置 save cursor 77 | tput rc # 恢复保存的光标位置 restore cursor 78 | ``` 79 | 80 | - 光标移动 81 | 82 | 使用 cup 选项,在各行和各列中将光标移动到任意 X 或 Y 坐标(以左上光标提示符后为坐标原点0,0)。 83 | 84 | ```shell 85 | tput cup 10 13 # 将光标移动到指定行列位置 10列 13行 86 | ``` 87 | 88 | 示例,定位光标到指定位置输出提示信息后,再将光标恢复到原来的位置等待用户输入内容: 89 | 90 | ```shell 91 | #最终看到右下角部分有一句提示信息,而光标在原来位置等待输入 92 | (tput sc ; tput cup 23 45 ; echo “Input from tput/echo at 23/45” ; tput rc) 93 | ``` 94 | 95 | 保存光标位置--->移动光标到指定位置--->输出提示内容--->恢复保存的光标位置。 96 | 97 | 另,清除屏幕内容(作用同clear) 98 | 99 | ```shell 100 | tput clear # 清屏 101 | ``` 102 | 103 | - 光标属性 104 | 105 | ```shell 106 | tput civis # 光标不可见 invisiable 107 | tput cnorm # 光标可见 normal 108 | ``` 109 | 110 | ### 文本显示 111 | 112 | 更改文本的显示属性(如颜色、字体等) 113 | 114 | ```shell 115 | tput rev ;echo "hello ukelele";tput sgr0 #hello ukelele会反色显示 116 | echo -e "$(tput bold) Bold Texts$(tput sgr0)" #粗体显示Bold Texts文字 117 | ``` 118 | 119 | 各种文本属性均可使用`tput sgr0`取消(还原成为设置状态),其中下划线也可以使用单独的`rmul`取消。 120 | 121 | - 配色 122 | 123 | ```shell 124 | tput setf #前景色foreground 125 | tput setb #背景色background 126 | tput rev #反色 反显当前配色方案,即对调前景色和背景色 127 | ``` 128 | 129 | n为代指颜色的数值(可能会因 UNIX 系统的不同而异): 130 | 131 | >0:黑色 132 | > 133 | >1:蓝色 134 | > 135 | >2:绿色 136 | > 137 | >3:青色 138 | > 139 | >4:红色 140 | > 141 | >5:洋红色 142 | > 143 | >6:黄色 144 | > 145 | >7:白色 146 | 147 | - 样式 148 | 149 | ```shell 150 | tput bold #粗体 151 | tput dim #半透明 152 | tput smul #设置下划线(下划线起点) 153 | tput rmul #取消下划线(下划线终点) 154 | ``` 155 | 156 | - 其他 157 | 158 | ```shell 159 | tput ed #删除从当前光标到行尾所有内容 160 | tput smso #开启标准输出模式 161 | tput rmso #取消标准输出模式 162 | ``` -------------------------------------------------------------------------------- /linux/command-line-tools/tmux.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | mux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理,可实现主多会话多窗口,放置任务后台执行等功能。 4 | 5 | tmux基本概念: 6 | 7 | - 会话 session:创建一个新的独立的shell环境(非当前shell的子shell) 8 | - 窗口 window:每个会话至少一个窗口 9 | - 窗格 panes:每个窗口可以切分成多个窗格 10 | - 前缀键prefix:在tmux会话中使用的tmux快捷键组合都有一个固定前缀按键,默认是Ctrlb,按下前缀按键后松开,再按下其他键 11 | 12 | 13 | 14 | # 基本使用 15 | 16 | ## 会话操作 17 | 18 | - tmux命令管理会话 19 | 20 | - 创建 21 | 22 | ```shell 23 | tmux #自动创建会话,按数字依次命名 24 | tmux new -s #创建会话并命名 25 | ``` 26 | 27 | 28 | 29 | - 将当前会话放入后台:前缀键+`d`(以默认前缀为例,则先按下Ctrlb ,松开后按 d ) 30 | 31 | 32 | 33 | - 查看会话列表和连接到会话 34 | 35 | ```shell 36 | tmux ls #查看后台会话 37 | tmux a #连接会话(a或者attatch) 默认连接到最近一个创建的会话 38 | tmux a -t xx #连接到指定会话 xx为会话编号或名称 39 | tmux switch -t xx #切换会话 也在tmux会话中使用前缀键+s 40 | ``` 41 | 42 | 43 | 44 | - 重命名 45 | 46 | ```shell 47 | tmux rename-session -t 0 #重命名0号会话 48 | ``` 49 | 50 | 也可在tmux会话中使用前缀键+`$` 51 | 52 | 53 | 54 | - 关闭 55 | 56 | 从会话的shell中退出即会关闭会话。(例如执行`exit`或者按下Ctrl d) 57 | 58 | 没有在tmux会话中,可使用以下命令关闭后台会话: 59 | 60 | ```shell 61 | tmux kill-session #关闭最近的一个会话 62 | tmux kill-session -t xx #关闭指定会话 xx为会话编号或名称 63 | tmux kill-server #关闭所有会话 64 | ``` 65 | 66 | 67 | 68 | 69 | - 在tmux会话中的快捷键(使用tmux前缀键+以下按键) 70 | - `$` 重命名当前会话 71 | 72 | - `s` 选择会话列表 73 | 74 | - `d` detach 当前会话,运行后将会退出 tmux 进程,返回至 shell 主进程 75 | 76 | 77 | 78 | ## 窗口操作 79 | 80 | - 在tmux会话中的快捷键(使用tmux前缀键+以下按键) 81 | 82 | - `w` 窗口列表选择,注意 macOS 下使用 `⌃p` 和 `⌃n` 进行上下选择 83 | 84 | - `c` 新建窗口,此时当前窗口会切换至新窗口,不影响原有窗口的状态 85 | - 切换窗口 86 | 87 | - `p` 切换至上一窗口 88 | 89 | - `n` 切换至下一窗口 90 | - `0` 切换至 0 号窗口,使用其他数字 id 切换至对应窗口 91 | 92 | 93 | - `&` 关闭当前窗口 94 | 95 | - `,` 重命名窗口,可以使用中文,重命名后能在 tmux 状态栏更快速的识别窗口 id 96 | 97 | - `f` 根据窗口名搜索选择窗口,可模糊匹配 98 | 99 | 100 | 101 | 102 | ## 窗格操作 103 | 104 | - tmux命令管理窗口 105 | 106 | ```shell 107 | #---划分窗格 108 | tmux split-window #划分上下两个窗格 109 | tmux split-window -h #划分左右两个窗格 110 | 111 | #---切换窗格 112 | tmux select-pane -U #上 113 | tmux select-pane -D #下 114 | tmux select-pane -L #左 115 | tmux select-pane -R #右 116 | ``` 117 | 118 | 119 | 120 | - 在tmux会话中的快捷键(使用tmux前缀键+以下按键) 121 | 122 | - `q` 显示所有窗格的序号,在序号出现期间按下对应的数字,即可跳转至对应的窗格 123 | 124 | - 划分窗格 125 | 126 | - `%` 左右平分出两个窗格 127 | 128 | - `"` 上下平分出两个窗格 129 | 130 | 131 | 132 | 133 | - 移动窗格 134 | 135 | - `{` 当前窗格前移 136 | 137 | - `}` 当前窗格后移 138 | 139 | - `Ctrl`+`o` 当前窗格上移 140 | 141 | - `Alt`+`o` 当前窗格下移 142 | 143 | 144 | 145 | - 选择(切换)窗格 146 | 147 | - `;` 选择上次使用的窗格 148 | 149 | - `o` 选择下一个窗格,也可以使用上下左右方向键来选择 150 | 151 | - 上下左右方向键切换到对应方向上的窗格 152 | 153 | 154 | 155 | 156 | - `space` 切换窗格布局,tmux 内置了五种窗格布局,也可以通过 `⌥1` 至 `⌥5`来切换 157 | - `x` 关闭当前窗格 158 | 159 | - `z` 最大化当前窗格,再次执行可恢复原来大小 160 | - `!` 将当前窗格拆分为一个独立窗口 161 | 162 | 163 | 164 | 165 | # 非交互式操作 166 | 167 | 向会话发送命令: 168 | 169 | ```shell 170 | #tmux send-keys -t 会话名称 指令内容 C-m 171 | tmux send-keys -t [:window] C-m 172 | ``` 173 | 174 | 示例,创建会话,放入后台,并向该会话其发送要执行的指令 175 | 176 | ```shell 177 | session=test 178 | window=main 179 | command='whoami' 180 | 181 | #创建会话test后台运行 182 | tmux new -s $session -d 183 | #可以在会话中创建窗口 例如窗口名为main 184 | #tmux new -s $session -n $window -d 185 | 186 | #向回话发送指令 187 | tmux send-keys -t $session "$command" C-m 188 | #可以指定发送某个窗口 189 | #tmux send-keys -t $session:$window "$command" C-m 190 | ``` 191 | 192 | 其他: 193 | 194 | ```shell 195 | #分割指定会话的窗口(不指定窗口时使用每个会话默认的窗口) 196 | tmux split-window -v -t $session #-v水平分割 -h 垂直分割 197 | 198 | tmux select-layout -t $session main-horizontal #分割模式 199 | ``` 200 | 201 | 202 | 203 | # 常用配置 204 | 205 | tmux用户配置文件为`~/.tmux.conf` 206 | 207 | ```shell 208 | # force SHELL ENV variable as shell 209 | set-option -g default-shell ${SHELL} 210 | 211 | # 256 RGB colors 212 | set -g default-terminal "xterm-256color" 213 | 214 | # Use Alt-arrow keys to switch panes 215 | bind -n M-Left select-pane -L 216 | bind -n M-Right select-pane -R 217 | bind -n M-Up select-pane -U 218 | bind -n M-Down select-pane -D 219 | 220 | # Shift arrow to switch windows 221 | bind -n S-Left previous-window 222 | bind -n S-Right next-window 223 | 224 | # Mouse mode 鼠标模式 225 | set -g mouse on 226 | 227 | # 如果喜欢给窗口自定义命名,那么需要关闭窗口的自动命名 228 | #set-option -g allow-rename off 229 | 230 | # 如果对 vim 比较熟悉,可以将 copy mode 的快捷键换成 vi 模式 231 | #set-window-option -g mode-keys vi 232 | ``` 233 | 234 | 配置文件修改完成后,执行 `tmux kill-server` 重启所有 tmux 进程,或者在 tmux 会话中使用 `⌃b` `:` 进入控制台模式,输入 `source-file ~/.tmux.conf` 命令重新加载配置。 235 | -------------------------------------------------------------------------------- /linux/command-line-tools/vim/vim-modes.md: -------------------------------------------------------------------------------- 1 | # vim模式 2 | 3 | 共有6中基本模式和5中派生模式。 4 | 5 | 除正常模式和命令模式外,处于其他模式时,左下角会显示模式名字。 6 | 7 | ## 基本模式 8 | 9 | ### 正常模式(Normal-mode) 10 | 11 | 进入vim后所处的模式,可以执行一般的编辑器命令。 12 | 13 | 除了[Ex模式](#Ex模式(Ex mode))中输入`visual`回到正常模式外,其他模式中均为按下Esc回到正常模式。 14 | 15 | 16 | 17 | ### 插入模式(Insert mode) 18 | 19 | 正常模式中按下各种编辑命令——`i`、`I`、`a`、`A`、`o`或`O`进入。 20 | 21 | 进入插入模式: 22 | 23 | - 前插入insert 24 | 25 | - `i` 在光标前插入 26 | - `I` 在光标所在行首插入 27 | 28 | - 后追加append 29 | 30 | - `a` 在光标后插入 31 | - `A` 在光标所在行尾插入 32 | 33 | - 增加行 34 | 35 | - `o` 在光标所在行的下方插入新行 36 | - `O` 在光标坐在行的上方插入新行 37 | 38 | - 修改内容change 39 | 40 | 使用`c`与其他命令组合,执行相应的删除动作后进入插入模式。 41 | 42 | 如与`w`,`0`,`^`,`$`,`g_`组合(其中`c$`与`C`(`shift`+`c`作用相同)。 43 | 44 | - `cc` 删除当前行,光标置于行首并进入插入模式,同`S` 45 | 46 | - 替换字符substitute 47 | 48 | - `s` 删除光标所在处的字符,并进入插入模式 49 | 50 | 另外在normal模式中,使用`r`或`R`也可以进行替换(属于基本模式派生出的替换模式)。 51 | 52 | - `S` 删除光标所在行,并进入插入模式(可理解为替换掉整行字符) 53 | 54 | 55 | 56 | ### 命令模式(Command mode) 57 | 58 | 正常模式中按下`:`、`/`和`?`进入,执行一些指令(可用Tab补全命令)。 59 | 60 | 执行的命令若为vim编辑器的命令,该命令执行之后会自动返回正常模式(退出vim的命令除外)。 61 | 62 | *因为历史原因,在命令行模式中执行的命令又被称为 Ex 命令,可执行 `:h ex-cmd-index`获取帮助。输入命令内容后回车执行之*。 63 | 64 | 进入命令模式: 65 | 66 | - `:` 执行vim编辑器命令及其他工具的命令。 67 | 68 | - 临时执行shell命令:在shell命令前面加上`!`(如`:!ls`) 69 | - 强制执行vim命令:在vim命令后面加上`!`(如`:wq!`) 70 | 71 | 72 | 73 | ### 可视模式(Visual mode) 74 | 75 | 正常模式中按下各种可视命令进入可视模式。 76 | 77 | 可视模式中可使用方向键选择字符/行/块内容,选中区域会高亮,执行一个非移动命令会作用于高亮区域,并返回正常模式。 78 | 79 | 如果开启了鼠标选择功能(一般默认开启,如未开启可使用`:set mouse=a`,或在`/etc/vimrc`或`~/.vimrc`中添加`set mouse=a`),在normal模式下直接按住鼠标左键或右键拖选也可以进入可视模式(按下`v`的模式)。 80 | 81 | 82 | 83 | 提示:一些终端工具中,设置了set mouse=a 后,鼠标右键不能打开右键菜单,可以按住Shift后,再点击鼠标右键即可打开右键菜单。 84 | 85 | 86 | 87 | 进入可视模式: 88 | 89 | - `v` (字符)可视(visual)模式,文本选择以字符为单位的。 90 | 91 | - `viw`和`vaw` 选择当前单词(`iw` inner word只包含单词本身`aw` around word 包含单词前的空白字符) 92 | 93 | - `vi{char}` 选择成对字符中的内容 94 | 95 | 例如`aa"xxx"zz` ,执行`vi"`选中双引号之间的内容。 96 | 97 | - `V` 可视行(visual line)模式,文本选择以行为单位。 98 | 99 | - Ctrlv:可视块(visual block)模式,可以选择一个矩形内的文本。 100 | 101 | *注意:在 Windows 中,Ctrlv可能已经被影射为粘贴操作,可以使用Ctrlq:进入块可视化模式。* 102 | 103 | 104 | 105 | ### Ex模式(Ex mode) 106 | 107 | 正常模式中输入`Q`进入ex编辑器,可ex命令,使用参看ex编辑器文档。执行`visual`命令回到正常模式。 108 | 109 | *vi底层是行编辑器ex,常用的一些vi命令源自ex命令。* 110 | 111 | *ex编辑器中文本行从0开始排序。* 112 | 113 | 114 | 115 | ## 派生模式 116 | 117 | 分为操作符等待模式和4中插入类派生模式。 118 | 119 | ### 操作符等待模式 120 | 121 | 正常模式中,对于一个命令组合来说,执行完第一个操作后等待后一个“动作”的模式。 122 | 123 | 例如正常模式下执行`dw`,第一个`d`按下后就处于等待模式。 124 | 125 | 126 | 127 | ### 插入正常模式 128 | 129 | **插入模式下**按下 Ctrlo ,暂时进入正常模式,**执行完一条**正常模式下的vim命令之后将返回插入模式。 130 | 131 | 132 | 133 | ### 插入可视模式 134 | 135 | **插入可视(块)模式下**按下 Ctrlo ,暂时进入正常模式后,**再执行相关命令进入可视模式**,在可视区域选择取消后返回插入模式。 136 | 137 | 如果设置了鼠标拖选,在插入模式下鼠标拖选内容也会进入插入可视模式。 138 | 139 | 140 | 141 | ### 插入选择模式 142 | 143 | 激活了选择模式情况下,在插入模式下使用鼠标拖拽或者 shift 方向键进入选择模式,当选择区域取消后返回插入模式。 144 | 145 | 146 | 147 | ### 替换模式 148 | 149 | 正常模式下按`R`进入,在这个模式中可以做和插入模式一样的操作,该模式中输入的每个字符都会覆盖文本缓冲中已经存在的字符。 150 | 151 | `r`为替换当前**单个字符**。 -------------------------------------------------------------------------------- /linux/config-backup/etc/bluetooth/audio.conf: -------------------------------------------------------------------------------- 1 | [General] 2 | Enable=Source 3 | -------------------------------------------------------------------------------- /linux/config-backup/etc/default/grub: -------------------------------------------------------------------------------- 1 | GRUB_DEFAULT="0" 2 | GRUB_TIMEOUT="3" 3 | GRUB_DISTRIBUTOR="Arch" 4 | GRUB_CMDLINE_LINUX_DEFAULT="resume=/home/swap" 5 | GRUB_CMDLINE_LINUX="" 6 | 7 | # Preload both GPT and MBR modules so that they are not missed 8 | GRUB_PRELOAD_MODULES="part_gpt part_msdos" 9 | 10 | # Uncomment to enable Hidden Menu, and optionally hide the timeout count 11 | #GRUB_HIDDEN_TIMEOUT="3" 12 | #GRUB_HIDDEN_TIMEOUT_QUIET="true" 13 | 14 | # Uncomment to use basic console 15 | GRUB_TERMINAL_INPUT="console" 16 | 17 | # Uncomment to disable graphical terminal 18 | #GRUB_TERMINAL_OUTPUT="console" 19 | 20 | # The resolution used on graphical terminal 21 | # note that you can use only modes which your graphic card supports via VBE 22 | # you can see them in real GRUB with the command `vbeinfo' 23 | GRUB_GFXMODE="auto" 24 | 25 | # Uncomment to allow the kernel use the same resolution used by grub 26 | GRUB_GFXPAYLOAD_LINUX="keep" 27 | 28 | # Uncomment if you want GRUB to pass to the Linux kernel the old parameter 29 | # format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" 30 | #GRUB_DISABLE_LINUX_UUID="true" 31 | 32 | # Uncomment to disable generation of recovery mode menu entries 33 | GRUB_DISABLE_RECOVERY="true" 34 | 35 | # Uncomment and set to the desired menu colors. Used by normal and wallpaper 36 | # modes only. Entries specified as foreground/background. 37 | export GRUB_COLOR_NORMAL="light-blue/black" 38 | export GRUB_COLOR_HIGHLIGHT="light-cyan/cyan" 39 | 40 | # Uncomment one of them for the gfx desired, a image background or a gfxtheme 41 | #GRUB_BACKGROUND="" 42 | GRUB_THEME="/boot/grub/themes/Vimix/theme.txt" 43 | 44 | # Uncomment to get a beep at GRUB start 45 | #GRUB_INIT_TUNE="480 440 1" 46 | 47 | GRUB_SAVEDEFAULT="false" 48 | -------------------------------------------------------------------------------- /linux/config-backup/etc/environment: -------------------------------------------------------------------------------- 1 | #---fcitx5 2 | #comment the following 2 lines if using wayland 3 | #GTK_IM_MODULE=fcitx 4 | #QT_IM_MODULE=fcitx 5 | # 6 | #XMODIFIERS=@im=fcitx 7 | #SDL_IM_MODULE=fcitx 8 | #INPUT_METHOD=fcitx 9 | #GLFW_IM_MODULE=fcitx 10 | # 11 | #---ibus 12 | #如果一些程序中不能输入中文件,使用--xim启动ibus,如ibus-deamon --xim 13 | GTK_IM_MODULE=ibus 14 | QT_IM_MODULE=ibus 15 | XMODIFIERS=@im=ibus 16 | -------------------------------------------------------------------------------- /linux/config-backup/etc/etckeeper/etckeeper-init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | if [[ $(whoami) != root ]] 3 | then 4 | echo 'Need root' 5 | exit 6 | fi 7 | 8 | if [[ $(which pacman) ]] 9 | then 10 | pacman -S etckeeper 11 | echo "sudo pacman -Qq > /etc/pkglist" > /etc/etckeeper/pre-commit.d/40pkglist 12 | elif [[ $(which yum) ]] 13 | then 14 | yum install -y epel-release 15 | yum install etckeeper 16 | elif [[ $(which dnf) ]] 17 | then 18 | dnf install -y epel-release 19 | dnf install etckeeper 20 | elif [[ $(which apt) ]] 21 | then 22 | apt install etckeeper 23 | fi 24 | 25 | etckeeper init 26 | 27 | echo ' 28 | #ignore all 29 | * 30 | 31 | #white list 32 | !*/ 33 | !pkglist 34 | !etckeeper-init.sh 35 | !.gitignore 36 | !.etckeeper 37 | 38 | !bluetooth/audio.conf 39 | !default/grub 40 | !default/tlp 41 | !etckeeper/etckeeper.conf 42 | !etckeeper/**/40pkglist 43 | !pulse/default.pa 44 | !sysctl.d/ 45 | !systemd/coredump.conf 46 | !systemd/journald.conf 47 | !systemd/logind.conf 48 | !systemd/**/nvidia-enable.service 49 | !UPower/ 50 | !xrdp/xrdp.ini 51 | !environment 52 | !locale.conf 53 | !mkinitcpio.conf 54 | !pacman.conf 55 | 56 | !proxychains.conf 57 | !docker/daemon.json 58 | !nginx/nginx.conf 59 | !nginx/conf.d/ 60 | 61 | '> /etc/.gitignore 62 | 63 | rsa_key='/root/.ssh/id_rsa' 64 | if [[ ! -e $rsa_key && ! -e $rsa_key.pub ]] 65 | then 66 | echo "\e[1m not found ssh key-pair, generate ssh key-pair \e[0m" 67 | ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N "" 68 | fi 69 | echo -e "\e[1m upload root's public key to git server\e[0m" 70 | 71 | read -p "input remote git repo url:" repo_url 72 | 73 | sed -i '/PUSH_REMOTE/d' /etc/etckeeper/etckeeper.conf 74 | echo "PUSH_REMOTE=\"$repo_url\"" >> /etc/etckeeper/etckeeper.conf 75 | 76 | etckeeper commit "first etckeeper commit..." 77 | 78 | git push --set-upstream $repo_url master 79 | unset rsa_key 80 | unset repo_url -------------------------------------------------------------------------------- /linux/config-backup/etc/etckeeper/pre-commit.d/40pkglist: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | sudo pacman -Qq > /etc/pkglist 3 | -------------------------------------------------------------------------------- /linux/config-backup/etc/pacman.conf: -------------------------------------------------------------------------------- 1 | # 2 | # /etc/pacman.conf 3 | # 4 | # See the pacman.conf(5) manpage for option and repository directives 5 | 6 | # 7 | # GENERAL OPTIONS 8 | # 9 | [options] 10 | # The following paths are commented out with their default values listed. 11 | # If you wish to use different paths, uncomment and update the paths. 12 | #RootDir = / 13 | #DBPath = /var/lib/pacman/ 14 | #CacheDir = /var/cache/pacman/pkg/ 15 | #LogFile = /var/log/pacman.log 16 | #GPGDir = /etc/pacman.d/gnupg/ 17 | #HookDir = /etc/pacman.d/hooks/ 18 | HoldPkg = pacman glibc 19 | #XferCommand = /usr/bin/curl -L -C - -f -o %o %u 20 | #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u 21 | #CleanMethod = KeepInstalled 22 | Architecture = auto 23 | ILoveCandy 24 | Color 25 | 26 | # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup 27 | #IgnorePkg = 28 | #IgnoreGroup = 29 | 30 | #NoUpgrade = 31 | #NoExtract = 32 | 33 | # Misc options 34 | #UseSyslog 35 | #NoProgressBar 36 | CheckSpace 37 | VerbosePkgLists 38 | ParallelDownloads = 5 39 | 40 | # By default, pacman accepts packages signed by keys that its local keyring 41 | # trusts (see pacman-key and its man page), as well as unsigned packages. 42 | SigLevel = Required DatabaseOptional 43 | LocalFileSigLevel = Optional 44 | #RemoteFileSigLevel = Required 45 | 46 | # NOTE: You must run `pacman-key --init` before first using pacman; the local 47 | # keyring can then be populated with the keys of all official Arch Linux 48 | # packagers with `pacman-key --populate archlinux`. 49 | 50 | # 51 | # REPOSITORIES 52 | # - can be defined here or included from another file 53 | # - pacman will search repositories in the order defined here 54 | # - local/custom mirrors can be added here or in separate files 55 | # - repositories listed first will take precedence when packages 56 | # have identical names, regardless of version number 57 | # - URLs will have $repo replaced by the name of the current repo 58 | # - URLs will have $arch replaced by the name of the architecture 59 | # 60 | # Repository entries are of the format: 61 | # [repo-name] 62 | # Server = ServerName 63 | # Include = IncludePath 64 | # 65 | # The header [repo-name] is crucial - it must be present and 66 | # uncommented to enable the repo. 67 | # 68 | 69 | # The testing repositories are disabled by default. To enable, uncomment the 70 | # repo name header and Include lines. You can add preferred servers immediately 71 | # after the header, and they will be used before the default mirrors. 72 | 73 | #[core-testing] 74 | #Include = /etc/pacman.d/mirrorlist 75 | 76 | [core] 77 | Include = /etc/pacman.d/mirrorlist 78 | 79 | #[extra-testing] 80 | #Include = /etc/pacman.d/mirrorlist 81 | 82 | [extra] 83 | Include = /etc/pacman.d/mirrorlist 84 | 85 | # If you want to run 32 bit applications on your x86_64 system, 86 | # enable the multilib repositories as required here. 87 | 88 | #[multilib-testing] 89 | #Include = /etc/pacman.d/mirrorlist 90 | 91 | #[multilib] 92 | #Include = /etc/pacman.d/mirrorlist 93 | 94 | # An example of a custom package repository. See the pacman manpage for 95 | # tips on creating your own repositories. 96 | #[custom] 97 | #SigLevel = Optional TrustAll 98 | #Server = file:///home/custompkgs 99 | 100 | 101 | # Custom package repository. 102 | [archlinuxcn] 103 | 104 | ## 上海交大 105 | Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux-cn/$arch 106 | 107 | ## 腾讯 108 | #Server = https://mirrors.cloud.tencent.com/archlinuxcn/$arch 109 | 110 | ## 浙江大学 (浙江杭州) (ipv4, ipv6, http, https) 111 | #Server = https://mirrors.zju.edu.cn/archlinuxcn/$arch 112 | 113 | ## 中国科学技术大学 (ipv4, ipv6, http, https) 114 | #Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch 115 | 116 | ## 清华大学 (ipv4, ipv6, http, https) 117 | #Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch 118 | 119 | ## Unique Studio (湖北武汉) (ipv4, http, https) 120 | #Server = https://mirrors.hustunique.com/archlinuxcn/$arch 121 | 122 | ## 上海科技大学 (上海) (ipv4, http, https) 123 | #Server = https://mirrors-wan.geekpie.org/archlinuxcn/$arch 124 | 125 | ## 中国科学院开源软件协会 (北京) (ipv4, http) 126 | #Server = http://mirrors.opencas.org/archlinuxcn/$arch 127 | 128 | ## 电子科技大学凝聚网络安全工作室 (ipv4, http) 129 | #Server = http://mirrors.cnssuestc.org/archlinuxcn/$arch 130 | 131 | ## 网易 (ipv4, http) 132 | #Server = https://mirrors.163.com/archlinux-cn/$arch 133 | 134 | ## 重庆大学 (ipv4, http) 135 | #Server = http://mirrors.cqu.edu.cn/archlinuxcn/$arch 136 | -------------------------------------------------------------------------------- /linux/config-backup/etc/polkit-1/localauthority/50-local.d/color.plka: -------------------------------------------------------------------------------- 1 | [Allow Colord all Users] 2 | Identity=unix-user:* 3 | Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile 4 | ResultAny=no 5 | ResultInactive=no 6 | ResultActive=yes -------------------------------------------------------------------------------- /linux/config-backup/etc/polkit-1/rules.d/50-libvirt.rules: -------------------------------------------------------------------------------- 1 | polkit.addRule(function(action, subject) { 2 | if (action.id == "org.libvirt.unix.manage" && 3 | subject.isInGroup("kvm")) { 4 | return polkit.Result.YES; 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /linux/config-backup/etc/proxychains.conf: -------------------------------------------------------------------------------- 1 | # Written by com.deepin.daemon.Network.ProxyChains 2 | strict_chain 3 | quiet_mode 4 | proxy_dns 5 | remote_dns_subnet 224 6 | tcp_read_time_out 15000 7 | tcp_connect_time_out 8000 8 | localnet 127.0.0.0/255.0.0.0 9 | 10 | [ProxyList] 11 | socks5 127.0.0.1 1080 12 | -------------------------------------------------------------------------------- /linux/config-backup/etc/security/limits.d/00.conf: -------------------------------------------------------------------------------- 1 | # -n: file descriptors 2 | * hard nofile 10240 3 | * soft nofile 8192 4 | 5 | # -s: stack size(kbytes) 6 | * hard stack 16384 7 | * soft stack 16384 8 | 9 | # -l: locked-in-memory size (kbytes) 10 | 11 | * hard memlock 16384 12 | * soft memlock 16384 13 | -------------------------------------------------------------------------------- /linux/config-backup/etc/sysctl.d/40-max-user-watches.conf: -------------------------------------------------------------------------------- 1 | fs.inotify.max_user_watches=81920 2 | -------------------------------------------------------------------------------- /linux/config-backup/etc/sysctl.d/80-disable-coredump.conf: -------------------------------------------------------------------------------- 1 | kernel.core_pattern = |/bin/false 2 | -------------------------------------------------------------------------------- /linux/config-backup/etc/sysctl.d/90-vm.conf: -------------------------------------------------------------------------------- 1 | vm.swappiness=1 2 | vm.vfs_cache_pressure=50 3 | -------------------------------------------------------------------------------- /linux/config-backup/etc/systemd/coredump.conf: -------------------------------------------------------------------------------- 1 | # This file is part of systemd. 2 | # 3 | # systemd is free software; you can redistribute it and/or modify it 4 | # under the terms of the GNU Lesser General Public License as published by 5 | # the Free Software Foundation; either version 2.1 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # Entries in this file show the compile time defaults. 9 | # You can change settings by editing this file. 10 | # Defaults can be restored by simply deleting this file. 11 | # 12 | # See coredump.conf(5) for details. 13 | 14 | [Coredump] 15 | Storage=none 16 | #Storage=external 17 | #Compress=yes 18 | #ProcessSizeMax=2G 19 | #ExternalSizeMax=2G 20 | #JournalSizeMax=767M 21 | #MaxUse= 22 | #KeepFree= 23 | -------------------------------------------------------------------------------- /linux/config-backup/etc/systemd/journald.conf: -------------------------------------------------------------------------------- 1 | # This file is part of systemd. 2 | # 3 | # systemd is free software; you can redistribute it and/or modify it 4 | # under the terms of the GNU Lesser General Public License as published by 5 | # the Free Software Foundation; either version 2.1 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # Entries in this file show the compile time defaults. 9 | # You can change settings by editing this file. 10 | # Defaults can be restored by simply deleting this file. 11 | # 12 | # See journald.conf(5) for details. 13 | 14 | [Journal] 15 | #Storage=auto 16 | Compress=yes 17 | #Seal=yes 18 | #SplitMode=uid 19 | #SyncIntervalSec=5m 20 | #RateLimitIntervalSec=30s 21 | #RateLimitBurst=1000 22 | SystemMaxUse=200M 23 | #SystemKeepFree= 24 | #SystemMaxFileSize= 25 | #SystemMaxFiles=100 26 | #RuntimeMaxUse= 27 | #RuntimeKeepFree= 28 | #RuntimeMaxFileSize= 29 | #RuntimeMaxFiles=100 30 | #MaxRetentionSec= 31 | #MaxFileSec=1month 32 | #ForwardToSyslog=no 33 | #ForwardToKMsg=no 34 | #ForwardToConsole=no 35 | #ForwardToWall=yes 36 | #TTYPath=/dev/console 37 | #MaxLevelStore=debug 38 | #MaxLevelSyslog=debug 39 | #MaxLevelKMsg=notice 40 | #MaxLevelConsole=info 41 | #MaxLevelWall=emerg 42 | #LineMax=48K 43 | -------------------------------------------------------------------------------- /linux/config-backup/etc/systemd/logind.conf: -------------------------------------------------------------------------------- 1 | #aciton value:ignore,poweroff,reboot,halt,suspend,hibernate,hybrid-sleep,lock,kexec. 2 | [Login] 3 | #NAutoVTs=6 4 | #ReserveVT=6 5 | #KillUserProcesses=no 6 | #KillOnlyUsers= 7 | #KillExcludeUsers=root 8 | #InhibitDelayMaxSec=5 9 | HandlePowerKey=hibernate 10 | #HandleSuspendKey=suspend 11 | #HandleHibernateKey=hibernate 12 | HandleLidSwitch=hybrid-sleep 13 | #HandleLidSwitchDocked=ignore 14 | #PowerKeyIgnoreInhibited=no 15 | #SuspendKeyIgnoreInhibited=no 16 | #HibernateKeyIgnoreInhibited=no 17 | #LidSwitchIgnoreInhibited=yes 18 | #HoldoffTimeoutSec=30s 19 | #IdleAction=ignore 20 | #IdleActionSec=30min 21 | #RuntimeDirectorySize=10% 22 | #RemoveIPC=yes 23 | #InhibitorsMax=8192 24 | #SessionsMax=8192 25 | #UserTasksMax=33% 26 | -------------------------------------------------------------------------------- /linux/config-backup/etc/systemd/system/nvidia-enable.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | 3 | Description=Enable NVIDIA card 4 | 5 | DefaultDependencies=no 6 | 7 | [Service] 8 | 9 | Type=oneshot 10 | 11 | ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch' 12 | 13 | [Install] 14 | 15 | WantedBy=shutdown.target 16 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.bashrc: -------------------------------------------------------------------------------- 1 | # .bashrc 2 | 3 | # Source global definitions 4 | if [ -f /etc/bashrc ]; then 5 | . /etc/bashrc 6 | fi 7 | 8 | PS1="\[\e[37;1m\][\[\e[31;1m\]\u \[\e[36;1m\]@ \[\e[33;1m\]\h \[\e[35m\]\w\[\e[37;1m\]]\[\e[0m\] \[\e[1m\]\\$\[\e[0m\] " 9 | 10 | # Uncomment the following line if you don't like systemctl's auto-paging feature: 11 | # export SYSTEMD_PAGER= 12 | 13 | [[ -r ~/.shell.env.postload.sh ]] && . ~/.shell.env.postload.sh -------------------------------------------------------------------------------- /linux/config-backup/userhome/.condarc: -------------------------------------------------------------------------------- 1 | #在 Conda 4.7 后,官方的 default 源组默认只包含 main 和 r (windows 会包含 msys2) channel,其他官方源仍支持手动添加。但官方建议不再使用 free channel. 2 | default_channels: 3 | # https://mirrors.tuna.tsinghua.edu.cn 4 | - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/r 5 | - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main 6 | - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/mro 7 | - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/msys2 8 | - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/pro 9 | 10 | custom_channels: 11 | #https://mirrors.tuna.tsinghua.edu.cn 12 | conda-forge: https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/ 13 | menpo: https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/ 14 | soumith: https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/ 15 | viscid-hub: https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/ 16 | pytorch: https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/ 17 | 18 | channels: 19 | - defaults 20 | - conda-forge 21 | - menpo 22 | - soumith 23 | - viscid-hub 24 | - pytorch 25 | 26 | # show_channel_urls: true 27 | channel_priority: flexible 28 | ssl_verify: true 29 | auto_activate_base: false -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/Typora/conf/conf.user.json: -------------------------------------------------------------------------------- 1 | /** For advanced users. */ 2 | { 3 | "defaultFontFamily": { 4 | "standard": null, //String - Defaults to "Times New Roman". 5 | "serif": null, // String - Defaults to "Times New Roman". 6 | "sansSerif": null, // String - Defaults to "Arial". 7 | "monospace": null // String - Defaults to "Courier New". 8 | }, 9 | "autoHideMenuBar": false, //Boolean - Auto hide the menu bar unless the `Alt` key is pressed. Default is false. 10 | 11 | // Array - Search Service user can access from context menu after a range of text is selected. Each item is formatted as [caption, url] 12 | "searchService": [ 13 | ["Search with Google", "https://google.com/search?q=%s"] 14 | ], 15 | 16 | // Custom key binding, which will override the default ones. 17 | "keyBinding": { 18 | // for example: 19 | // "Always on Top": "Ctrl+Shift+P" 20 | }, 21 | 22 | "monocolorEmoji": false, //default false. Only work for Windows 23 | "autoSaveTimer" : 3, // Deprecidated, Typora will do auto save automatically. default 3 minutes 24 | "maxFetchCountOnFileList": 500, 25 | "flags": [] // default [], append Chrome launch flags, e.g: [["disable-gpu"], ["host-rules", "MAP * 127.0.0.1"]] 26 | } 27 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/dconf/README.md: -------------------------------------------------------------------------------- 1 | restore gnome DE configs: 2 | 3 | ```shell 4 | dconf load / < gnome-settings-backup.conf 5 | ``` 6 | 7 | backup gnome DE configs: 8 | ```shell 9 | dconf dump / > gnome-settings-backup.conf 10 | ``` 11 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/dconf/backup-dconf.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BACKUP_DIR="$HOME/.config/dconf" 4 | RAW_FILE="$BACKUP_DIR/raw-dconf.conf" 5 | SAFE_FILE="$BACKUP_DIR/dconf.conf" 6 | 7 | mkdir -p "$BACKUP_DIR" 8 | 9 | echo "[*] 正在导出 GNOME dconf 配置到 $RAW_FILE..." 10 | dconf dump / > "$RAW_FILE" 11 | 12 | echo "[*] 正在生成 Git-safe 安全版本(敏感字段将被屏蔽)..." 13 | 14 | # 屏蔽敏感信息 15 | sed -E \ 16 | -e 's/(password\s*=\s*).*/\1/I' \ 17 | -e 's/(psk\s*=\s*).*/\1/I' \ 18 | -e 's/(token\s*=\s*).*/\1/I' \ 19 | -e 's/(authorization\s*=\s*).*/\1/I' \ 20 | -e 's/((user(name)?|email|ssid)\s*=\s*).*/\1/I' \ 21 | -e 's|(=/home/)[^/]+|\1|g' \ 22 | "$RAW_FILE" > "$SAFE_FILE" 23 | 24 | echo "[✓] 备份完成:" 25 | echo " - 完整原始配置:$RAW_FILE" 26 | echo " - 可公开上传版本:$SAFE_FILE" 27 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/chttrans.conf: -------------------------------------------------------------------------------- 1 | # 轉換引擎 2 | Engine=OpenCC 3 | # 啟用的輸入法 4 | EnabledIM= 5 | # 簡轉繁的 OpenCC 配置 6 | OpenCCS2TProfile= 7 | # 繁轉簡的 OpenCC 配置 8 | OpenCCT2SProfile= 9 | 10 | [Hotkey] 11 | 0=Control+Shift+F 12 | 13 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/classicui.conf: -------------------------------------------------------------------------------- 1 | # 垂直候選字列表 2 | Vertical Candidate List=False 3 | # 使用滑鼠滾輪到上一頁或下一頁 4 | WheelForPaging=True 5 | # 字體 6 | Font="霞鹜文楷 Bold 14" 7 | # 功能表字體 8 | MenuFont="霞鹜文楷 Bold 14" 9 | # 托盤字體 10 | TrayFont="FreeSans Demi-Bold 12" 11 | # 托盤標簽輪廓顏色 12 | TrayOutlineColor=#000000 13 | # 托盤標簽文字顏色 14 | TrayTextColor=#ffffff 15 | # 首選文字圖示 16 | PreferTextIcon=False 17 | # 在圖示顯示佈局名稱 18 | ShowLayoutNameInIcon=True 19 | # 使用輸入法語言來顯示文字 20 | UseInputMethodLanguageToDisplayText=True 21 | # 主題 22 | Theme=default 23 | # 深色模式 24 | DarkTheme=default-dark 25 | # 跟隨系統淺色/深色設定 26 | UseDarkTheme=True 27 | # 在主題與桌面支援時使用系統重點色 28 | UseAccentColor=True 29 | # 在 X11 上對不同螢幕使用單獨的 DPI 30 | PerScreenDPI=True 31 | # 在 Wayland 上強制使用字型 DPI 32 | ForceWaylandDPI=0 33 | # 在 Wayland 下啟用分數縮放 34 | EnableFractionalScale=True 35 | 36 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/clipboard.conf: -------------------------------------------------------------------------------- 1 | # 粘贴主选区 2 | PastePrimaryKey= 3 | # 项目个数 4 | Number of entries=30 5 | # 不要显示密码管理工具中的密码 6 | IgnorePasswordFromPasswordManager=True 7 | # 隐藏剪贴板中包含密码的内容 8 | ShowPassword=False 9 | # 自动清除密码的秒数 10 | ClearPasswordAfter=30 11 | 12 | [TriggerKey] 13 | 0=Control+semicolon 14 | 15 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/cloudpinyin.conf: -------------------------------------------------------------------------------- 1 | # 最小拼音长度 2 | MinimumPinyinLength=4 3 | # 后端 4 | Backend=GoogleCN 5 | # 代理 6 | Proxy= 7 | 8 | [Toggle Key] 9 | 0=Control+Alt+Shift+C 10 | 11 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/notifications.conf: -------------------------------------------------------------------------------- 1 | [HiddenNotifications] 2 | 0=wayland-diagnose-gnome 3 | 4 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/pinyin.conf: -------------------------------------------------------------------------------- 1 | # 雙拼方案 2 | ShuangpinProfile=Xiaohe 3 | # 顯示目前雙拼模式 4 | ShowShuangpinMode=True 5 | # 頁面大小 6 | PageSize=9 7 | # 啟用拼寫檢查 8 | SpellEnabled=True 9 | # 啟用符號 10 | SymbolsEnabled=True 11 | # 啟用拆字 12 | ChaiziEnabled=True 13 | # 啟用 Unicode CJK 擴充區 B 中的字符 14 | ExtBEnabled=True 15 | # 啟用雲端拼音 16 | CloudPinyinEnabled=True 17 | # 雲端拼音索引 18 | CloudPinyinIndex=2 19 | # 加載雲拼音時顯示動畫 20 | CloudPinyinAnimation=True 21 | # 總是顯示雲拼音佔位符 22 | KeepCloudPinyinPlaceHolder=False 23 | # 預編輯模式 24 | PreeditMode="Composing pinyin" 25 | # 將嵌入預編輯文本的光標固定於開頭 26 | PreeditCursorPositionAtBeginning=True 27 | # 在預編輯中顯示完整拼音 28 | PinyinInPreedit=False 29 | # 啟用預測功能 30 | Prediction=True 31 | # 預測字詞數量 32 | PredictionSize=49 33 | # 切換輸入法時的行為 34 | SwitchInputMethodBehavior="Commit current preedit" 35 | # 選擇第 2 個候選詞 36 | SecondCandidate= 37 | # 選擇第 3 個候選詞 38 | ThirdCandidate= 39 | # 使用數字鍵盤選擇候選字詞 40 | UseKeypadAsSelection=False 41 | # 使用退格鍵以取消選詞 42 | BackSpaceToUnselect=True 43 | # 句子數量 44 | Number of sentence=2 45 | # 當輸入長於...時顯示長詞 (设置为 0 时禁用) 46 | LongWordLengthLimit=4 47 | # 快速輸入的觸發按鍵 48 | QuickPhraseKey=semicolon 49 | # 使用 V 以觸發快速輸入 50 | VAsQuickphrase=True 51 | # FirstRun 52 | FirstRun=False 53 | 54 | [ForgetWord] 55 | 0=Control+7 56 | 57 | [PrevPage] 58 | 0=minus 59 | 1=Up 60 | 2=KP_Up 61 | 3=Page_Up 62 | 63 | [NextPage] 64 | 0=equal 65 | 1=Down 66 | 2=KP_Down 67 | 3=Next 68 | 69 | [PrevCandidate] 70 | 0=Shift+Tab 71 | 72 | [NextCandidate] 73 | 0=Tab 74 | 75 | [CurrentCandidate] 76 | 0=space 77 | 1=KP_Space 78 | 79 | [CommitRawInput] 80 | 0=Return 81 | 1=KP_Enter 82 | 2=Control+Return 83 | 3=Control+KP_Enter 84 | 4=Shift+Return 85 | 5=Shift+KP_Enter 86 | 6=Control+Shift+Return 87 | 7=Control+Shift+KP_Enter 88 | 89 | [ChooseCharFromPhrase] 90 | 0=bracketleft 91 | 1=bracketright 92 | 93 | [FilterByStroke] 94 | 0=grave 95 | 96 | [QuickPhrase trigger] 97 | 0=www. 98 | 1=ftp. 99 | 2=http: 100 | 3=mail. 101 | 4=bbs. 102 | 5=forum. 103 | 6=https: 104 | 7=ftp: 105 | 8=telnet: 106 | 9=mailto: 107 | 108 | [Fuzzy] 109 | # ue -> ve 110 | VE_UE=True 111 | # 常見錯誤 112 | NG_GN=True 113 | # 內模糊音節 (xian -> xi'an) 114 | Inner=True 115 | # 短拼音的內模糊音節 (qie -> qi'e) 116 | InnerShort=True 117 | # 匹配不完整的元音 (e -> en, eng, ei) 118 | PartialFinal=True 119 | # 輸入長度大於 4 時進行部分雙拼匹配 120 | PartialSp=False 121 | # u <-> v 122 | V_U=False 123 | # an <-> ang 124 | AN_ANG=False 125 | # en <-> eng 126 | EN_ENG=False 127 | # ian <-> iang 128 | IAN_IANG=False 129 | # in <-> ing 130 | IN_ING=False 131 | # u <-> ou 132 | U_OU=False 133 | # uan <-> uang 134 | UAN_UANG=False 135 | # c <-> ch 136 | C_CH=False 137 | # f <-> h 138 | F_H=False 139 | # l <-> n 140 | L_N=False 141 | # s <-> sh 142 | S_SH=False 143 | # z <-> zh 144 | Z_ZH=False 145 | # 糾錯佈局 146 | Correction=None 147 | 148 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/conf/punctuation.conf: -------------------------------------------------------------------------------- 1 | # 在字母或數字之後輸入半形符號 2 | HalfWidthPuncAfterLetterOrNumber=True 3 | # 輸入成對標點 (例如引號) 4 | TypePairedPunctuationsTogether=False 5 | # Enabled 6 | Enabled=True 7 | 8 | [Hotkey] 9 | 0=Control+period 10 | 11 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/config: -------------------------------------------------------------------------------- 1 | [Hotkey] 2 | # 重複觸發鍵時枚舉輸入法 3 | EnumerateWithTriggerKeys=True 4 | # 枚舉輸入法向前 5 | EnumerateForwardKeys= 6 | # 枚舉輸入法向後 7 | EnumerateBackwardKeys= 8 | # 枚舉時略過第一個輸入法 9 | EnumerateSkipFirst=False 10 | 11 | [Hotkey/TriggerKeys] 12 | 0=Control+space 13 | 1=Zenkaku_Hankaku 14 | 2=Hangul 15 | 16 | [Hotkey/AltTriggerKeys] 17 | 0=Shift+Shift_L 18 | 19 | [Hotkey/EnumerateGroupForwardKeys] 20 | 0=Super+space 21 | 22 | [Hotkey/EnumerateGroupBackwardKeys] 23 | 0=Shift+Super+space 24 | 25 | [Hotkey/ActivateKeys] 26 | 0=Hangul_Hanja 27 | 28 | [Hotkey/DeactivateKeys] 29 | 0=Hangul_Romaja 30 | 31 | [Hotkey/PrevPage] 32 | 0=Up 33 | 34 | [Hotkey/NextPage] 35 | 0=Down 36 | 37 | [Hotkey/PrevCandidate] 38 | 0=Shift+Tab 39 | 40 | [Hotkey/NextCandidate] 41 | 0=Tab 42 | 43 | [Hotkey/TogglePreedit] 44 | 0=Control+Alt+P 45 | 46 | [Behavior] 47 | # 預設啟用 48 | ActiveByDefault=True 49 | # 重新聚焦時重置狀態 50 | resetStateWhenFocusIn=Program 51 | # 共享輸入法狀態 52 | ShareInputState=All 53 | # 在應用程式中顯示預編輯 54 | PreeditEnabledByDefault=True 55 | # 當切換輸入法時顯示輸入法資訊 56 | ShowInputMethodInformation=True 57 | # 當切換輸入焦點時顯示輸入法資訊 58 | showInputMethodInformationWhenFocusIn=True 59 | # 顯示緊湊的輸入法訊息 60 | CompactInputMethodInformation=True 61 | # 顯示第一個輸入法資訊 62 | ShowFirstInputMethodInformation=True 63 | # 預設頁面大小 64 | DefaultPageSize=5 65 | # 覆蓋 Xkb 選項 66 | OverrideXkbOption=False 67 | # 自定 Xkb 選項 68 | CustomXkbOption= 69 | # Force Enabled Addons 70 | EnabledAddons= 71 | # Force Disabled Addons 72 | DisabledAddons= 73 | # Preload input method to be used by default 74 | PreloadInputMethod=True 75 | # 允許在密碼輸入框中使用輸入法 76 | AllowInputMethodForPassword=False 77 | # 輸入密碼時顯示預編輯文本 78 | ShowPreeditForPassword=False 79 | # 儲存使用者數據的時間間隔(以分鐘為單位) 80 | AutoSavePeriod=30 81 | 82 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fcitx5/profile: -------------------------------------------------------------------------------- 1 | [Groups/0] 2 | # Group Name 3 | Name=Default 4 | # Layout 5 | Default Layout=us 6 | # Default Input Method 7 | DefaultIM=shuangpin 8 | 9 | [Groups/0/Items/0] 10 | # Name 11 | Name=keyboard-us 12 | # Layout 13 | Layout= 14 | 15 | [Groups/0/Items/1] 16 | # Name 17 | Name=shuangpin 18 | # Layout 19 | Layout= 20 | 21 | [GroupOrder] 22 | 0=Default 23 | 24 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/fontconfig/conf.d/cn-font.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | serif 7 | 8 | 9 | Source Han Sans CN 10 | Noto Sans 11 | 12 | 13 | 14 | 15 | 16 | sans-serif 17 | 18 | 19 | Source Han Sans CN 20 | Noto Sans 21 | 22 | 23 | 24 | 25 | 26 | monospace 27 | 28 | 29 | DejaVu Sans Mono 30 | Noto Mono 31 | Source Han Sans CN 32 | 33 | 34 | 35 | 36 | rgb 37 | 38 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/mimeapps.list: -------------------------------------------------------------------------------- 1 | [Added Associations] 2 | inode/directory=org.gnome.Nautilus.desktop;dolphin.desktop; 3 | x-scheme-handler/sms=org.gnome.Shell.Extensions.GSConnect.desktop; 4 | application/x-shellscript=org.gnome.gedit.desktop;visual-studio-code.desktop; 5 | text/plain=org.gnome.gedit.desktop; 6 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.config/user-dirs.dirs: -------------------------------------------------------------------------------- 1 | XDG_DESKTOP_DIR="$HOME/Desktop" 2 | XDG_DOWNLOAD_DIR="$HOME/Downloads" 3 | XDG_TEMPLATES_DIR="$HOME/Templates" 4 | XDG_PUBLICSHARE_DIR="$HOME/Public" 5 | XDG_DOCUMENTS_DIR="$HOME/Documents" 6 | XDG_MUSIC_DIR="$HOME/Music" 7 | XDG_PICTURES_DIR="$HOME/Pictures" 8 | XDG_VIDEOS_DIR="$HOME/Videos" 9 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.gitignore_global: -------------------------------------------------------------------------------- 1 | *~ 2 | .DS_Store 3 | __MACOSX 4 | dataSources.xml.rej 5 | node_modules 6 | .localized 7 | desktop.ini 8 | Thumbs.db 9 | .~* 10 | *.sw* 11 | *.pyc 12 | __pycache__ -------------------------------------------------------------------------------- /linux/config-backup/userhome/.tmux.conf: -------------------------------------------------------------------------------- 1 | # force SHELL ENV variable as shell 2 | set-option -g default-shell ${SHELL} 3 | 4 | # 256 rgb true colors 5 | set -g default-terminal "xterm-256color" 6 | 7 | # set -g prefix C-a # default prefix is C-b 8 | 9 | #--- Key bindings 10 | # Use Alt-arrow keys to switch panes 11 | bind -n M-Left select-pane -L 12 | bind -n M-Right select-pane -R 13 | bind -n M-Up select-pane -U 14 | bind -n M-Down select-pane -D 15 | 16 | #--- Shift arrow to switch windows 17 | bind -n S-Left previous-window 18 | bind -n S-Right next-window 19 | 20 | #--- Mouse mode 21 | set -g mouse on 22 | 23 | #--- Visual mode like vim style 24 | set-window-option -g mode-keys vi 25 | bind-key -T copy-mode-vi v send-keys -X begin-selection 26 | bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle 27 | bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 28 | 29 | #--- Window 30 | set -g renumber-window on 31 | set -g base-index 1 # start window numbers at 1, not 0 32 | set -g pane-base-index 1 # start pane numbers at 1, not 0 33 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.vnc/config: -------------------------------------------------------------------------------- 1 | # securitytypes=vncauth,tlsvnc 2 | # desktop=sandbox 3 | #geometry=1280x800 4 | geometry=1920x1080 5 | # localhost 6 | # alwaysshared 7 | dpi=96 8 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.vnc/xstartup: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | unset SESSION_MANAGER 4 | unset DBUS_SESSION_BUS_ADDRESS 5 | 6 | export XKL_XMODMAP_DISABLE=1 7 | 8 | #session=startxfce 9 | #session=startlxde 10 | session=gnome-session 11 | # session=startdde 12 | #session=startkde 13 | #session=i3 14 | 15 | #need install autocutsel(synchronizes the two copy/paste buffers mainly used by X applications) 16 | autocutsel -fork 17 | 18 | exec dbus-launch $session 19 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.xinitrc: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | session=cosmic #${1:-gnome} 3 | 4 | case $session in 5 | cosmic) 6 | session=start-cosmic 7 | #which xrdb &>/dev/null && xrdb -merge ~/.Xresources 8 | ;; 9 | gnome) 10 | export XDG_SESSION_TYPE=x11 11 | export GDK_BACKEND=x11 12 | session=gnome-session 13 | ;; 14 | xfce | xfce4) 15 | which xrdb &>/dev/null && xrdb -merge ~/.Xresources 16 | session=startxfce4 17 | ;; 18 | kde* | plasma*) 19 | export DESKTOP_SESSION=plasma 20 | session=startplasma-x11 21 | ;; 22 | esac 23 | 24 | if [[ -z $(command -v $session) ]]; 25 | then 26 | echo "$session not found" >> start-xrdp.err 27 | exit 1 28 | fi 29 | 30 | 31 | echo "$session" >~/.xsession 32 | 33 | unset SESSION_MANAGER 34 | unset DBUS_SESSION_BUS_ADDRESS 35 | 36 | exec dbus-launch "$session" 37 | 38 | #for vnc 39 | #vncserver -kill $DISPLAY 40 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.xprofile: -------------------------------------------------------------------------------- 1 | export LANG=zh_CN.UTF-8 2 | export LANGUAGE=zh_CN:en_US 3 | export LC_CTYPE=zh_CN.UTF-8 4 | export LC_MESSAGES=zh_CN.UTF-8 5 | 6 | -------------------------------------------------------------------------------- /linux/config-backup/userhome/.zlogout: -------------------------------------------------------------------------------- 1 | echo "再见 $USER" 2 | echo "------$(date)-----" 3 | #ssh-agent -k -------------------------------------------------------------------------------- /linux/desktop-environment/desktop-environment.md: -------------------------------------------------------------------------------- 1 | - DE, desktop environment 桌面环境 2 | 3 | 如gnome、kde plasma、xfce、lxde 4 | 5 | - WM, window manager 窗口管理器 6 | 7 | 如i3wm、twm、awesome、openbox 8 | 9 | 各个桌面环境也有自己的wm,如gnome的mutter、kde的kwin 10 | 11 | - dm,display manager 显示管理器 12 | 13 | 登陆DE或WM(非必须)的图形界面工具,如gdm、sddm、lightdm 14 | 15 | 16 | 17 | # XDG目录规范 18 | 19 | > 该规范定义了一套指向应用程序的环境变量,这些变量指明的就是这些程序应该存储的基准目录。而变量的具体值取决于用户,若用户未指定,将由程序本身指向一个默认目录,该默认目录也应该遵从标准,而不是用户主目录。 20 | 21 | | XDG环境变量 | 默认值 | 目录说明 | 22 | | --------------- | ----------------------------- | ---------------------------- | 23 | | XDG_DATA_HOME | $HOME/.local/share | 用户数据文件 | 24 | | XDG_CONFIG_HOME | $HOME/.config | 用户配置文件 | 25 | | XDG_CACHE_HOME | $HOME/.cache | 非必要(缓存)数据 | 26 | | XDG_RUNTIME_DIR | /run/user/`` | 用户特定的非重要性运行时文件 | 27 | | XDG_DATA_DIRS | /usr/local/share/:/usr/share/ | 首选的基本数据 | 28 | | XDG_CONFIG_DIRS | /etc/xdg | 首选的基本配置 | 29 | 30 | 备注: 31 | 32 | - `XDG_RUNTIME_DIR`目录**必须仅为用户所有**,Unix权限为700,套接字 (socket)、命名管道 (named pipes) 等可存放于此。 33 | - 定义多个变量,使用`:`分隔。 34 | 35 | 36 | 37 | 与以上目录相关的一些子目录信息: 38 | 39 | - `$XDG_CONFIG_HOME/autostart` 登录桌面后自启动的程序的[desktop entry](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys)文件存放目录。 40 | - `$XDG_DATA_DIRS/applications` 将程序的[desktop entry](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys)文件存放于此,可以出现在桌面的程序启动器中。 41 | - `$XDG_DATA_DIRS/icons` 存放程序的[desktop entry](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys)文件使用的icon图标,用户自定义的图标也可以存放于`$HOME/.icons`。 42 | 43 | 44 | 45 | `~/.config/users-dir.dirs`文件可以用户的一些XDG目录的映射位置,如DESKTOP、TEMPLATES等,这样目录在不同桌面环境中可能有差异。 46 | 47 | 示例: 48 | 49 | ```shell 50 | XDG_DESKTOP_DIR="$HOME/Desktop" 51 | XDG_DOWNLOAD_DIR="$HOME/Downloads" 52 | XDG_TEMPLATES_DIR="$HOME/Templates" 53 | XDG_PUBLICSHARE_DIR="$HOME/Public" 54 | XDG_DOCUMENTS_DIR="$HOME/Documents" 55 | XDG_MUSIC_DIR="$HOME/Music" 56 | XDG_PICTURES_DIR="$HOME/Pictures" 57 | XDG_VIDEOS_DIR="$HOME/Videos" 58 | ``` 59 | 60 | 61 | 62 | 一些发行版中,用户登录系统后,会使用`xdg-user-dirs-update `将模板文件`/etc/xdg/users-dirs.defaults`覆盖用户的`~/.config/users-dir.dirs`文件,可修改`/etc/xdg/users-dir.conf`文件中的enabled值为False禁止该行为。 63 | 64 | ```shell 65 | #This controls the behaviour of xdg-user-dirs-update which is run on user login 66 | # You can also have per-user config in ~/.config/user-dirs.conf, or specify 67 | # the XDG_CONFIG_HOME and/or XDG_CONFIG_DIRS to override this 68 | enabled=True #该值若为True将遵循以上注释中的行为 69 | ``` 70 | 71 | `xdg-user-dirs-update`也可以设置新的默认目录,如: 72 | 73 | ```shell 74 | xdg-user-dirs-update --set DESKTOP ~/dir1 75 | ``` 76 | 77 | 78 | 79 | # redhat 设置默认桌面 80 | 81 | 除了在gdm(或其他dm)登陆界面选择不同桌面的session,还可以: 82 | 83 | - `/usr/share/xsessions`文件,dm会读取该目录下的`.desktop`文件,可以选择一下方式 84 | 85 | - 将除了要设置为默认登陆的桌面session的`.desktop`文件外的其他文件移走 86 | 87 | - 修改的`.desktop`文件的前缀名,使要设置为默认的`.desktop`文件在`ls -l`中位于最前面 88 | 89 | 例如,存在`gnome.desktop`和`xfce.desktop`,因为字母`g`排在`x`前,所以gdm的session列表中gnome排在xfce前面。 90 | 91 | - 新建或编辑`/etc/sysconfig/desktop` 92 | 93 | redhat的gdm实际会读取`/etc/gdm/Xsession`(该文件指向`/etc/X11/xinit/Xsession`),Xsession文件中会读取`/etc/sysconfig/desktop`中的`DESKTOP`变量的值: 94 | 95 | > ```shell 96 | > GSESSION="$(type -p gnome-session)" 97 | > STARTKDE="$(type -p startkde)" 98 | > 99 | > # check to see if the user has a preferred desktop 100 | > PREFERRED= 101 | > if [ -f /etc/sysconfig/desktop ]; then 102 | > . /etc/sysconfig/desktop 103 | > if [ "$DESKTOP" = "GNOME" ]; then 104 | > PREFERRED="$GSESSION" 105 | > elif [ "$DESKTOP" = "KDE" ]; then 106 | > PREFERRED="$STARTKDE" 107 | > fi 108 | > fi 109 | > ``` 110 | 111 | 该文件只为gnome和kde做了判定,可根据需要修改. 112 | 113 | 114 | -------------------------------------------------------------------------------- /linux/desktop-environment/wine/wine-fonts-adjust.reg: -------------------------------------------------------------------------------- 1 | REGEDIT4 [HKEY_CURRENT_USER\Software\Wine\X11 Driver] "ClientSideAntiAliasWithCore"="Y" "ClientSideAntiAliasWithRender"="Y" "ClientSideWithRender"="Y" [HKEY_CURRENT_USER\Control Panel\Desktop] "FontSmoothing"="2" "FontSmoothingType"=dword:00000002 "FontSmoothingGamma"=dword:00000578 "FontSmoothingOrientation"=dword:00000001 2 | -------------------------------------------------------------------------------- /linux/desktop-environment/wine/wine-fonts-adobe-source-sans.reg: -------------------------------------------------------------------------------- 1 | REGEDIT4 2 | 3 | [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink] 4 | "System"="SourceHanSansCN-Medium.otf" 5 | "Sans Serif"="SourceHanSansCN-Medium.otf" 6 | "Arial"="SourceHanSansCN-Medium.otf" 7 | "Arial Black"="SourceHanSansCN-Medium.otf" 8 | "Arial CE,238"="SourceHanSansCN-Medium.otf" 9 | "Arial CYR,204"="SourceHanSansCN-Medium.otf" 10 | "Arial Greek,161"="SourceHanSansCN-Medium.otf" 11 | "Arial TUR,162"="SourceHanSansCN-Medium.otf" 12 | "Microsoft Sans Serif"="SourceHanSansCN-Medium.otf" 13 | "Microsoft YaHei"="SourceHanSansCN-Medium.otf" 14 | "微软雅黑"="SourceHanSansCN-Medium.otf" 15 | "MS Sans Serif"="SourceHanSansCN-Medium.otf" 16 | "MS Shell Dlg"="SourceHanSansCN-Medium.otf" 17 | "MS Shell Dlg 2"="SourceHanSansCN-Medium.otf" 18 | "Tahoma"="SourceHanSansCN-Medium.otf" 19 | "Tahoma Bold"="SourceHanSansCN-Medium.otf" 20 | "SimSun"="SourceHanSansCN-Medium.otf" 21 | "SimHei"="SourceHanSansCN-Medium.otf" 22 | "SimKai"="SourceHanSansCN-Medium.otf" 23 | "SimFang"="SourceHanSansCN-Medium.otf" 24 | "宋体"="SourceHanSansCN-Medium.otf" 25 | "新細明體"="SourceHanSansCN-Medium.otf" 26 | "MingLiU"="SourceHanSansCN-Medium.otf" 27 | "PMingLiU"="SourceHanSansCN-Medium.otf" 28 | "DFKai-SB"="SourceHanSansCN-Medium.otf" 29 | "FangSong"="SourceHanSansCN-Medium.otf" "KaiTi"="SourceHanSansCN-Medium.otf" 30 | "Microsoft JhengHei"="SourceHanSansCN-Medium.otf" 31 | "NSimSun"="SourceHanSansCN-Medium.otf" 32 | "Lucida Sans Unicode"="SourceHanSansCN-Medium.otf" 33 | "Courier New"="SourceHanSansCN-Medium.otf" 34 | "Courier New CE,238"="SourceHanSansCN-Medium.otf" 35 | "Courier New CYR,204"="SourceHanSansCN-Medium.otf" 36 | "Courier New Greek,161"="SourceHanSansCN-Medium.otf" 37 | "Courier New TUR,162"="SourceHanSansCN-Medium.otf" 38 | "FixedSys"="SourceHanSansCN-Medium.otf" 39 | "Helv"="SourceHanSansCN-Medium.otf" 40 | "Helvetica"="SourceHanSansCN-Medium.otf" 41 | "Times"="SourceHanSansCN-Medium.otf" 42 | "Times New Roman CE,238"="SourceHanSansCN-Medium.otf" 43 | "Times New Roman CYR,204"="SourceHanSansCN-Medium.otf" 44 | "Times New Roman Greek,161"="SourceHanSansCN-Medium.otf" 45 | "Times New Roman TUR,162"="SourceHanSansCN-Medium.otf" 46 | "Tms Rmn"="SourceHanSansCN-Medium.otf" -------------------------------------------------------------------------------- /linux/desktop-environment/wine/wine-fonts-wqy-microhei.reg: -------------------------------------------------------------------------------- 1 | REGEDIT4 2 | 3 | [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink] 4 | "System"="wqy-microhei.ttc" 5 | "Sans Serif"="wqy-microhei.ttc" 6 | "Arial"="wqy-microhei.ttc" 7 | "Arial Black"="wqy-microhei.ttc" 8 | "Arial CE,238"="wqy-microhei.ttc" 9 | "Arial CYR,204"="wqy-microhei.ttc" 10 | "Arial Greek,161"="wqy-microhei.ttc" 11 | "Arial TUR,162"="wqy-microhei.ttc" 12 | "Microsoft Sans Serif"="wqy-microhei.ttc" 13 | "Microsoft YaHei"="wqy-microhei.ttc" 14 | "微软雅黑"="wqy-microhei.ttc" 15 | "MS Sans Serif"="wqy-microhei.ttc" 16 | "MS Shell Dlg"="wqy-microhei.ttc" 17 | "MS Shell Dlg 2"="wqy-microhei.ttc" 18 | "Tahoma"="wqy-microhei.ttc" 19 | "Tahoma Bold"="wqy-microhei.ttc" 20 | "SimSun"="wqy-microhei.ttc" 21 | "SimHei"="wqy-microhei.ttc" 22 | "SimKai"="wqy-microhei.ttc" 23 | "SimFang"="wqy-microhei.ttc" 24 | "宋体"="wqy-microhei.ttc" 25 | "新細明體"="wqy-microhei.ttc" 26 | "MingLiU"="wqy-microhei.ttc" 27 | "PMingLiU"="wqy-microhei.ttc" 28 | "DFKai-SB"="wqy-microhei.ttc" 29 | "FangSong"="wqy-microhei.ttc" "KaiTi"="wqy-microhei.ttc" 30 | "Microsoft JhengHei"="wqy-microhei.ttc" 31 | "NSimSun"="wqy-microhei.ttc" 32 | "Lucida Sans Unicode"="wqy-microhei.ttc" 33 | "Courier New"="wqy-microhei.ttc" 34 | "Courier New CE,238"="wqy-microhei.ttc" 35 | "Courier New CYR,204"="wqy-microhei.ttc" 36 | "Courier New Greek,161"="wqy-microhei.ttc" 37 | "Courier New TUR,162"="wqy-microhei.ttc" 38 | "FixedSys"="wqy-microhei.ttc" 39 | "Helv"="wqy-microhei.ttc" 40 | "Helvetica"="wqy-microhei.ttc" 41 | "Times"="wqy-microhei.ttc" 42 | "Times New Roman CE,238"="wqy-microhei.ttc" 43 | "Times New Roman CYR,204"="wqy-microhei.ttc" 44 | "Times New Roman Greek,161"="wqy-microhei.ttc" 45 | "Times New Roman TUR,162"="wqy-microhei.ttc" 46 | "Tms Rmn"="wqy-microhei.ttc" -------------------------------------------------------------------------------- /linux/desktop-environment/wine/wine-fonts.md: -------------------------------------------------------------------------------- 1 | 几种解决linux中wine/crossover字体问题的方法。 2 | 3 | # 字体链接 4 | 5 | Windows支持字体链接:当一种字体中不存在某个字时,可以尝试从另一个字体文件中寻找相应的字形。 6 | 7 | 通过注册表指定代替的字体以达到wine程序使用linux已经安装的字体的目录(可在`/usr/share/fonts`或`~/.local/fonts`找到已经安装的字体)。 8 | 9 | 1. 编写注册表文件,假如该文件为fonts.reg。 10 | 11 | 2. `wine regedit`启动注册表程序,点击注册表-导入注册表文件,选择fonts.reg文件导入。 12 | 13 | 如使用crossover,在其界面中打开**运行命令**,运行regedit(或者选中容器后在右键菜单中选择“运行命令“)即可打开注册表程序。 14 | 15 | 如果仍有部分字体出现方块,尝试在wine配置(winecfg程序)中将系统改为其他版本(如xp)。 16 | 17 | --- 18 | 19 | fonts.reg文件示例——使用SourceHanSansCN-Medium.otf代替windows字体。 20 | 21 | 如要使用其他字体自行更换为具体字体文件名(例如文泉驿微米黑`wqy-microhei.ttc`),提示:在`/usr/share/fonts`下可找到该字体文件。 22 | 23 | ```shell 24 | REGEDIT4 25 | 26 | [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink] 27 | "System"="SourceHanSansCN-Medium.otf" 28 | "Sans Serif"="SourceHanSansCN-Medium.otf" 29 | "Arial"="SourceHanSansCN-Medium.otf" 30 | "Arial Black"="SourceHanSansCN-Medium.otf" 31 | "Arial CE,238"="SourceHanSansCN-Medium.otf" 32 | "Arial CYR,204"="SourceHanSansCN-Medium.otf" 33 | "Arial Greek,161"="SourceHanSansCN-Medium.otf" 34 | "Arial TUR,162"="SourceHanSansCN-Medium.otf" 35 | "Microsoft Sans Serif"="SourceHanSansCN-Medium.otf" 36 | "Microsoft YaHei"="SourceHanSansCN-Medium.otf" 37 | "微软雅黑"="SourceHanSansCN-Medium.otf" 38 | "MS Sans Serif"="SourceHanSansCN-Medium.otf" 39 | "MS Shell Dlg"="SourceHanSansCN-Medium.otf" 40 | "MS Shell Dlg 2"="SourceHanSansCN-Medium.otf" 41 | "Tahoma"="SourceHanSansCN-Medium.otf" 42 | "Tahoma Bold"="SourceHanSansCN-Medium.otf" 43 | "SimSun"="SourceHanSansCN-Medium.otf" 44 | "SimHei"="SourceHanSansCN-Medium.otf" 45 | "SimKai"="SourceHanSansCN-Medium.otf" 46 | "SimFang"="SourceHanSansCN-Medium.otf" 47 | "宋体"="SourceHanSansCN-Medium.otf" 48 | "新細明體"="SourceHanSansCN-Medium.otf" 49 | "MingLiU"="SourceHanSansCN-Medium.otf" 50 | "PMingLiU"="SourceHanSansCN-Medium.otf" 51 | "DFKai-SB"="SourceHanSansCN-Medium.otf" 52 | "FangSong"="SourceHanSansCN-Medium.otf" "KaiTi"="SourceHanSansCN-Medium.otf" 53 | "Microsoft JhengHei"="SourceHanSansCN-Medium.otf" 54 | "NSimSun"="SourceHanSansCN-Medium.otf" 55 | "Lucida Sans Unicode"="SourceHanSansCN-Medium.otf" 56 | "Courier New"="SourceHanSansCN-Medium.otf" 57 | "Courier New CE,238"="SourceHanSansCN-Medium.otf" 58 | "Courier New CYR,204"="SourceHanSansCN-Medium.otf" 59 | "Courier New Greek,161"="SourceHanSansCN-Medium.otf" 60 | "Courier New TUR,162"="SourceHanSansCN-Medium.otf" 61 | "FixedSys"="SourceHanSansCN-Medium.otf" 62 | "Helv"="SourceHanSansCN-Medium.otf" 63 | "Helvetica"="SourceHanSansCN-Medium.otf" 64 | "Times"="SourceHanSansCN-Medium.otf" 65 | "Times New Roman CE,238"="SourceHanSansCN-Medium.otf" 66 | "Times New Roman CYR,204"="SourceHanSansCN-Medium.otf" 67 | "Times New Roman Greek,161"="SourceHanSansCN-Medium.otf" 68 | "Times New Roman TUR,162"="SourceHanSansCN-Medium.otf" 69 | "Tms Rmn"="SourceHanSansCN-Medium.otf" 70 | ``` 71 | 72 | 微调字体渲染的注册表文件adjust-fonts.reg(同样按上面的方法导入注册表即可): 73 | 74 | ```shell 75 | REGEDIT4 [HKEY_CURRENT_USER\Software\Wine\X11 Driver] "ClientSideAntiAliasWithCore"="Y" "ClientSideAntiAliasWithRender"="Y" "ClientSideWithRender"="Y" [HKEY_CURRENT_USER\Control Panel\Desktop] "FontSmoothing"="2" "FontSmoothingType"=dword:00000002 "FontSmoothingGamma"=dword:00000578 "FontSmoothingOrientation"=dword:00000001 76 | ``` 77 | 78 | # 使用Windows字体 79 | 80 | ## 硬盘中存在一个windows系统 81 | 82 | 挂载windows的C:\盘,例如其被挂载在`/windows` 83 | 84 | ``` 85 | ln -s /windows/Windows/Fonts /usr/share/fonts/WindowsFonts 86 | ``` 87 | 88 | 然后重新生成字体缓存: 89 | 90 | ``` 91 | fc-cache 92 | ``` 93 | 94 | 或者,将Windows的字体复制到`/usr/share/fonts`: 95 | 96 | ``` 97 | mkdir /usr/share/fonts/WindowsFonts 98 | cp /windows/Windows/Fonts/* /usr/share/fonts/WindowsFonts 99 | chmod 755 /usr/share/fonts/WindowsFonts/* 100 | ``` 101 | 102 | 然后重新生成字体缓存: 103 | 104 | ``` 105 | fc-cache 106 | ``` 107 | 108 | ## 提供相应的windows字体 109 | 110 | 把相关字体(如simsun.ttc)放到`~/.wine/drive_c/windows/Fonts/`目录。 -------------------------------------------------------------------------------- /linux/filesystem/btrfs分区.md: -------------------------------------------------------------------------------- 1 | # 分区准备 2 | 3 | - /dev/nvme0n1p1 EFI 分区 512M 4 | 5 | ```shell 6 | mkfs.fat32 /dev/nvme0n1p1 #!如果要保留已有系统的efi,不要格式化 7 | ``` 8 | 9 | - /dev/nvme0n1p2 swap分区 可选,大小例如8G 10 | 11 | ```shell 12 | mkswap dev/nvme0n1p2 13 | ``` 14 | 15 | 16 | 17 | - /dev/nvme0n1p13 btrfs分区 系统和数据 18 | 19 | ```shell 20 | mkfs.btrfs [-m ] [-L ] /dev/nvme0n1p3 21 | 22 | mkfs.btrfs /dev/nvme0n1p3 23 | ``` 24 | 25 | 26 | 27 | # 创建btrfs子卷 28 | 29 | 1. 将btrfs分区挂载到/mnt 30 | 31 | ```shell 32 | mount -o compress=zstd /dev/nvme0n1p3 /mnt 33 | ``` 34 | 35 | 2. 使用`btrfs subvolume create /mnt/`创建子卷 36 | 37 | 一般name以`@` 开头,也可使用单个`@`字符作为卷名 38 | 39 | ```shell 40 | btrfs subvolume create /mnt/@ 41 | btrfs subvolume create /mnt/@home 42 | btrfs subvolume create /mnt/@log 43 | btrfs subvolume create /mnt/@cache 44 | 45 | #使用 chattr 忽略无需写时复制的子卷 46 | chattr +C /mnt/@log 47 | chattr +C /mnt/@cache 48 | chattr +C /mnt/@tmp 49 | chattr +C /mnt/@dev 50 | 51 | btrfs subvol list /mnt #subvol简写等同于subvolume 52 | #删除示例 53 | #btrfs subvolume delete /mnt/@xxx 54 | 55 | umount -fl /mnt #创建完毕后卸载/mnt以进行后续操作 56 | ``` 57 | 58 | 子卷规划: 59 | 60 | | subvolume | 在系统的挂载点 | 附注 | 61 | | --------- | -------------- | -------------------------------- | 62 | | @ | / | 根分区 | 63 | | @home | /home | | 64 | | @log | /var/log | 日志 | 65 | | @cache | /var/cache | 缓存目录,包缓存默认也在该目录下 | 66 | 67 | # 挂载分区 68 | 69 | ```shell 70 | 71 | #1. 根分区 @root子卷 72 | mount -o noatime,nodiratime,ssd,compress=zstd,subvol=@ /dev/nvme0n1p3 /mnt 73 | 74 | #2. EFI 75 | mkdir -p /mnt/boot/efi #EFI分区挂载点 76 | mount /dev/nvme0n1p1 /mnt/boot/efi 77 | 78 | #3. swap (如有) 79 | swapon /dev/nvme0n1p2 80 | 81 | #4.1 创建subvolume的挂载点 82 | mkdir /mnt/home 83 | mkdir -p /mnt/var/log 84 | mkdir -p /mnt/var/cache 85 | 86 | #4.2 挂载subvolume 87 | mount -o noatime,nodiratime,ssd,compress=zstd,subvol=@home /dev/nvme0n1p3 /mnt/home 88 | 89 | mount -o noatime,nodiratime,ssd,compress=zstd,subvol=@logs /dev/nvme0n1p3 /mnt/var/log 90 | 91 | mount -o noatime,nodiratime,ssd,compress=zstd,subvol=@cache /dev/nvme0n1p3 /mnt/var/cache 92 | 93 | #...依次挂载完毕 94 | 95 | lsblk #查看 96 | ``` 97 | 98 | 99 | 100 | # 辅助工具 101 | 102 | - snapper 103 | - -------------------------------------------------------------------------------- /linux/filesystem/ceph-delpy.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 以操作系统为centos 7.x的3个节点组建ceph为例,分别为: 4 | 5 | - node1 6 | 7 | 作为管理节点ceph-admin 。 8 | 9 | - node2 10 | 11 | - node3 12 | 13 | 如无特别说明,则该操作均适用于三个节点。 14 | 15 | 基本要求 16 | 17 | > 5GB 系统磁盘、swap = 512MiB,及主目录 = 3GiB 18 | > 19 | > 2GiB 内存及每台系统一个虚拟处理器 20 | > 21 | > 每台系统一个固定的 IP 22 | > 23 | > 所有系统必须能用*简称*(hostname -s)互相 ping 24 | 25 | --- 26 | 27 | # 准备 28 | 29 | - 关闭防火墙和selinux 30 | 31 | ```shell 32 | systemctl disable --now firewalld 33 | sed -i '/SELINUX=/c SELINUX=disabled' /etc/selinux/config 34 | setenforce 0 35 | ``` 36 | 37 | - 配置主机名和hosts解析 38 | 39 | > 192.168.78.101 node1 40 | > 192.168.78.102 node2 41 | > 192.168.78.103 node3 42 | 43 | - 帐户和认证 44 | 45 | 配置管理账户ssh密钥认证,各个创建ceph账户并配置密钥认证(可以使用nis等工具管理账户) 46 | 47 | ```shell 48 | useradd -d /home/ceph -m ceph 49 | echo "ceph" | passwd ceph --stdin 50 | #ssh-key 51 | ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N "" 52 | #ssh-copy-id 略 53 | ``` 54 | 55 | - 时间同步服务 56 | 57 | - 准备ceph源 58 | 59 | ```shell 60 | echo ' 61 | [ceph] 62 | name=ceph nautilus 63 | baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-nautilus/el7/x86_64/ 64 | gpgcheck=0 65 | enabled=1 66 | '> /etc/yum.repos.d/ceph.repo 67 | yum makecache 68 | ``` 69 | 70 | - 安装epel源 71 | 72 | ```shell 73 | yum install -y epel-release 74 | ``` 75 | 76 | 77 | 78 | # 部署 79 | 80 | - 在所有节点 安装ceph包 81 | 82 | ```shell 83 | yum install -y ceph 84 | ``` 85 | 86 | 也可以使用ceph-deploy为其他节点安装ceph 87 | 88 | ```shell 89 | ceph-deploy install node1 node2 node3 90 | ``` 91 | 92 | - 在node1 安装ceph-deploy 93 | 94 | ```shell 95 | yum install -y ceph-deploy 96 | ``` 97 | 98 | - 在node1执行 创建monitor 99 | 100 | ```shell 101 | mkdir ceph && cd ceph 102 | ceph-deploy new node1 node2 node3 103 | ``` 104 | 105 | 正确执行后会生成三个文件:`ceph.conf` `ceph.log` `ceph.mon.keyring` 106 | 107 | - 在node1执行 配置ceph.conf 108 | 109 | ```shell 110 | cat << EOF >> ceph.conf 111 | osd_journal_size = 10000 112 | osd_pool_default_size = 2 113 | osd_pool_default_min_size = 2 114 | osd_crush_chooseleaf_type = 1 115 | osd_crush_update_on_start = true 116 | max_open_files = 131072 117 | osd pool default pg num = 128 118 | osd pool default pgp num = 128 119 | mon_pg_warn_max_per_osd = 0 120 | EOF 121 | ``` 122 | 123 | 124 | 125 | - node1安装ceph-deploy安装 = Minimal,及一个可用的时间长注程序(即是可靠的 NTP 来源) 126 | 127 | 5GB 系统磁盘、swap = 512MiB,及主目录 = 3GiB 128 | 129 | 2GiB 内存及每台系统一个虚拟处理器 130 | 131 | 每台系统一个固定的 IP 132 | 133 | 所有系统必须能用*简称*(hostname -s)互相 ping。要是没有 DNS 服务,可采用一致的 /etc/hosts 档,内有所有简称(而不是群集的 FQDN)。 134 | 135 | - ```shell 136 | yum install -y epel-release 137 | yum install -y ceph-deploy 138 | ``` 139 | 140 | - 部署ceph到各个io节点 141 | 142 | ```shell 143 | mkdir deploy-ceph && cd deploy-ceph 144 | ceph-deploy new m1 145 | ``` 146 | 147 | 148 | 149 | --- 150 | 151 | 手动安装 152 | 153 | ```shell 154 | yum install -y ceph-common 155 | ``` 156 | 157 | 装载rbd模块 158 | 159 | ```shell 160 | modprobe rbd #装载rb生成d模块 161 | lsmod | grep rbd #查看模块是否已经装载 162 | ``` 163 | 164 | ## 部署monitor 165 | 166 | 167 | 168 | 监控密钥monitor-keyring 169 | 170 | ```shell 171 | ceph-authtool --create-keyring ./ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *' 172 | ``` 173 | 174 | 175 | 176 | ```shell 177 | cp ./ceph.mon.keyring ./cluster.bootstrap.keyring 178 | ceph-authtool ./cluster.bootstrap.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring 179 | ``` 180 | 181 | -------------------------------------------------------------------------------- /linux/filesystem/common-fs-errors.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 硬盘offline 4 | 5 | 6 | 7 | # 扇区故障bad sector 8 | 9 | 查看分区blocksize 10 | 11 | ```shell 12 | stat <分区挂载点> 13 | ``` 14 | 15 | 在输出信息中可以看到IO block大小。 16 | 17 | # df或ls卡住 18 | 19 | df卡住一般是网络文件系统挂载问题,查找原因: 20 | 21 | ```shell 22 | mount |column -t 23 | cat /etc/mtab 24 | strace df 25 | fuser <挂载点> 26 | ``` 27 | 28 | ls卡住多在出问题的挂载目录中出现,尝试: 29 | 30 | ```shell 31 | strace ls -l 32 | unalias -a && ls -1 33 | ``` 34 | 35 | 36 | 37 | 解决: 38 | 39 | - 检查网络文件系统服务端情况 40 | 41 | - 卸载挂载点 42 | 43 | ```shell 44 | umount -fl /mountedPoint #mountedPoint换成实际挂载点 45 | ``` 46 | 47 | 48 | 49 | 50 | 51 | # text file busy 52 | 53 | 卸载分区或删除文件时提示: 54 | 55 | >text file busy 56 | 57 | ```shell 58 | fuser /path/to/file #换成实际的文件路径 59 | ``` 60 | 61 | 然后kill掉该进程 -------------------------------------------------------------------------------- /linux/filesystem/filesystem-basic.md: -------------------------------------------------------------------------------- 1 | # 文件类型 2 | 3 | > linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进程,线程等。 4 | 5 | ## 分区与文件系统 6 | 7 | 对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能创建一个文件系统,磁盘阵列等技术可以在一个分区上创建多个文件系统。 8 | 9 | ## 组成 10 | 11 | - inode:一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号; 12 | 13 | inode 包含以下信息 14 | 15 | - 权限 (read/write/excute); 16 | - 拥有者与群组 (owner/group); 17 | - 容量; 18 | - 建立或状态改变的时间 (ctime); 19 | - 最近一次的读取时间 (atime); 20 | - 最近修改的时间 (mtime); 21 | - 定义文件特性的旗标 (flag),如 SetUID...; 22 | - 该文件真正内容的指向 (pointer)。 23 | 24 | - block:记录文件的内容,文件太大时,会占用多个 block。 25 | 26 | - superblock:记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等; 27 | - block bitmap:记录 block 是否被使用的位域。 28 | 29 | ## 目录 30 | 31 | 建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名。 32 | 33 | 可以看出文件的 inode 本身不记录文件名,文件名记录在目录中,因此新增文件、删除文件、更改文件名这些操作与目录的 w 权限有关。 34 | 35 | 36 | 37 | # ext4 38 | 39 | 扩容: 40 | 41 | ```shell 42 | e2fsck -f /dev/sdx 43 | 44 | resize2fs /dev/sdx 45 | 46 | #ext4根分区无损扩容(不可umount) 47 | 48 | #modprobe,lsblk(个人决定这个可以没有) 49 | 50 | resize2fs /dev/sdx 51 | 52 | #reboot 53 | ``` 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /linux/filesystem/linux-file-info查看文件信息.md: -------------------------------------------------------------------------------- 1 | # Linux文件类型 2 | 3 | 在`ls -l`中第1位字符表示文件类型,各种类型如下: 4 | 5 | - `-` 普通文件(common file) 6 | - 文本文件(如/etc/hosts) 7 | - 二进制文件(如/usr/bin/ls) 8 | - 数据格式文件(如/var/logwtmp) 9 | - `d` 目录(directory)文件 10 | - `l` 符号链接(link) 11 | - 设备与装置 12 | - `b` 块(block)设备(如/dev/sda) 13 | - `c` 字符(character)设备 (如鼠标键盘等串行端口设备) 14 | - s 套接字(sockets)文件(数据接口文件) 15 | - `p` 管道(pipe)文件( FIFO——first-in-first-out,解决多个程序同时存取一个文件所造成的错误问题) 16 | 17 | 18 | 19 | file命令可以查看更为详细的文件类型信息 20 | 21 | ```shell 22 | file ~/.bashrc #文件类型信息 23 | file -i ~/.bashrc #mime类型和编码格式 24 | file --mime-type ~/.bashrc #mime类型 25 | file --mime-encoding ~/.bashrc #mime编码格式 26 | ``` 27 | 28 | 29 | 30 | stat 查看文件各项信息 31 | 32 | ```shell 33 | stat ~/.bashrc 34 | stat --format %s .bashrc #获取文件大小(单位bytes) 35 | stat .bashrc --format %u:%g #文件所属用户名(%u)及用户组(%g)的id 36 | stat .bashrc --format %U:%G #文件所属用户名及用户组的名字 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /linux/filesystem/lustre/lustre-deployment.md: -------------------------------------------------------------------------------- 1 | # 安装准备 2 | 3 | 安装方式: 4 | 5 | - 安装已编译的lutre二进制包,需要下载适合当前系统内核版本的安装包 6 | - 从源码编译安装 7 | 8 | 9 | 10 | 11 | 12 | # 安装 13 | 14 | xx x 15 | 16 | 17 | 18 | 刚安装后,如果需要手动加载模块: 19 | 20 | ```shell 21 | modprobe -v zfs 22 | modprobe -v lustre 23 | modprobe -v lnet 24 | lsmod | grep {zfs,lustre,lnet} 25 | ``` 26 | 27 | 28 | 29 | # 组建lustre集群 30 | 31 | - mgt 32 | - mdt 33 | - ost -------------------------------------------------------------------------------- /linux/network/DNS域名服务.md: -------------------------------------------------------------------------------- 1 | # DNS服务器 2 | 3 | ## bind 4 | 5 | [BIND](https://www.isc.org/downloads/bind/) (Berkeley Internet Name Daemon,伯克利互联网名称服务)。 6 | 7 | 1. 安装bind。 8 | 9 | 2. 配置 10 | 11 | 如果安装了bind-chroot,BIND会被封装到一个伪根目录内,配置文件的位置变为: 12 | `/var/named/chroot/etc/named.conf`和`/var/named/chroot/var/named/` 13 | 14 | - `/etc/named.conf`(bind配置文件) 15 | 16 | ```shell 17 | options{ 18 | directory "/var/named"; 19 | }; 20 | 21 | zone "example.com" { 22 | type master; 23 | file "example.com.zone"; 24 | } 25 | ``` 26 | 27 | - `/var/named/*.zone` zone文件(域的dns信息) 28 | ``/var/named/example.com.zone`文件示例: 29 | 30 | ```shell 31 | $TTL 3600; 32 | @ IN SOA example.com. user1.example.com. (222 1H 15M 1W 1D) 33 | @ IN NS dns1.example.com. 34 | dns1 IN A 123.123.123.123 35 | www IN A 233.233.233.233 36 | ``` 37 | 38 | 3. 启用`named`服务。 39 | 40 | ## dnsmasq 41 | 42 | [Dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html) 提供 DNS 缓存和 DHCP 服务功能。 43 | 44 | 45 | 46 | TTL值 47 | TTL值全称是“生存时间(Time To Live)”,表示解析记录在DNS服务器中的缓存时间,`TTL`的时间长度单位是秒。 48 | 49 | -------------------------------------------------------------------------------- /linux/network/NAT.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | > **网络地址转换**(Network Address Translation,缩写为NAT),也叫做**网络掩蔽**或者**IP掩蔽**(IP masquerading),是一种在IP数据包通过[路由器](https://zh.wikipedia.org/wiki/%E8%B7%AF%E7%94%B1%E5%99%A8)或[防火墙](https://zh.wikipedia.org/wiki/%E9%98%B2%E7%81%AB%E5%A2%99)时重写来源IP地址或目的[IP地址](https://zh.wikipedia.org/wiki/IP%E5%9C%B0%E5%9D%80)的技术。 4 | 5 | NAT实现了内部网络中的主机访问外部资源,以及外部网络中主机访问内部网络主机;通过NAT可以隐藏内部私有网络主机,提高内网网络主机的安全性。 6 | 7 | > NAT广泛用于在有多台主机但只通过一个公有IP地址访问因特网的**私有网络**中。因为IPV4地址数量的不足,NAT作为解决[IPv4地址短缺](https://zh.wikipedia.org/wiki/IPv4%E4%BD%8D%E5%9D%80%E6%9E%AF%E7%AB%AD)以避免保留IP地址困难的方案而流行起来。 8 | 9 | 附:IPv4的3组私有IP地址 10 | 11 | - A 10.0.0.0~10.255.255.255.255 12 | - B 172.16.0.0.0~172.31.255.255 13 | - C 192.168.0.0~192.168.255.255 14 | 15 | ## NAT转换类型 16 | 17 | - 静态转换 18 | 19 | 私有IP地址转换为固定的共有IP地址——一对一固定映射。 20 | 21 | - 动态转换 22 | 23 | 私有IP地址转换为随机的公有IP地址——一对一动态映射到可用地址池中的一个。 24 | 25 | - 端口转换(PNAT,端口多路复用) 26 | 27 | 修改数据包的源端口并进行**端口转换**,私有网络中多台主机**共用一个公有IP地址**——多对一。 28 | 29 | # 配置 30 | 31 | ```bash 32 | 外部网络===========[网口1]--NAT服务器--[网口2]----内部网络----内部网络主机 33 | ``` 34 | 35 | NAT服务器负责将内部网络的流量(来自网口2)转换到外部网络(网口1)。 36 | 37 | # NAT服务器配置 38 | 39 | 下文所述为使用端口多路复用方式配置内部网络主机访问外部网络资源的示例。 40 | 41 | ## IP转发 42 | 43 | ```shell 44 | #查看开启状态 1为开启 0为关闭 45 | sudo sysctl -n net.ipv4.ip_forward 46 | #或sysctl net.ipv4.ip_forward 47 | #或 cat /proc/sys/net/ipv4/ip_forward 48 | 49 | #临时开启(暂时开启,重启后失效) 50 | echo 1 > /proc/sys/net/ipv4/ip_forward 51 | sysctl -w net.ipv4.ip_forward=1 52 | 53 | #永久生效(配置须在重启后才被启用) 54 | echo " 55 | net.ipv4.ip_forward=1 56 | net.ipv6.conf.default.forwarding=1 57 | net.ipv6.conf.all.forwarding=1 58 | " > /sysctl.d/ip_forward.conf 59 | #使用该命令可以立即读取上面增加的配置文件 使配置生效 60 | sysctl --system 61 | ``` 62 | 63 | ## 端口转发 64 | 65 | 可使用firewalld或iptables进行转发 66 | 67 | ### firewall 68 | 69 | - 外部网口:eno1 地址192.168.1.1/24 70 | - 内部网口:eno2 地址172.16.1.1/24 71 | 72 | ```shell 73 | #1修改接口区域 74 | #这里为了示例中区分方便使用 external和internal区域分别表示访问外网的连接和访问内网的连接,具体区域名以实际情况为准 75 | 76 | #1.1 将外部网络网口eno1(网口1)的网络区域设置为external 77 | firewall-cmd --permanent --zone=external --change-interface=eno1 78 | 79 | #1.2 将内部网络网口eno2(网口2)的网络区域设置为internal 80 | firewall-cmd --permanent --zone=internal --change-interface=eno2 81 | 82 | #2. 为外部网口eno1(网口1)设置地址伪装开启NAT转发 83 | firewall-cmd --permanent --zone=external --add-masquerade 84 | #关闭NAT时需要去掉masquerade 85 | #firewall-cmd --remove-masquerade 86 | 87 | #开放DNS使用的53端口,否则可能导致内网服务器虽然设置正确的DNS,但是依然无法进行域名解析。 88 | # firewall-cmd --zone=public --add-port=53/tcp --permanent 89 | 90 | 91 | #3. NAT规则(可选) 将来自内网172.16.1.0/24子网的数据转发到外部网口eno1上 92 | firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eno1 -j MASQUERADE -s 172.16.1.0/24 93 | 94 | #3. 重载配置 95 | firewall-cmd --reload 96 | ``` 97 | 98 | 相关命令 99 | 100 | ```shell 101 | #查看网口的网络区域 102 | firewall-cmd --get-zone-of-interface=eno1 103 | firewall-cmd --get-zone-of-interface=eno2 104 | 105 | firewall-cmd --query-masquerade 106 | 107 | # 查看所有外部网络区域配置 108 | firewall-cmd --zone=external --list-all 109 | 110 | # 只允许特定端口转发 111 | firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1 112 | firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 113 | ``` 114 | 115 | ### iptables 116 | 117 | - 外部网口:eno1 地址192.168.1.1/24 118 | - 内部网口:eno2 地址172.16.1.1/24 119 | 120 | ```shell 121 | #1. 添加SNAT规则 示例 122 | # 172.16.1.0/24为内网网卡eno2的子网 192.168.1.1为外网网卡eno1的IP 123 | iptables -A POSTROUTING -t nat -o eno2 -j MASQUERADE 124 | #或使用SNAT 125 | #iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eno2 -j SNAT --to-source 192.168.1.1 126 | 127 | #改变TCP MSS以适应PMTU(Path MTU) 128 | #iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 129 | #或设置固定tcp mss 130 | #通常以太网的mtu为1500,tcp的mss就是1460(1500-20(IP头)-20(tcp头) 131 | # iptables -A FORWARD -p tcp --syn -s 172.6.1.0/24 -j TCPMSS --set-mss 1460 132 | 133 | #2. 保存设置的规则 134 | service iptables save 135 | service iptables restart 136 | ``` 137 | 138 | # NAT客户端配置 139 | 140 | 修改内部网络中主机的网络连接参数: 141 | 142 | - GATEWAY:为NAT服务器的内部网络网口(网口2,eno2)的IP地址 143 | - DNS:同NAT服务器 144 | -------------------------------------------------------------------------------- /linux/network/network-bridge-网桥配置.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | > **桥接器**(英语:network bridge),又称**网桥,**将[网络](https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C)的多个[网段](https://zh.wikipedia.org/wiki/%E7%BD%91%E6%AE%B5)在[数据链路层](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82)([OSI模型](https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B)第2层)连接起来(即桥接)。 4 | 5 | 6 | 7 | *示例中,网桥名为`br0` ,有线网卡设备名为`eth0` ,无线网卡设备名为`wlo1`(网卡设备名可使用`ip addr`命令查看)。* 8 | 9 | # brctl 10 | 11 | 需要安装`bridge-utils` 。 12 | 13 | - 创建流程: 14 | 15 | 1. 创建网桥 16 | 2. 添加一个设备到网桥 17 | 3. 启动网桥 18 | 4. 分配ip地址 19 | 20 | ```shell 21 | bridge=br0 22 | interface=eno1 23 | addr=10.9.9.1/24 24 | #1. create bridge 25 | brctl addbr $bridge 26 | #2. add interface to bridge 27 | brctl addif $bridge $interface 28 | #3. start bridge 29 | ip link set up dev $bridge 30 | #assign address 31 | ip addr add dev $bridge $addr 32 | ``` 33 | 34 | - 其他常用命令 35 | 36 | bridge-utils的命令格式是`brctl [commonds]` ,更多命令查看`brctl --help` 。 37 | 38 | - 显示当前已存在的网桥`brctl show` 39 | 40 | - 删除网桥`delbr` 41 | 42 | ```shell 43 | ip link set dev br0 down #删除网桥前先关闭启动的网桥 44 | brctl delbr br0 #删除名为br0的网桥 45 | ``` 46 | 47 | # ip命令 48 | 49 | 需要安装`iproute2`。 50 | 51 | - 创建网桥 52 | 53 | 1. 创建一个网桥并启用 54 | 2. 添加一个设备到网桥 55 | 3. 分配ip地址 56 | 57 | ```shell 58 | bridge=br0 59 | interface=eno1 60 | addr=10.10.10.251/24 61 | 62 | #1 create a bridge and start it 63 | sudo ip link add name $bridge type bridge 64 | sudo ip link set up dev $bridge 65 | 66 | #2 add interface device to bridge 67 | sudo ip link set dev $interface promisc on 68 | sudo ip link set dev $interface up 69 | sudo ip link set dev $interface master $bridge 70 | 71 | #3 assign address 72 | sudo ip addr add dev $bridge $addr 73 | ip a 74 | ``` 75 | 76 | - 显示当前已存在的网桥 `bridge link show` ( bridge 工具包含在iproute2中) 77 | 78 | - 删除网桥 79 | 80 | 1. 关闭网口混杂模式 81 | 2. 恢复创建了网桥的网口设置 82 | 3. 删除网桥 83 | 84 | ```shell 85 | #!/bin/sh 86 | bridge=br0 87 | interface=eno1 88 | addr=10.10.10.251/24 89 | 90 | sudo ip link set $interface promisc off 91 | sudo ip link set $interface down 92 | sudo ip link set dev $interface nomaster 93 | sudo ip link delete $bridge type bridge 94 | ``` 95 | 96 | 注意:创建的网桥在重启系统后就不存在。 -------------------------------------------------------------------------------- /linux/network/ssh/complie-openssh.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 重要提示:如果是通过ssh连接远程主机并升级其openssh,请预先开启其他连接方式,以免因升级时ssh连接中断而无法连接到该主机。 4 | 5 | 提示:对于redhat,不应该仅看openssh大版本号来判定其是否大幅落后上游,由于长时的商业支持,redhat很少轻易变动大版本号,而是在获取上游更新后重新打包rpm并升级末尾的附加版本编号(例如openssh-7.4p1-22中的22即其附加版本编号),参看[What is backporting and how does it affect Red Hat Enterprise Linux](https://access.redhat.com/solutions/57665)。可使用`rpm -q --changelog openssh`查看其更新日志。 6 | 7 | # 依赖 8 | 9 | 具体版本参看站点上的readme。 10 | 11 | - openssl-devel openssl (如果从包管理器中安装的版本不符合要求,需要下载源码编译安装) 12 | - pam-devel 13 | - gcc 14 | - gcc-c++ 15 | - zlib-devel zlib zlib-static 16 | 17 | # 编译 18 | 19 | ## openssl 20 | 21 | **不要卸载原openssl,也不要将新编译的openssl的bin目录加入到`$PATH`**,只需要将新编译的openssl的lib加入到ld环境变量即可。 22 | 23 | 如果需要编译openssl,从https://www.openssl.org/下载源码。 24 | 25 | ```shell 26 | openssl_install_dir=/opt/openssl 27 | ./config --prefix=$openssl_install_dir --shared #如果不填加shared 在编译openssh中如果指定--with-ssl-dir会报错 28 | make -j 4 29 | make install #将安装到/usr/local/bin 30 | 31 | #需要将其写ld环境变量 以供后面编译openssh使用 32 | echo "$openssl_install_dir/lib" > /etc/ld.so.conf.d/openssl.conf 33 | ldconfig 34 | ``` 35 | 36 | ## openssh 37 | 38 | **不建议卸载原openssh。** 39 | 40 | 从https://www.openssh.com/站点下载ssh源码包。 41 | 42 | ```shell 43 | #对于自行编译openssl,可能需要指定openssl相关参数 44 | openssh_install_dir=/opt/openssh 45 | prefix="--prefix=$openssh_install_dir" 46 | ./configure $prefix --sysconfdir=/etc/ssh --with-ssl-dir=$openssl_install_dir --with-md5-passwords --with-pam 47 | chmod 600 /etc/ssh/ssh_host* #确保文件权限正确以保证后续make install 48 | make -j 4 49 | make install #将安装到/usr/local/bin 50 | ssh -V #查看版本。 51 | ``` 52 | 53 | 如果不指定prefix,其将安装到`/usr/local`下的目录中,无需再写入环境变量即可使用openssh相关命令。如果要移除编译的openssh,需要到`/usr/local/bin`删除相关文件(如ssh、scp、sftp等),到`/usr/local/sbin`删除`sshd`文件。 54 | 55 | 指定prefix为`/usr`,其将覆盖安装在原openssh所有文件(但不会覆盖`/etc/ssh`下已有配置文件)。可以通过包管理重新安装openssh快速还原成原来的openssh版本。 56 | 57 | # sshd服务的启动 58 | 59 | 编译安装完毕后,使用systemctl无法启动sshd服务(`/var/lib/systemd/system/sshd.service`),可使用以下方法解决: 60 | 61 | - 更改`sshd.service`的type为forking(原为`notify`),修改部分如下: 62 | 63 | ```shell 64 | Type=forking 65 | PIDFile=/var/run/sshd.pid 66 | ExecStart=/usr/sbin/sshd $SSHD_OPTS 67 | ``` 68 | 69 | - 不使用该sshd.service启动sshd服务,用其他方法保证其自启动,例如: 70 | 71 | - 在`/etc/rc.local`中添加`/usr/sbin/sshd`(注意需要赋予`/etc/rc.d/rc.local`可执行权限,`/etc/rc.local`是其软连接) 72 | 73 | - crontab添加任务 74 | 75 | ```shell 76 | @reboot /usr/sbin/sshd 77 | ``` 78 | 79 | - 为openssh打补丁,参看 [patch](https://salsa.debian.org/ssh-team/openssh/commit/fe97848e044743f0bac019a491ddf0138f84e14a)。 80 | 81 | 重新编译安装 82 | 83 | 84 | 85 | 如果prefix非`/usr`,安装完毕后,需要更新` /usr/lib/systemd/system/`下sshd相关文件中`sshd`的路径,例如默认编译安装位置为`/usr/local/sbin/sshd`(使用`which sshd`查看sshd的路径)。 86 | 87 | -------------------------------------------------------------------------------- /linux/network/ssh/dropbear-ssh-usage.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | dropbear是一款基于ssh协议的轻量sshd服务器。 4 | 5 | > **Dropbear**是由Matt Johnston所开发的[Secure Shell](https://zh.wikipedia.org/wiki/Secure_Shell)软件(包括服务端与客户端)。期望在存储器与运算能力有限的情况下取代[OpenSSH](https://zh.wikipedia.org/wiki/OpenSSH),尤其是[嵌入式系统](https://zh.wikipedia.org/wiki/嵌入式系统)[[1\]](https://zh.wikipedia.org/wiki/Dropbear#cite_note-official-1)。 6 | 7 | Dropbear实现了[SSH](https://zh.wikipedia.org/wiki/Secure_Shell)协议第二版(SSH-2)。加密算法则是采用了其他第三方的实现。因此openssh客户端可以访问dropbear服务端,dropbear客户端也可以访问openssh服务端。 8 | 9 | 10 | 11 | # dropbear与openssh 12 | 13 | dropbear与openssh类似功能角色程序对比: 14 | 15 | | 程序 | dropbear | openSSH | 16 | | -------- | ---------------------- | ---------- | 17 | | 服务端 | dropbear | sshd | 18 | | 客户端 | dbclient/dropbearmulti | ssh | 19 | | 密钥生成 | dropbearkey | ssh-keygen | 20 | | 复制 | scp | scp | 21 | 22 | 23 | 24 | # dropbear使用 25 | 26 | ## 生成密钥对 27 | 28 | 用`dropbearkey`生成私钥,再使用私钥生成公钥: 29 | 30 | ```shell 31 | #1. 私钥 32 | #dropbearkey -t -f [-s ] [-y] 33 | #-y Just print the publickey and fingerprint for the private key 34 | dropbearkey -t rsa -f id_dropbear #-s 2048 35 | 36 | #2. 公钥 37 | dropbearkey -f id_dropbear | grep "^ssh-rsa " > id_dropbear.pub 38 | ``` 39 | 40 | dbclient默认使用的私钥一般是`.ssh/id_dropbear`,具体情况可能有所不同,查看dbclient的帮助文件了解。 41 | 42 | 43 | 44 | openssh 客户端可使用ssh-copy-id上传公钥到dropbear服务器,dropbear客户端没有类似的程序,可以添加公钥内容到openssh服务器上用户的`~/.ssh/authorized_keys`中。 45 | 46 | 47 | 48 | ## dbcleint登陆 49 | 50 | dbclient支持一部分和ssh相同功能的参数,对比openssh,dbclient常用参数中不支持`-C`压缩数据传输, 51 | 52 | dbclient支持本地转发`-L`和远程转发`-R`,不支持动态转发`-D`。 53 | 54 | 55 | 56 | 注意:以上内容机遇文章写作时所了解的情况,具体应参照其使用文档。 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /linux/package-manager/buld-rpm-from-src.rpm.md: -------------------------------------------------------------------------------- 1 | .src.rpm包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有多种安装方法。 2 | 3 | 需要安装rpmbuild及其他相关依赖(如果缺少,rpmbuild操作会中断并提示)。 4 | 5 | 以下示例在x8_64的centos中构建test.src.rpm。 6 | 7 | - `rpmbuild -bb`构建 8 | 9 | ```shell 10 | pkg=test 11 | rpm -i $test*.src.rpm 12 | cd ~/rpmbuild/SPECS 13 | rpmbuild -bb $test*.spec 14 | cd ../RPM/x86_64 15 | yum install *.rpm 16 | ``` 17 | 18 | - `rpmbuild -bp` 编译 19 | 20 | ```shell 21 | pkg=test 22 | rpm -i $test.*src.rpm 23 | cd ~/rpmbuild/SPECS 24 | rpmbuild -bp $test*.spec 25 | cd ../BUILD/ 26 | #根据需求自行编译 27 | ./configure 28 | make 29 | make install 30 | ``` 31 | 32 | `rpmbuild -bp`及以后步骤不同于`rpmbuild -bb`方法,这里的p是patch,b是binary,bp方式自行编译可以在configure中添加各种参数以自定义相关安装选项。 33 | 34 | - 解开源码包直接编译 35 | 36 | ```shell 37 | pkg=test 38 | #1. rpm2cpio解开 39 | rpm2cpio $pkg.src.rpm | cpio -id 40 | 41 | #2.根据不同压缩包类型解开 42 | #tarx zjvf $pkg.tar.gz 43 | 44 | #3.进入到解压的文件夹中进行编译# 45 | cd $test 46 | ./cofigure 47 | make && make install 48 | ``` 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /linux/package-manager/deb-mirror本地源.md: -------------------------------------------------------------------------------- 1 | 1. 将deb包存放到指定目录中,例如`/srv/debs` 2 | 3 | 2. 在deb包存放目录中生成Packages文件(该文件包含软件包信息,如包名,md5等) 4 | 5 | 3. 在`/etc/apt/source.list.d/`下添一个后缀为`.list`文件,指定本地镜像源等位置,格式: 6 | 7 | ```shell 8 | #deb [trusted=yes] deb包存放目录的父目录的uri deb目录/ 9 | deb [trusted=yes] file:///srv debs/ 10 | #deb [trusted=yes] http:/// debs/ #此debs目录存放在web根目录下 11 | ``` 12 | 13 | `[trusted=yes]`信任该源,否则还需要生成gpg密钥。 14 | 15 | deb包存放目录的父目录的uri可以是本地路径(以`file://`开始)或其他网络协议的路径(例如`http://127.0.0.1:8000`) 16 | 17 | 18 | 19 | --- 20 | 21 | ```shell 22 | mirror_dir=/srv/mirror/ubuntu2004/ 23 | 24 | apt-get install dpkg-dev 25 | 26 | cd $mirror_dir 27 | apt-ftparchive packages . > Packages 28 | apt-ftparchive release . > Release 29 | #gpg gen-key 30 | #gpg --clearsign -o InRelease Release 31 | #gpg --armor --detach-sign -o Release.gpg Release # 生成 Release.gpg 32 | #gpg --clearsign -o InRelease Release # 生成 InRelease 33 | chown -R _apt $mirror_dir 34 | 35 | echo "deb [trusted=yes] file://$mirror_dir /" > /etc/apt/source.list.d/debs.list 36 | apt-get update 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /linux/package-manager/flatpak-packge-building.md: -------------------------------------------------------------------------------- 1 | # 安装环境 2 | 3 | 1. 安装flatpak和flatpak-builder 4 | 5 | 2. 安装SDK和基本运行库 6 | 7 | `//` 后的数字为要安装的sdk版本,也可以不使用`//`及后面的数字指定版本,而是根据交互提示选择安装。 8 | 9 | ```shell 10 | sudo flatpak install flathub org.gnome.Sdk//47 11 | sudo flatpak install flathub org.gnome.Platform//47 12 | 13 | sudo flatpak install flathub org.freedesktop.Sdk 14 | sudo flatpak install flathub org.freedesktop.Platform 15 | ``` 16 | 17 | 18 | 19 | # 构建flatpak程序 20 | 21 | ## 创建应用程序清单manifest 22 | 23 | 参看https://docs.flatpak.org/en/latest/dependencies.html 24 | 25 | 假如工作目录为`test-myapp`,app名字为`com.example.myapp`(参看官方文件的建议命名方式): 26 | 27 | ```shell 28 | mkdir test-myapp 29 | cd test-myapp 30 | touch com.example.myapp.yml #清单文件 31 | ``` 32 | 33 | 编辑清单文件,内容示例: 34 | 35 | ```yaml 36 | app-id: com.example.MyApp 37 | runtime: org.freedesktop.Platform 38 | runtime-version: '24.08' #flatpak list --runtime查看运行时 39 | sdk: org.freedesktop.Sdk 40 | command: myapp 41 | 42 | sdk-extensions: 43 | - org.freedesktop.Sdk.Extension.golang 44 | 45 | build-options: 46 | env: 47 | - GOBIN=/app/bin 48 | - GOROOT=/usr/lib/sdk/golang 49 | - PATH=/usr/lib/sdk/golang/bin:/usr/bin:/bin 50 | - GOPATH=/run/build/myapp/go 51 | 52 | finish-args: 53 | # 网络访问 54 | - --share=network 55 | - --share=ipc 56 | # 图形界面 57 | - --socket=x11 58 | - --socket=wayland 59 | # 音频 60 | - --socket=pulseaudio 61 | # 文件系统访问 62 | - --filesystem=home 63 | - --filesystem=xdg-documents 64 | # D-Bus 访问 65 | - --system-talk-name=org.freedesktop.NetworkManager 66 | 67 | modules: 68 | - name: myapp 69 | buildsystem: simple 70 | build-commands: 71 | #按实际构建程序的方式一行行编写命令 72 | #- cd $FLATPAK_BUILD_DIR/myapp 73 | #- go build 74 | # ... 其他命令 75 | # 添加桌面文件 76 | - install -Dm644 com.example.myapp.desktop /app/share/applications/com.example.myapp.desktop 77 | # 添加图标 78 | - install -Dm644 icon.png /app/share/icons/hicolor/256x256/apps/com.example.MyWailsApp.png 79 | sources: 80 | - type: dir 81 | path: /path/to/your/source/directory 82 | dest: myapp 83 | - type: file 84 | path: com.example.myapp.desktop 85 | - type: file 86 | path: icon.png 87 | # - type: git #如果使用git 88 | # url: https://github.com/example/myapp.git 89 | # tag: v1.0.0 90 | ``` 91 | 92 | 93 | 94 | ## 构建程序 95 | 96 | ```shell 97 | # 首次构建 98 | flatpak-builder build-dir /path/to/test-myapp --force-clean 99 | 100 | # 测试运行 101 | flatpak-builder --user --install --force-clean build-dir com.example.MyApp.yml 102 | flatpak run com.example.MyApp 103 | 104 | # 安装并测试 105 | flatpak-builder --user --install --force-clean build-dir com.example.MyApp.yml 106 | flatpak run com.example.MyApp 107 | 108 | # 验证包内容 109 | flatpak info com.example.MyApp 110 | ``` 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /linux/package-manager/rpm本地源.md: -------------------------------------------------------------------------------- 1 | 将某个目录(已经包含repodata信息)作为软件源,编写对应的repo文件,文件中的地址信息指向该软件源目录即可。 2 | 3 | 4 | 5 | 本地源的软件包一般来源: 6 | 7 | - 发行版的系统镜像文件 8 | - 同步自公共源 9 | - 自行添加的软件包 10 | 11 | 12 | 13 | ## ISO镜像创建源 14 | 15 | 挂载iso系统镜像文件(例如centos的everything镜像文件含有大量软件包),假如iso为`~/centos.iso`,挂载到`/srv/repo/iso`: 16 | 17 | ```shell 18 | mkdir -p /srv/repo/os 19 | mount -o loop ~/centos.iso /srv/repo/os 20 | #/etc/fstab 21 | #/srv/repo/centos.iso /srv/repo/os iso9660 defaults 0 0 22 | ``` 23 | 24 | 在`/etc/yum.repos.d/`创建repo文件,如os.repo,内容: 25 | 26 | ```shell 27 | [os] 28 | name=os 29 | baseurl=file:///srv/repo/os 30 | gpgcheck=0 31 | enabled=1 32 | ``` 33 | 34 | 如果要提供给其他服务器使用,可使用http、nfs等提供,参看下文rpm包软件源。 35 | 36 | 37 | 38 | 刷新源的缓存信息: 39 | 40 | ```shell 41 | yum clean all #清除原有repo缓存 42 | yum makecache #更新repo缓存 43 | ``` 44 | 45 | 如果使用本地源而不连接外网,(CentOS)系统自带的repo无法使用,应当将这些repo文件移除(或修改扩展名,只有`.repo`结尾的文件才被使用)。 46 | 47 | 48 | 49 | ## 同步公共镜像源 50 | 51 | 1. 安装rsync 52 | 53 | 2. 同步源软件源 54 | 55 | 这里以[中国科技大学开源软件镜像](https://mirrors.ustc.edu.cn/)站——https://mirrors.ustc.edu.cn/为例(参看中科大源[同步方法与注意事项](https://mirrors.ustc.edu.cn/help/rsync-guide.html)),将公共镜像源同步到`/srv/repo`下: 56 | 57 | ```shell 58 | rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/7.5.1804/ /srv/repo/ 59 | ``` 60 | 61 | 如果不想同步所有的文件夹,可以使用排除参数: 62 | 63 | ```shell 64 | rsync -avz --exclude 'isos' rsync://rsync.mirrors.ustc.edu.cn/repo/centos/7.5.1804/ /srv/repo/ 65 | ``` 66 | 67 | 如果要排除多个目录,可以指定一个排除文件 68 | 69 | ```shell 70 | rsync -avz --exclude-from=./exclude.list 'isos' rsync://rsync.mirrors.ustc.edu.cn/repo/centos/7.5.1804/ /srv/repo/ 71 | ``` 72 | 73 | 排除文件`exclude.list`示例: 74 | 75 | ```shell 76 | EFI 77 | LiveOS 78 | images 79 | isolinux 80 | CentOS_BuildTag 81 | EULA 82 | GPL 83 | ``` 84 | 85 | 如果只想同步某些目录,使用包含参数`—include`和`--include-from`,使用类似上面所述排除方法。 86 | 87 | 88 | 89 | ## rpm包软件源 90 | 91 | 下载rpm包存放到指定目录,将该目录设置为软件源。 92 | 93 | 建立一个文件夹如`/srv/repo/rpms`,将软件包放到该目录下。 94 | 95 | 使用`createrepo`工具生成rpm包信息,存放到软件源根目录下的repodata子目录中信息: 96 | 97 | ```shell 98 | #createrepo <目录名> 99 | createrepo -v --basedir /srv/repo/rpms -d /srv/repo/rpms 100 | #或cd到rpms 执行createrepo . 亦可 101 | ``` 102 | 103 | *createrepo会递归读取软件源目录的所有层级子目录的rpm信息,因此不必将所有rpm均放到软件源根目录下,可 创建子目录存放方便管理。* 104 | 105 | 当添加新的rpm包时,可使用`--update`参数更新信息文件: 106 | 107 | ```shell 108 | createrepo -v --update /srv/repo/rpms 109 | ``` 110 | 111 | 在`/etc/yum.repos.d`目录下创建repo文件,如rpms.repo: 112 | 113 | ```shell 114 | [os] 115 | name=os 116 | baseurl=file:///srv/repo/rpms 117 | gpgcheck=0 118 | enabled=1 119 | ``` 120 | 121 | 122 | 123 | 该软件源如果要通过网络协议让其他主机使用,可以搭建网络服务器(如http服务器、nfs服务器),确保该软件源目录可被其他主机以相关网络协议访问。 124 | 125 | 例如搭建web服务器,使用http协议为其他主机提供自建的软件源服务,其监听9999端口,`/srv`为web服务的根目录,那么`/srv/repo/rpms`的地址即是:`http://192.168.0.1:9999/repo/rpms`,将repo文件中的baseurl改为该地址,然后将该文件存放到其他服务器的`/etc/yum.repos.d`目录即可。 126 | 127 | ```shell 128 | [os] 129 | name=os 130 | baseurl=http://192.168.0.1:9999/repo/rpms 131 | gpgcheck=0 132 | enabled=1 133 | ``` 134 | 135 | 提示:可使用darkhttpd、webfs、caddy这类简单的工具实现。 136 | 137 | 138 | 139 | # repo文件 140 | 141 | 软件源信息的文件位于`/etc/yum.repos.d`下,扩展名为`.repo`,文件内容示例: 142 | 143 | ```shell 144 | [local-repo] #软件源名称 在该系统中 此名应该唯一 145 | name=$releasever local repo #软件仓库的名称 146 | baseurl=file:///srv/repo #软件源地址 147 | enabled=1 #是否启用 启用1 不启用0 148 | gpgcheck=0 #gpg校验 校验1 不校验0 149 | ``` 150 | 151 | - baseurl支持4重格式: 152 | - 本地路径 `file:///路径` 153 | 154 | 同时使用多个路径以空格隔开,例如在`mnt`下有`dvd1`和`dvd1`两个目录作为软件源: 155 | 156 | ```shell 157 | baseurl=file:///mnt/dvd1 file:///mnt/dvd2 158 | ``` 159 | 160 | - http(s)协议地址 `https://地址` 161 | 162 | - ftp协议地址 `ftp://地址` 163 | 164 | - rsync协议 `rsync://地址` 165 | 166 | 167 | - path代表baseurl值下面的子路径 168 | 169 | 如果baseurl已经描述完整了路径,也可以省略path值。 170 | -------------------------------------------------------------------------------- /linux/pve/pve-tips.md: -------------------------------------------------------------------------------- 1 | # lxc容器无法联网 2 | 3 | archlinux特权容器开启嵌套才可以联网,或者使用无特权容器。 4 | 5 | 6 | 7 | # 挂载宿主机目录到lxc容器 8 | 9 | 注意:挂载的目录只能读。 10 | 11 | 然后按以下方法之一映射pve的目录到容器中: 12 | 13 | 14 | 15 | 命令行设置: 16 | 17 | ```shell 18 | pct set -mp ,mp= 19 | ``` 20 | 21 | 22 | 23 | 或者 24 | 25 | 26 | 27 | 编辑lxc配置文件: 28 | 29 | `/etc/pve/lxc/.conf`,加上: 30 | 31 | ```shell 32 | lxc.mount.entry: /pve_mount_point lxc_mount_point none rw,bind 0 0 33 | ``` 34 | 35 | 36 | 37 | 如果需要用户映射: 38 | 39 | 获取lxc中用户的uid、gid(一般为1000,1000),获取PVE与LXC中uid、gid映射起始值 40 | > cat /var/lib/lxc/your_lxc_id/config | grep idmap > 17:41.49 Wed Jan 26 2022 >>> 41 | > lxc.idmap = u 0 100000 65536 42 | > lxc.idmap = g 0 100000 65536 43 | 44 | mount命令中的uid、gid 等于 lxc 容器中uid、gid (即1000,1000)加上 pve与lxc映射值(即100000,100000)等于 101000,101000 -------------------------------------------------------------------------------- /linux/remote-desktop/xrdp.md: -------------------------------------------------------------------------------- 1 | [xrdp](https://www.xrdp.org) 2 | 3 | > xrdp provides a graphical login to remote machines using RDP (Microsoft Remote Desktop Protocol). xrdp accepts connections from variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, macOS, iOS and Android). 4 | 5 | **xrdp**是一个守护进程,支持 Microsoft 的RDP协议,使用 Xvnc 或 xorgxrdp 作为其后端。 6 | 7 | 参考[archlinux-wiki:xrdp](https://wiki.archlinuxcn.org/wiki/Xrdp) 8 | 9 | # 安装 10 | 11 | 安装xrdp,启动xrdp守护进程。 12 | 13 | xrdp默认使用TCP 3389端口。 14 | 15 | 16 | 17 | 另外还必须安装以下之一作为后端: 18 | 19 | ## Xvnc后端 20 | 21 | xrdp将启动一个Xvnc会话,需要安装一种VNC的server端实现,例如tigervnc,turbovnc。 22 | 23 | 24 | 25 | ## xrdp后端 26 | 27 | [xorgxrdp](https://www.xrdp.org/)是xrdp项目的一部分,一般在Linux发行版中包名即为xorgxrdp,另外也可以通过为英特尔和AMD GPU安装xorgxrdp-glamor以及为Nvidia GPU安装xorgxrdp-nvidia来启用OpenGL和Vulkan图形加速。 28 | 29 | 30 | 31 | xrdp将启动一个X11会话,相比vnc后端,其支撑声音传输,如果要启用声音支持,安装pulseAudio和[pulseaudio-module-xrdp](https://github.com/neutrinolabs/pulseaudio-module-xrdp)。 32 | 33 | 一些Linux发行版中可能需要额外安装xinit程序,其包名类似`xorg-xinit`,因为该包可能不是桌面或窗口管理器的必要依赖,并未随前者一并安装。 34 | 35 | > The **xinit** program allows a user to manually start an [Xorg](https://wiki.archlinux.org/title/Xorg) display server. 36 | 37 | 38 | 39 | # 配置 40 | 41 | 以从Linux的包管理器安装xrdp为例,其配置文件目录一般为`/etc/xrdp`, 42 | 43 | - 主要配置文件 44 | 45 | - `xrdp.ini` 46 | 47 | xrdp sever的配置文件。 48 | 49 | 提示:一些发行版安装xrdp后默认使用Xvnc后端,配置文件中`[Xorg]`配置内容被注释,使用xorgxrdp后端需要将这些行的注释符去掉。 50 | 51 | 52 | 53 | - `sesman.ini` 54 | 55 | xrdp-sesman(xrdp session manager)的配置文件,定义xrdp会话的相关参数。 56 | 57 | 可在根据需要修改指定的VNC/Xorg后端程序路径及它们的运行参数: 58 | 59 | ```shell 60 | param=Xorg 61 | ; Leave the rest parameters as-is unless you understand what will happen. 62 | param=-config 63 | param=xrdp/xorg.conf 64 | param=-noreset 65 | param=-nolisten 66 | param=tcp 67 | param=-logfile 68 | param=.xorgxrdp.%s.log 69 | 70 | [Xvnc] 71 | param=/opt/TurboVNC/bin/Xvnc 72 | param=-bs 73 | param=-nolisten 74 | param=tcp 75 | param=-localhost 76 | param=-dpi 77 | param=96 78 | ``` 79 | 80 | 81 | 82 | - 允许任何人启动X服务器 83 | 84 | 在一些发行版中如果普通用户使用xorg模式连接后无法启动桌面环境,在 `/etc/X11/Xwrapper.config` 添加: 85 | 86 | ```shell 87 | allowed_users=anybody 88 | needs_root_rights=no 89 | ``` 90 | 91 | 92 | 93 | - xinit配置 94 | 95 | 成功启动显示服务器后,*xrdp* 将默认执行`sesman.ini`中的`[globals]`小节定义的`DefaultWindowManager`对应的脚本,一般为 `startwm.sh`(具体路径查看包安装详情)。 96 | 97 | 该脚本使用xinit启动Xorg 显示服务,该脚本一般会读取尝试先用户家目录的xinit脚本`~/.xinitrc`,如果找不到就读取一些全局xinit脚本(例如` /etc/X11/xinit/Xsession`,` /etc/X11/xinit/xinitrc`)和,具体可以查看该脚步的`wm_start()`函数。 98 | 99 | 100 | 101 | 由于不同Linux发行版可能有不同的xinit启动脚本实现,具体需要阅读`startwm.sh`脚本内容。 102 | 103 | 104 | 105 | 另可参考[archlinux-wiki: xinit](https://wiki.archlinux.org/title/xinit)自行编写启动脚本启动Xorg服务,容示例: 106 | 107 | ```shell 108 | #!/bin/bash 109 | session=${1:-xfce} 110 | 111 | case $session in 112 | xfce | xfce4) 113 | # which xrdb &>/dev/null && xrdb -merge ~/.Xresources 114 | session=startxfce4 115 | ;; 116 | gnome) 117 | export XDG_SESSION_TYPE=x11 118 | export GDK_BACKEND=x11 119 | session=gnome-session #gnome-session-classic 120 | ;; 121 | kde* | plasma*) 122 | export DESKTOP_SESSION=plasma 123 | session=startplasma-x11 124 | ;; 125 | i3 | i3wm) 126 | session=i3 127 | ;; 128 | *) session=$1 ;; 129 | esac 130 | 131 | if [[ -z $(command -v $session) ]]; 132 | then 133 | echo "$session not found" > ~/start-xrdp.err 134 | exit 1 135 | fi 136 | 137 | echo "$session" >~/.xsession 138 | 139 | unset SESSION_MANAGER 140 | unset DBUS_SESSION_BUS_ADDRESS 141 | 142 | exec dbus-launch "$session" 143 | ``` 144 | 145 | 146 | 147 | # 连接 148 | 149 | 使用RDP客户端连接即可,如: 150 | 151 | - windows:mstsc即系统内置的远程桌面连接程序 152 | - MacOS:[windows remote desktop](https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-mac) 153 | - Linux:Remmina vinagre 154 | 155 | 提示:RDP默认端口为3389,默认端口一般无需额外指定。 156 | 157 | 158 | 159 | # 问题解决 160 | 161 | - 如果连接xrdp失败,可以查看用户家目录下的` .xorgxrdp.10.log`日志文件 162 | - 连接成功但是黑屏 163 | - 缺少xorg相关包(xorg-X11-xinit,xorg-x11-xauth等等) 164 | - 连接虚拟机中的vnc黑屏,尝试调整虚拟软件的设置中图形设置相关选项,可以关掉3D渲染 165 | -------------------------------------------------------------------------------- /linux/system-maintain/IPMI.md: -------------------------------------------------------------------------------- 1 | IPMI是智能型平台管理接口(Intelligent Platform Management Interface)是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准。 2 | 3 | > IPMI 信息通过基板管理控制器 (BMC)(位于 IPMI 规格的硬件组件上)进行交流。使用低级硬件智能管理而不使用操作系统进行管理。 4 | 5 | 6 | 7 | 安装`ipmitool`工具,重启后会自动加载ipmi相关模块,或者手动加载相关模块: 8 | 9 | ```shell 10 | modprobe ipmi_watchdog 11 | modprobe ipmi_poweroff 12 | modprobe ipmi_devintf 13 | modprobe ipmi_msghandler 14 | modprobe ipmi_si 15 | ``` 16 | 17 | 加载后即可使用ipmitool命令,例如获取硬件信息 18 | 19 | ```shell 20 | ipmitool sdr 21 | ``` 22 | 23 | # IMPI远程管理配置 24 | 25 | 1. 确在BIOS中已经启用IPMI over LAN功能。 26 | 27 | 2. 设置impi网络参数 28 | 29 | 3. 假如该设备目前IP为192.168.1.10,网关为192.168.1.1,则为其配置一个该网段中未被分配使用的IP,示例: 30 | 31 | ```shell 32 | ipmitool lan print #查看配置信息 33 | ipmitool lan print [数字] #从0开始一个一个试 找到该设备上默认的ipmi的channel值 34 | ipmitool lan set 1 ipaddr 192.168.0.100 #IP #这里假设channel时1 下同 35 | ipmitool lan set 1 netmask 255.255.255.0 #子网掩码 36 | ipmitool lan set 1 defgw ipaddr 192.168.0.1 #网关 37 | ipmitool lan set 1 access on #启用 (off为关闭) 38 | ``` 39 | 40 | 更多`ipmi`命令可在输入`ipmitool`回车后查看,在`ipmitool lan`回车后可查看配置LAN控制相关命令。 41 | 42 | - 设置管配置理用户 43 | 44 | ```shell 45 | ipmitool user list 1 #查看当前用户列表 46 | ipmitool user set name #修改用户名 47 | ipmitool user set password #设置admin密码 执行后输入两次新密码 48 | ``` 49 | **注意**:密码可能有位数要求(一般最少8位),密码过短会返回错误信息。 50 | 51 | 更多命令帮助,在`ipmitool user`回车后可查看。 52 | 53 | 常见服务器厂商IPMI(带外管理)默认管理员用户信息(以/分隔用户名密码): 54 | 55 | - DELL戴尔 iDRAC 56 | - root/calvin 57 | - Inspur浪潮 58 | - root /superuser 59 | - H3C新华三 HDM 60 | - admin/Password@_ 61 | - Huawei华为 62 | - root/Huawei12#$ 63 | - HPE慧与(惠普) iLO 64 | - Administrator/密码在服务器的信息卡片或标签上 65 | - Sungon曙光 66 | - admin/admin 67 | - Lenovo联想 68 | - lenovo/len0VO 69 | 70 | 71 | 72 | ## ipmitool常用操作 73 | 74 | ```shell 75 | #查看本机 76 | ipmitool sdr #查看传感器信息Sensor Data Repository 77 | 78 | #远程控制 79 | #power status 80 | ipmitool -H 192.168.0.100 -U admin -P power status #会返回power is on 81 | 82 | #power on/off 83 | ipmitool -H -U -P power on #off 84 | 85 | #boot via PXE 86 | ipmitool -H -U -I lanplus -P chassis bootdev pxe 87 | ``` 88 | 89 | ​ 远程控制使用`-H`制定地址,`-U`指定用户,`-P`指定用户密码。 90 | 91 | 92 | 93 | # WEB管理界面 94 | 95 | 浏览器开启https://你IPMI的IP地址(例如本文中为https://192.168.1.100),输入用户名和密码,即可登录web管理界面。 96 | 97 | 在web管理界面可以对设备进行电源管理、镜像挂载、固件升级、网络配置、设备实时画面查看等等操作,就如同身处该设备旁边一般。 98 | -------------------------------------------------------------------------------- /linux/system-maintain/arbtd.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | `'abrt-cli status' timed out`,检查: 4 | 5 | ```shell 6 | systemctl status abrtd 7 | 8 | ls -l ~/.cache/abrt #是否属于当前用户 9 | chown -R $USER ~/.cache/abrt 10 | ``` 11 | 12 | 13 | 14 | 关闭abrt服务: 15 | 16 | ```shell 17 | systemctl disable --now abrtd abrt-oops 18 | ``` 19 | 20 | 21 | 22 | 配置优化abrt日志空间占用: 23 | 24 | ```shell 25 | #限制ABRT日志总空间占用,以MB为单位。超过限制则自动删除旧日志 26 | MaxCrashReportsSize = 256 27 | #是否记录非应用包中的执行指令的错误信息 28 | ProcessUnpackaged = no 29 | #是否在dump中包含完整的二进制镜像信息 30 | SaveBinaryImage = no 31 | ``` 32 | 33 | -------------------------------------------------------------------------------- /linux/system-maintain/cgroup-资源限制.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | **cgroups (Control Groups)**: Linux内核功能,用于限制、记录和隔离进程组的资源使用。 4 | 5 | cgroup可以对不同资源控制器进行限制,如cpu, memory, blkio, devices 等。 6 | 7 | 版本: 8 | 9 | - v1: 传统版本,子系统可独立挂载 10 | - v2: 统一层级,更严格的组织结构 11 | 12 | | 特性 | cgroups v1 | cgroups v2 | 13 | | :--------: | :----------: | :--------------------: | 14 | | 层级结构 | 多独立层级 | 单一统一层级 | 15 | | 控制器挂载 | 可单独挂载 | 必须统一挂载 | 16 | | 内存控制 | memory子系统 | memory控制器直接集成 | 17 | | 默认启用 | 旧版系统默认 | 新版系统(如RHEL9+)默认 | 18 | 19 | 使用建议: 20 | 21 | - **新项目优先使用v2** 22 | 23 | - **关键服务设置MemoryHigh而非MemoryMax** (允许临时超限) 24 | 25 | - **容器环境**通常已自动配置cgroups 26 | 27 | - **生产环境**修改前充分测试 28 | 29 | > 注意:所有/sys/fs/cgroup下的修改重启后失效,需通过配置文件或systemd持久化 30 | 31 | 32 | 33 | # 临时修改 34 | 35 | 直接操作 `/sys/fs/cgroup/`下的文件即可。示例: 36 | 37 | 一些系统默认配置了一些cgroup控制器(如果cpu,memory)可直接修改,参照下面的例子将其中的myapp_v1替换为实际的目录名字(如cpu)即可。 38 | 39 | ```shell 40 | # 查看已经挂载的cgroup 41 | mount |grep cgroup 42 | 43 | #--- cgroups v1 设置命令 44 | 45 | # 创建v1控制组 46 | mkdir -p /sys/fs/cgroup/{cpu,memory}/myapp_v1 47 | 48 | # CPU限制/修改(如果已经存在某个控制器,例如 49 | echo 100000 > /sys/fs/cgroup/cpu/myapp_v1/cpu.cfs_period_us # 100ms周期 50 | echo 50000 > /sys/fs/cgroup/cpu/myapp_v1/cpu.cfs_quota_us # 50ms配额=50%CPU 51 | echo 512 > /sys/fs/cgroup/cpu/myapp_v1/cpu.shares # CPU权重(默认1024) 52 | 53 | # 内存限制设置/修改 54 | echo "500M" > /sys/fs/cgroup/memory/myapp_v1/memory.limit_in_bytes # 物理内存 55 | echo "1G" > /sys/fs/cgroup/memory/myapp_v1/memory.memsw.limit_in_bytes # 内存+Swap 56 | 57 | # 添加进程到v1组 58 | echo $$ > /sys/fs/cgroup/cpu/myapp_v1/tasks 59 | echo $$ > /sys/fs/cgroup/memory/myapp_v1/tasks 60 | 61 | #--- cgroups v2 设置命令 62 | 63 | # 创建v2控制组 64 | mkdir /sys/fs/cgroup/myapp_v2 65 | 66 | # CPU限制设置/修改 (一般已经存在 67 | echo "50% 100000" > /sys/fs/cgroup/myapp_v2/cpu.max # 50%CPU(百分比格式) 68 | echo 500 > /sys/fs/cgroup/myapp_v2/cpu.weight # CPU权重(1-10000) 69 | 70 | # 内存限制设置/修改 71 | echo "500M" > /sys/fs/cgroup/myapp_v2/memory.max # 物理内存 72 | echo "1G" > /sys/fs/cgroup/myapp_v2/memory.swap.max # Swap内存 73 | 74 | # 添加进程到v2组 75 | echo $$ > /sys/fs/cgroup/myapp_v2/cgroup.procs 76 | ``` 77 | 78 | 79 | 80 | # 持久化配置 81 | 82 | ## cgroups v1 配置 83 | 84 | ### 配置文件 85 | 86 | ```shell 87 | # /etc/cgconfig.d/*.conf 示例 88 | group all_limits { 89 | cpu { 90 | cpu.shares = 1024; # CPU 相对权重(默认值) 91 | cpu.cfs_quota_us = 400000; # 限制 4 核(400000us/100000us) 92 | } 93 | memory { 94 | memory.limit_in_bytes = 8G; # 限制 8GB 内存 95 | memory.memsw.limit_in_bytes = 10G; # 限制 8GB RAM + 2GB Swap 96 | } 97 | } 98 | ``` 99 | 100 | 101 | 102 | 立即加载启用: 103 | 104 | ```shell 105 | cgconfigparser -l /etc/cgconfig.d/ 106 | ``` 107 | 108 | 109 | 110 | 手动挂载: 111 | 112 | ```shell 113 | mount -t cgroup -o cpu,cpuacct cpu /sys/fs/cgroup/cpu 114 | ``` 115 | 116 | 117 | 118 | 重启服务: 119 | 120 | ```shell 121 | systemctl restart cgconfig 122 | ``` 123 | 124 | 对于RHEL,需要安装有libcgroup-tools 125 | 126 | 127 | 128 | ### 用户级限制 129 | 130 | 配置`/etc/cgrules.conf`,添加类似内容: 131 | 132 | ```shell 133 | #排除限制的用户或用户组 134 | root:* * / 135 | user1:* * / 136 | @group1:* * / 137 | 138 | #其余用户受到前面配置的cgconfig.d/*.conf限制 139 | *:* cpu,memeory /all_limits 140 | ``` 141 | 142 | 重启服务生效: 143 | 144 | ```shell 145 | systemctl restart cgred 146 | ``` 147 | 148 | 149 | 150 | ## cgroups v2 配置 151 | 152 | ### 启用v2 153 | 154 | ```shell 155 | grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1" 156 | reboot 157 | ``` 158 | 159 | 160 | 161 | ### 使用systemd 集成 162 | 163 | ```shell 164 | # 服务限制 165 | systemctl set-property httpd.service CPUQuota=50% 166 | 167 | # 用户限制 168 | systemctl set-property user-1000.slice MemoryHigh=1.5G 169 | ``` 170 | -------------------------------------------------------------------------------- /linux/system-maintain/cpu-utilization-monitoring.md: -------------------------------------------------------------------------------- 1 | # 实时查看工具 2 | 3 | ## htop 4 | 5 | 彩色、交互式界面,支持鼠标操作 6 | 7 | ## top 8 | 9 | *按下 `1` 可展开所有核心的负载显示* 10 | 11 | ## mpstat(来自 sysstat) 12 | 13 | 展示每个核心的详细利用率,包括 user/system/idle 等状态 14 | 15 | 可用于脚本化采样分析: 16 | 17 | ```shell 18 | mpstat -P ALL 1 19 | ``` 20 | 21 | 22 | 23 | # 记录与分析工具 24 | 25 | ## sar(来自 sysstat) 26 | 27 | 记录系统资源历史数据(包括 CPU),可分析高峰负载、空闲率变化 28 | 29 | ```bash 30 | sar -u 1 5 # 每秒采样 5 次 CPU 使用情况 31 | sar -q 1 5 # -q 查看运行队列和负载 32 | sar -P ALL 1 3 # 每个逻辑核的 3 次采样 -P指定cpu,ALL代表全部cpu 33 | sar -q -r -u -n DEV 1 5 # 同时监控CPU、负载、内存、网络 34 | ``` 35 | 36 | 37 | 38 | ## pidstat 39 | 40 | 显示进程或线程级别的 CPU 使用率,可监控指定 PID 或全体进程 41 | 42 | ```bash 43 | pidstat -u -p ALL 1 44 | ``` 45 | 46 | 47 | 48 | ## dstat 49 | 50 | 支持实时显示每个核的 CPU 使用率,可以方便观察热点 51 | 52 | ```shell 53 | dstat -c -C 0-79 #查看CPU 0-79 54 | pidstat -w 1 #找出高上下文切换进程 55 | ``` 56 | 57 | 58 | 59 | ## 原始数据分析 60 | 61 | ### /proc/stat 62 | 提供系统总的 CPU 时间片信息,可用脚本计算利用率: 63 | 64 | ```bash 65 | cat /proc/stat 66 | ``` 67 | 68 | 69 | 70 | 读取 `cpu` 行的内容,使用 user、system、idle 时间的变化计算出 CPU 利用率。 71 | 72 | 伪代码: 73 | 74 | ```python 75 | def cpu_util(prev, curr): 76 | prev_idle = prev['idle'] + prev['iowait'] 77 | curr_idle = curr['idle'] + curr['iowait'] 78 | 79 | prev_total = sum(prev.values()) 80 | curr_total = sum(curr.values()) 81 | 82 | total_delta = curr_total - prev_total 83 | idle_delta = curr_idle - prev_idle 84 | 85 | usage = (1 - idle_delta / total_delta) * 100 86 | return usage 87 | ``` 88 | 89 | 90 | 91 | # 负载与利用率关系 92 | 93 | 在纯 CPU 密集型任务下,`load average ≈ CPU 总利用率 / 100` 94 | 95 | 可以使用`uptime`查看负载。 96 | 97 | 98 | 99 | 例如,在物理40 核心系统中: 100 | 101 | - load = 40 → 约 4000% CPU 利用率(即全部物理核满载) 102 | - load > 40 → 系统出现排队或任务抢核 103 | - 利用率超过 4000%,表示多个任务抢一个物理核,性能下降明显 104 | 105 | 106 | 107 | ## 核心数的参考原则 108 | 109 | - CPU 密集型任务通常需要独占一个物理核心 110 | - 超线程带来的逻辑线程仅能带来有限性能提升(10~30%) 111 | - HPC 调度器配置时,每个节点最多分配“物理核心数”个 CPU 密集型任务较为合理 112 | 113 | 114 | 115 | ## 选择指标的建议 116 | 117 | - CPU 密集型任务:优先看 load average,近似反映资源耗尽 118 | - IO 密集型或混合型任务:建议结合 CPU 利用率和 load 一起判断 119 | - 多进程任务:配合 `pidstat` 查看资源分布情况 120 | -------------------------------------------------------------------------------- /linux/system-maintain/forget-password-and-reset重置系统密码.md: -------------------------------------------------------------------------------- 1 | 如果忘记了root密码,也没有任何可用的具有sudo权限的用户,可使用以下方法重置密码。 2 | 3 | # LiveCD 4 | 5 | 1. 启动LiveCD 6 | 7 | 2. mount系统根分区,例如: 8 | 9 | ```shell 10 | mount -o /dev/sda2 /mnt 11 | ``` 12 | 13 | 3. 重置密码,可选择以下方法 14 | 15 | - passwd指定分区挂载点 16 | 17 | ```shell 18 | #passwd --root <根分区挂载点> 用户名 19 | passwd --root /mnt root 20 | ``` 21 | 22 | - chroot到根分区挂载点后直接修改 23 | 24 | ```shell 25 | chroot /mnt 26 | passwd 27 | ``` 28 | 29 | - 修改根分区挂载目录中的etc/passwd和etc/shadow文件 30 | 31 | 以root用户为例 32 | 33 | - 将passwd文件中root行第1个和第2个`:`间内容改成`x` 34 | - 将shadow文件中root行第1个和第2个`:`间内容删除 35 | 36 | 4. 卸载并正常重启 37 | 38 | 39 | 40 | # 单用户模式 41 | 42 | 1. 在grub引导界面,按下`e`修改选项(进入nano编辑器)。 43 | 44 | 2. 移动光标到包含`vmlinuz`的最后,添加空格,再添加`rd.break` 45 | 46 | 或者添加`init=/sysroot/bin/sh` 47 | 48 | 3. ctrl x完成修改,开始系统引导。 49 | 50 | 4. 进入系统后执行`mount -o remount,rw /sysroot` 重新挂载`/sysroot`以使其可写。 51 | 52 | 5. `chroot /sysroot` 更改根目录; 53 | 54 | 1. 修改密码 55 | 1. `passwd root`或者其他修改命令修改密码; 56 | 57 | 或清空`/etc/shadow`文件中root用户第二字段——第一个冒号和第二个冒号之间的内容。 58 | 59 | 2. `touch /.autorelabel` 开启了SELinux的情况下必须执行该步骤; 60 | 61 | 3. `exit`或ctrl d退出`chroot`; 62 | 63 | 4. `exit`或ctrl d或`reboot`重启系统。 -------------------------------------------------------------------------------- /linux/system-maintain/kernel.md: -------------------------------------------------------------------------------- 1 | # upgrade kernel 2 | 3 | ## debian 4 | 5 | ```bash 6 | source /etc/os-release 7 | 8 | echo "deb http://deb.debian.org/debian $VERSION_CODENAME-backports main" > /etc/apt/sources.list.d/backports.list 9 | apt update 10 | apt -t $VERSION_CODENAME-backports install linux-image-amd64 linux-headers-amd64 11 | ``` 12 | 13 | 14 | 15 | # kernel panic 16 | 17 | - 较新的cpu 18 | 19 | 尝试使用较新版本内核(甚至不稳定版) 20 | 21 | 22 | 23 | # kernel crash 24 | 25 | - kdump启动失败报错No memory reserved for crash kernel 26 | 27 | ```shell 28 | systemctl status kdump 29 | ``` 30 | 31 | > Starting Crash recovery kernel arming... 32 | > kdumpctl[913]: No memory reserved for crash kernel 33 | 34 | 提示没[为崩溃内核保留内存](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/kernel_administration_guide/kernel_crash_dump_guide),默认情况下crashkernel保留内存值为auto,也可将其修改为一个确切的值(如128M)。 35 | 36 | *值为auto时根据实际物理内存情况保留一些内存给kernelcrash用,在x86_64系统中内存大于等于2GB时会保留内存。最小保留内存计算方法:160 MB + 2 bits for every 4 KB of RAM。* 37 | 38 | 1. 修改`/etc/default/grub`的`GRUB_CMDLINE_LINUX`行中的`crashkernel`的值: 39 | 40 | ```shell 41 | GRUB_CMDLINE_LINUX="crashkernel=128M console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0" 42 | ``` 43 | 44 | 某些系统需要设置一定的保留内存偏移量,写法如下: 45 | 46 | ```shell 47 | crashkernel=128M@16M 48 | ``` 49 | 50 | 2. 重新生成grub 51 | 52 | ```shell 53 | grub-mkconfig -o /boot/grub/grub.cfg 54 | #某些发行版如centos中命令可能为grub2-mkconfig 55 | #grub2-mkconfig -o /boot/grub/grub.cfg 56 | ``` 57 | 58 | # lockup 59 | 60 | - cpu soft lockup 61 | 62 | ```shell 63 | echo 30 > /proc/sys/kernel/watchdog_thresh 64 | sudo sysctl -a|grep watchdog 65 | sysctl -w kernel.watchdog_thresh=30 66 | ``` 67 | -------------------------------------------------------------------------------- /linux/system-maintain/linux备份还原.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 重要配置文件的备份 4 | 5 | 仅备份重要配置文件,用于重建系统并安装相应软件后轻松还原配置。 6 | 7 | 备份配置文件,可以从以下路径下筛选需要备份的配置: 8 | **配置文件多以.conf或.ini或rc为文件名结尾** 9 | - 多数配置在用户目录的.config/下 10 | 11 | - 少数配置在家目录下 (如vim的配置文件~/.vimrc) 12 | 13 | - 某些配置在/etc目录下(对改动过的文件才有备份意义,如nginx的配置文件,*一般*是/etc/nginx.conf和/etc/nginx/conf.d/,包管理器的设置和源,sudoers,enviroment……) 14 | 15 | 其余位置**几乎**不需要备份配置。(当然根据具体情况而定,或许像grub主题文件/boot/grub/themes也有备份的需要) 16 | 17 | 备份文件时最保持原有的文件层级,方便还原。还原时复制相应的配置文件到相应的路径即可。 18 | 19 | # 整个系统的备份和还原 20 | 21 | 整个系统的备份,用于迁移系统。 22 | 23 | ## dd 24 | 25 | 使用dd复制整个硬盘:`dd if=/dev/sda of=/dev/sdb` 26 | if后面是要复制的位置,of后面是要写入的位置。dd命令使用无比小心确认写入位置,写入位置数据会被清空。 27 | 28 | 也可以加入sync参数来同步I/O,用bs参数指定block size(一个数据周期长度,理论上越大越快,但也有上限,设置了bs在进行还原时最好采用一致的值) `dd if=/dev/sda1 of=/dev/sdb bs=10M conv=noerror,sync` 29 | 30 | 使用dd复制分区并输出为镜像:`dd if=/dev/sda/ of=/dev/sdb/backup.img` 31 | 32 | dd还原系统时使用方法依然如上,if位置是备份所在位置,of位置是要写入的位置。 33 | 34 | ## tar 35 | 36 | - 备份整个系统(这里使用bzip进行压缩,还可使用gzip,后缀.gz): 37 | 38 | `tar dvpjf /path/backup.tar.bz2 /` 39 | 40 | 不过一些目录没有备份的必要,如/tmp、/media等等,可使用--exclude参数排除目录: 41 | 42 | `tar dvpjf /path/backup.tar.bz2 --exclude=/tmp --exclude=/media /` 43 | 44 | 也可以建立一个排除文件,例如名为exclude,里面写入要排除的目录,一行一个,例如排除以下目录(后面均以该排除目录做説明): 45 | 46 | > /proc/* 47 | > /dev/* 48 | > /sys/* 49 | > /run/* 50 | > /tmp/* 51 | > /mnt/* 52 | > /media/* 53 | > /var/* 54 | > /lost+found 55 | > /home/* 56 | > /boot/grub/grub.cfg 57 | > /etc/fstab 58 | > /root 59 | 60 | 建议排除用户家目录,家目录数据单独备份(到其他存储设备),因为家目录下可能排除目录太多比较麻烦,且家目录下存有**大量**用户数据(如音乐视频)的情况也不适合将其加进tar中,家目录中的配置文件(如.config)备份参考上文。当然家目录下的某些文件如firefox的插件文件等(在~/.mozilla)或许也有备份的必要。 61 | 62 | root目录一般没有多大备份的必要,除非经常使用root用户操作,其目录下有不少重要的配置文件。 63 | 64 | 65 | 66 | - tar利用排除文件进行备份示例: 67 | 68 | `tar cvpjf /path/backup.tar.bz2 --exclude-from=/path/exclude /` 69 | 70 | excludefile即是是排除列表 71 | 72 | ​ 73 | 74 | - 还原示例: 75 | 76 | `tar xvpjf /path/backup.tar.bz2 /mnt/` 77 | 78 | livecd中挂在根分区于/mnt;如果在系统中还原,则直接解压在/下。 79 | boot挂载于根分区的/boot。 80 | 81 | 还原后注意事项: 82 | - 更新fstab,执行`genfstab /etc/fstab`; 83 | 84 | - 该备份使用了lvm,故而更改过/etc/mkinitcpio.conf,其中的HOOKS=这一行中添加了lvm2,如不使用lvm,删除了mkinitcpio.conf中HOOKS一行的lvm2,需要执行`mkinitcpio -p linux`; 85 | 86 | - 更新grub(该文件已排除)`grub-config -o /boot/grub/grub.cfg`; 87 | 88 | - 还原备份的家目录下的配置文件(如在tar备份时排除了家目录)…… 89 | 90 | ​ 91 | 92 | 93 | -------------------------------------------------------------------------------- /linux/system-maintain/process进程管理.md: -------------------------------------------------------------------------------- 1 | # ps 2 | 3 | ps是查看进程(process)信息的命令。 4 | 5 | 该命令选项极多,这里仅介绍常用的UNIX风格短选项,另有BSD风格的选项,以及长选项。 6 | 7 | - 常用短选项 8 | - -e或-A 所有进程*(最常使用的选项,与其他选项配合)* 9 | - -f 或 -F 完整格式的输出 10 | - -l 详细进程信息(显示长列表) 11 | - -L 显示线程信息,列名为LWP(light weight process (thread) ID ,即tid或spid) 和 NLWP(number of LWP ) 12 | - -U 属于指定用户的进程 13 | - -G 属于指定用户组的进程 14 | - -p 指定进程编号的进程 15 | - -d 除控制进程外的进程 16 | - -a 除控制进程和无终端进程外的进程 17 | - -u 指定用户 18 | - -o 指定特别的选项 19 | 20 | 不带任何参数时使用该命令仅显示当前控制台下属于当前用户的进程信息,显示的各列信息: 21 | 22 | - PID 进程的编号 23 | - TTY 启动进程的终端(?表示没有使用终端,即无终端进程) 24 | - TIME 运行进程耗费的CPU时间 25 | - CMD 启动该进程的程序名称(command) 26 | 27 | `-f`选项额外显示的各列信息: 28 | 29 | - UID 启动进程的用户 30 | - PPID 父进程的编号(parent PID) 31 | - C 进程生命周期中的CPU利用率 32 | - STIME 进程启动时的系统时间(star time) 33 | 34 | `-l`选项额外显示的各列信息: 35 | 36 | - F 内核分配给进程的系统标记(flag) 37 | 38 | - S 进程的状态(status) 39 | 40 | 各种状态: 41 | 42 | - D 不可中断的睡眠(Uninterruptable sleep) *一般是处于IO状态* 43 | - R 正在运行 44 | - S 中断睡眠(interruptable sleep) *进程等待某个资源处* 45 | - T 停止(terminated) 46 | - X 终止的进程 47 | - Z “僵尸”(zombie) 48 | - N 低优先级 49 | - L 锁定 50 | - s 包含子进程 51 | - `+` 位于后台进程组 52 | 53 | - PRI 进程的优先级(priority) 54 | 55 | - NI 谦让度(nice) 该值用来参与决定优先级 56 | 57 | - ADDR 内存地址 58 | 59 | - SZ 假如有进程被换出,表示所需交换空间大小(size) 60 | 61 | - WCHAN 进程休眠的内核函数的地址 62 | 63 | 常用示例: 64 | 65 | ```shell 66 | ps -efL 67 | ps -up pid1,pid2 #查看指定pid 68 | ps -eo command,user,pid,ppid,comm root 69 | 70 | #指定参数查看 71 | ps -eo user,euser,ruser,pid,ppid,comm,command,vsz,rsz 72 | ps -o user=userForLongName -e -o pid,ppid,cmd 73 | ``` 74 | 75 | `-o`参数: 76 | 77 | - 用户相关 78 | 79 | - user和euser 相同意义,代表(改运行文件的)有效权限用户 80 | - euid=uid,egid=gid 81 | - ruser代表真正执行用户。 82 | - ruid和rgid 83 | 84 | userForLongName 显示长用户名,避免用户名过长显示不全时省略部分显示为+ 85 | 86 | - 命令相关 87 | 88 | - cmd作用等同于command和args,代表执行的完整命令,包括选项参数。 89 | - comm是command name,只显示命令不显示其选项参数。 90 | 91 | - 进程 92 | 93 | - pid即process id 94 | - ppid即parent pid 95 | 96 | - cpu相关 97 | 98 | - %cpu=c, processor utilization. 99 | - etime,elapsed time since the process was started,in the form [[DD-]hh:]mm:ss. 100 | - etimes,elapsed time since the process was started, in seconds. 101 | 102 | - 内存空间相关 103 | 104 | - %mem=pmem,ratio of the process's resident set size(percentage) 105 | - sz, size in physical pages of the core image of the process 106 | - rss=rssize=rsz,resident set size, the non-swapped physical memory that a task has 107 | 108 | used (in kiloBytes) 109 | 110 | 111 | 112 | 113 | 114 | # pgrep 115 | 116 | 117 | 118 | # kill killall pkill 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | # lsof 127 | 128 | 129 | 130 | # fuser 131 | 132 | 133 | 134 | 135 | 136 | # top 137 | 138 | 另有htop,界面直观,操作方便。 139 | 140 | top是实时监控进程信息的命令。 141 | 142 | s – 改变画面更新频率 143 | l – 关闭或开启第一部分第一行 top 信息的表示 144 | t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示 145 | m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示 146 | N – 以 PID 的大小的顺序排列表示进程列表 147 | P – 以 CPU 占用率大小的顺序排列进程列表 148 | M – 以内存占用率大小的顺序排列进程列表 149 | h – 显示帮助 150 | n – 设置在进程列表所显示进程的数量 151 | q – 退出 top 152 | s – 改变画面更新周期 -------------------------------------------------------------------------------- /linux/system-maintain/ssd固态硬盘优化.md: -------------------------------------------------------------------------------- 1 | 固态硬盘优化技巧 2 | 3 | [TOC] 4 | 5 | # 禁用文件系统日志 6 | 7 | 一般**不建议**。**明显缺点是非正常卸载分区(即断电后,内核锁定等)会造成数据丢失。** 8 | 9 | # 分区对齐 10 | 11 | 如今各大发行版几乎在分区的时候都用了4k对齐。对齐检查: 12 | 13 | ```shell 14 | parted /dev/sda 15 | align-check optimal 1 16 | ``` 17 | 使用图形界面的`gaparted`可以调整对齐。 18 | 19 | # TRIM 20 | 21 | TRIM支持的文件系统:Ext4、Btrfs、JFS、VFAT,XFS。*VFAT 只有挂载参数为'discard'(而不是fstrim)时才支持 TRIM 。* 22 | 23 | TRIM需`utils-linux`包。 24 | 25 | 可用以下方法检查是否支持trim: 26 | 27 | - `lsblk --discard` 28 | 29 | DISC-GRAN (discard granularity) 和 DISC-MAX (discard max bytes) 列非 0 表示该 SSD 支持 TRIM 功能。 30 | 31 | - `cat /sys/block/sda/queue/discard_granularity` 32 | 33 | 值非0表示支持TRIM。 34 | 35 | - `hdparm -I /dev/sda | grep TRIM` (需要安装有hdparm包) 36 | 37 | 得到类似信息 * Data Set Management TRIM supported (limit 1 block)。有几种TRIM支持的规格,因此,输出内容取决于驱动器支持什么。 38 | 39 | 40 | 41 | 手动trim,示例: 42 | 43 | ```shell 44 | fstrim -v /home #对home分区执行trim 45 | fstrim -v / 46 | ``` 47 | 48 | 通过挂载参数`discard`自动trim,示例: 49 | 50 | ```shell 51 | /dev/sda1 / ext4 defaults,noatime,discard 0 1 52 | /dev/sda2 /home ext4 defaults,noatime,discard 0 2 53 | ``` 54 | 55 | 使用systemd的系统启用`fstrimer.timer`即可开启每周一次的自动trim任务: 56 | 57 | ```shell 58 | systemctl enable fstrim.timer 59 | ``` 60 | 61 | # swapiness 62 | 63 | 将swapiness的值改低(如1到10)会减少内存的交换,从而提升一些系统上的响应度。 64 | 65 | ```shell 66 | cat /proc/sys/vm/swappiness #检查swappiness值 67 | sysctl vm.swappiness=5 #临时设置为5 68 | ``` 69 | 为了长久保存设置可新建一个`/etc/sysctl.d/99-sysctl.conf`文件,修改swappiness为5: 70 | 71 | ```shell 72 | vm.swappiness=5 73 | vm.vfs_cache_pressure=50 74 | ``` 75 | # 设置频繁读取的分区 76 | 77 | ## 频繁读取的分区放置于HDD 78 | 79 | 如单独设置`/var`分区,挂载于HDD上而不是SSD上。 80 | 81 | ## tmpfs--挂载到内存 82 | 83 | 使用tmpfs将频繁读取的文件置于内存。 84 | 85 | - 内存剩余比例没有少于swappiness规定的百分比时,linux不会去用交换区。 86 | - `df -h`可查看使用tmpfs的情况。 87 | 88 | ### 修改tpmfs分配大小 89 | 90 | 如今许多发行版默认对一些文件夹(如`/tmp`、`/dev/shm` )使用tmpfs,默认tmpffs**大小为物理内存的一半**。 91 | 92 | 如果遇到默认分配的tmpfs空间不够大,可以可在`/etc/fstab`中指定size。 93 | 94 | 例如,内存为8g的设备,`/tmp`会分配4g,修改为6g大小,编辑`/etc/fstab`添加(或修改)如下: 95 | 96 | ```shell 97 | # /tmp tmpfs .default size is half of physical memory size 98 | tmpfs /tmp tmpfs nodev,nosuid,size=6G 0 0 99 | ``` 100 | 101 | 重启后生效。 102 | 103 | ### 浏览器使用tmpfs存放cache 104 | 105 | - firefox 106 | 107 | 1. 在地址栏中输入 about:config 进入高级设置页 108 | 109 | 2. 新建一个 String 110 | 111 | name 为 112 | 113 | > browser.cache.disk.parent_directory 114 | 115 | value为 116 | 117 | > /dev/shm/firefox 118 | 119 | - Chromium(或Chrome) 120 | 121 | 找到Chromium程序图标所在位置(一般在`/usr/share/applications/chromium.desktop` ),编辑文件中`Exec`行添加`--disk-cache-dir="/dev/shm/chromium/"`: 122 | 123 | ```shell 124 | Exec=/usr/bin/chromium --disk-cache-dir="/dev/shm/chromium/" 125 | ``` 126 | 127 | 建议复制`/usr/share/applications/chromium.desktop`到当前用户家目录的`~/.local/share/applications/chromium.desktop`,再对其修改: 128 | 129 | ```shell 130 | sudo cp /usr/share/applications/chromium.desktop ~/.local/share/applications/chromium.desktop 131 | sudo chown $(whoami) ~/.local/share/applications/chromium.desktop 132 | sed -i '/Exec/c Exec=/usr/bin/chromium --disk-cache-dir="/dev/shm/chromium/"' ~/.local/share/applications/chromium.desktop 133 | ``` 134 | 135 | 136 | 137 | 138 | 139 | 另:有 [anything-sync-daemon](https://aur.archlinux.org/packages/anything-sync-daemon/)允许用户将**任意** 目录使用相同的基本逻辑和安全防护措施同步入内存。 -------------------------------------------------------------------------------- /linux/system-maintain/sysctl调节.md: -------------------------------------------------------------------------------- 1 | sysctl用于调节运行时的内核参数。 2 | 3 | > configure kernel parameters at runtime 4 | 5 | # systctl使用 6 | 7 | 参看其帮助文件。 8 | 9 | ```shell 10 | sysctl [options] [variable[=value] ...] 11 | ``` 12 | 13 | 常用: 14 | 15 | - `-a` 查看所有参数 16 | - `p ` 从文件中读取参数值(并设置) 17 | - `-w` 设置参数的值 18 | - `-n` 仅查看参数的值 19 | - `-N` 仅查看参数名 20 | - `-e` 忽略未知参数错误 21 | - `参数名=值` 设置参数的值 22 | 23 | ```shell 24 | #查看所有参数 25 | sysctl -a 26 | #查看指定参数 27 | sysctl net.ipv4.ip_forward #net.ipv4.ip_forward = 0 28 | sysctl net.ipv4.ip_forward -n #只输出参数值 不输出参数名 29 | 30 | #临时设置参数值 仅在本次系统运行中生效 31 | sysctl -w net.ipv4.ip_forward=1 32 | echo 1 > /proc/sys/net/ipv4/ip_forward 33 | 34 | #读取配置文件中设置的值并应用 35 | sysctl -p #如不指定文件则读取/etc/sysctl.conf 36 | sysctl -p /etc/sysctl.d/*.conf 37 | sysctl --system #读取所有配置文件 38 | ``` 39 | 40 | 将配置内容写到`/etc/sysctl.d/`目录下的`.conf`文件中,配置内容将在下次启动后生效。 41 | 42 | 警告:`.conf`文件中的错误的配置可能造成系统无法启动。修改文件后,可使用`sysctl -p`读取该文件,测试设置是否正常。 43 | 44 | # 常用调节参数 45 | 46 | 参数值如果是0或1,则1表示启用,0表示关闭。 47 | 48 | ## 内核kernel 49 | 50 | ### 调度策略 51 | 52 | - `kernel.sched_migration_cost_ns` 值为时间,单位纳秒 53 | 54 | 调度器针对桌面环境优化,桌面环境下,快速响应比整体效率重要,不注重桌面(甚至不使用桌面)响应速度的服务器,可增加任务切换的响应间隔时间以提升效率。 55 | 56 | 在一些web服务器和数据库服务器上,可调高该值,例如500000。 57 | 58 | - `kernel.sched_autogroup_enabled` 值为0或1 59 | 60 | 有些服务器(尤其是postgres),该参数值设置为0可提高性能。 61 | 62 | ## 网络net 63 | 64 | - `net.ipv4.ip_forward` 值为0或1 设置为1开启网络转发(如配置NAT服务器)。 65 | 66 | - 网络缓存 67 | 68 | - `net.core.rmem_max` 69 | - `net.core.wmem_max` 70 | - `net.ipv4.tcp_wmem` 71 | - `net.ipv4.tcp_rmem` 72 | - `net.ipv4.tcp_max_syn_backlog` 73 | 74 | 75 | ## 虚拟内存vm 76 | 77 | - `vm.swappiness` 值为0-100,表示当内存剩余百分之多少时开始使用swap。 -------------------------------------------------------------------------------- /linux/system-maintain/vnc远程重装系统.md: -------------------------------------------------------------------------------- 1 | 提示: 2 | 3 | - 要重装的设备需要能连接到互联网,如果其不能连接到互联网,可在其所处的局域网中搭建私有源,同时搭建web服务器如apache/nginx,挂载(mount)DVD镜像到web根目录下。 4 | - 内存过小可能无法成功(centos实测1G内存失败) 5 | 6 | 7 | 1. ssh登录到该设备 8 | 9 | 2. 下载引导文件 10 | 11 | 3. 下载`vmlinuz`和`initrd.img`放置于`/boot`目录下 12 | 13 | - 不同的发行版,这两个文件可能略有出入(例如可能是`vmlinz-linux`和`initramfs-linux.img`)。 14 | - 这两个文件可以从镜像源网站中直接获取,或者从下载的系统镜像文件中提取。 15 | - 给予`initrd.img`600权限,`vmlinuz`755权限。 16 | 17 | 4. 修改grub启动项 18 | 19 | 1. 制作grub启动项 20 | 21 | 查看`grub.cfg`文件(可能是`/etc/grub.cfg`、`/etc/grub2/grub.cfg`、`/boot/grub/grub.cfg`等)。 22 | 23 | 找到`### BEGIN /etc/grub.d/10_linux ###`行下的`menuentry `项,复制该部分,在`/etc/grub.d/40_custom`文件中添加上文复制的内容,作出部分修改(大部分内容可省略,注意下面注释的部分是重要部分),示例: 24 | 25 | ```shell 26 | #预留足够长的时间保证有时间连上去进行操作 27 | set timeout=60 28 | menuentry "remote reinstall" { 29 | set root=(hd0,msdos1) #与第1步中查看到内容要一致 30 | # 设置repo地址 vncpassword ip gateway nameserver 31 | linux /vmlinuz repo=http://mirrors.aliyun.com/centos/7/os/x86_64/ vnc vncpassword=password ip=192.168.100.3 netmask=255.255.255.0 gateway=192.168.100.1 nameserver=192.168.100.1 noselinux headless xfs panic=60 32 | initrd /initrd.img 33 | } 34 | ``` 35 | 36 | 提示: 37 | 38 | - 获取ip `ip addr` 39 | - 获取gateway `arp -a`或`ip route` 40 | - 获取nameserver `cat /etc/resolv.conf` 41 | 42 | 2. 修改grub默认启动项 43 | 44 | 在`/etc/default/grub`修改或添加`GRUB_DEFAULT="remote reinstall"`,然后重新生成grub.cfg: 45 | 46 | ```shell 47 | grub2-mkconfig -o /boot/grub2/grub.cfg #注意grub.cfg路径正确 48 | ``` 49 | 提示:不同的发行版,该命令和grub文件路径或有不同,例如命令可能为`grub-mkconfig`, 路径可能为`/boot/grub/grub.cfg`。 50 | 51 | 3. 重启系统`reboot`,系统会自动从上面配置的`remote install`项目启动。 52 | 53 | 估计安装程序已经启动完毕,尝试使用vnc连接(上文设置的vnc地址:`172.18.229.218:5901`,密码`password`),进行系统安装操作即可。 54 | 55 | ---- 56 | 57 | 使用iso文件 以archlinux为例 58 | 59 | 下载镜像到根目录下命名为arch.iso 60 | 61 | 在grub.cfg中添加启动项 62 | 63 | ```shell 64 | #timeout设为60,是为了VNC连接时有足够时间选择启动项,若为第一启动项,可不设置 65 | set timeout=60 66 | menuentry 'ArchISO' --class iso { 67 | #isofile是系统镜像iso文件的绝对路径 68 | set isofile=/arch.iso 69 | loopback loop0 $isofile 70 | #archisolabel设置archiso文件驻留的文件系统标签。 71 | #img_dev指明archiso文件驻留的设备 72 | #img_loop是archiso文件在img_dev里的绝对位置 73 | linux (loop0)/arch/boot/x86_64/vmlinuz archisolabel=ARCH20181201 img_dev=/dev/vda1 img_loop=$isofile 74 | initrd (loop0)/arch/boot/x86_64/archiso.img 75 | } 76 | ``` 77 | 78 | -------------------------------------------------------------------------------- /linux/system-maintain/编译升级glibc与修复.md: -------------------------------------------------------------------------------- 1 | # glibc简介 2 | 3 | > glibc是GNU发布的libc[库](http://baike.baidu.com/view/226876.htm),即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。 4 | > 5 | > libc是linux下的ANSI C函数库,被glibc包含。 6 | > 7 | > libstdc++ 是gcc的标准c++库 8 | 9 | 10 | 11 | 查看当前系统的glibc版本信息: 12 | 13 | ```shell 14 | ldd --version 15 | 16 | #查看glic API版本 17 | strings /lib64/libc.so.6 | grep GLIBC 18 | strings /lib64/libc.so.6 | grep -E "^GLIBC_" |sort -u 19 | ``` 20 | 21 | 22 | 23 | # 编译安装glibc 24 | 25 | glibc为系统极为底层的运行库,自行编译覆盖系统glibc会影响大多数系统基本程序的使用,尤其是其中关键的二进制文件如`/lib/ld-linux.so`和 `/lib/libc.so.6`(不同发行版路径可能有差异)。 26 | 27 | 因自行编译安装而覆盖系统glibc引起问题,可参看[修复glibc](#修复glibc)。 28 | 29 | 30 | 31 | 如一些程序的运行需更高版本的glibc,应考虑选择其他方案解决的建议采用其他方案解决,例如: 32 | 33 | - 使用系统的包管理器升级系统(如果可以的话,glibc及相关程序会一并升级) 34 | 35 | - 使用符合glibc版本要求的容器运行程序 36 | 37 | - 使用chroot或fakechroot构建合适的系统环境运行程序 38 | 39 | - 如果程序提供源码 40 | 41 | - 使用源码在当前glibc版本的环境中进行编译 42 | 43 | - 对程序进行静态编译 44 | 45 | libstdc++可以静态编译,但是libc不行,如果程序没有依赖了glibc,可以考虑直接静态编译libstdc++。 46 | 47 | 查看程序是否依赖了glibc: 48 | 49 | ```shell 50 | nm | grep GLIBC_ 51 | ``` 52 | 53 | 54 | 55 | - 打包glibc的so发布 56 | 57 | gcc使用如下参数指定动态连接器和动态库的装载目录: 58 | 59 | ```shell 60 | gcc -Wl,-rpath=/path/to/glibc,-dynamic-linker=I/path/to/ld-linux-x86-64.so.2 61 | ``` 62 | 63 | 编译后的程序和glibc的文件一并打包使用。 64 | 65 | - rpath:run-time search path,指定了可执行文件执行时搜索so文件的第一优先位置,一般编译器默认将该字段设为空。 66 | 67 | elf文件中还有一个类似的字段runpath,其作用与rpath类似,但搜索优先级稍低。搜索优先级: 68 | 69 | > ```shell 70 | > rpath > LD_LIBRARY_PATH > runpath > ldconfig缓存 > 默认的/lib,/usr/lib等 71 | > ``` 72 | 73 | 如果需要使用相对路径指定lib文件夹,可以使用 `ORIGIN`变量,其代指可执行文件所在的路径,如: 74 | 75 | ```shell 76 | gcc -Wl,-rpath='$ORIGIN/../lib' 77 | ``` 78 | 79 | - interpreter 80 | 81 | 全名elf interpreter,用于加载elf文件。一般默认为`/lib64/ld-linux-x86-64.so.2`。 82 | 83 | 一些程序将interpreter的绝对路径`/lib64/ld-linux-x86-64.so.2`写在elf文件中,因此无论怎么设置rpath、LD_LIBRARY_PATH等均无效(可使用`ldd 程序名字`检查)。 84 | 85 | 86 | 87 | - 如果只有程序的可执行文件,可使用pathelf打补丁 88 | 89 | 1. 安装patchelf 90 | 91 | 2. 执行程序时使用patchelf指定`--set-interpreter`和`--set-rpath`,示例: 92 | 93 | ```shell 94 | patchelf --set-rpath /path/to/glibc/lib \ 95 | --set-interpreter /path/to/glibc/lib/ld-linux-x86-64.so.2 \ 96 | 97 | ``` 98 | 99 | 100 | 101 | 编译glibc 102 | 103 | 1. [下载glibc](https://ftp.gnu.org/gnu/libc/) 104 | 105 | *2.16及以下版本还需要在该页面下载glibc-ports* 106 | 107 | 2. 编译安装 108 | 109 | 注意:configure要指定`--prefix`位置,避免新glibc覆盖系统glibc,且注意存放目录不应该设置到会覆盖系统LD_LIBRARY_PATH环境变量的情况。 110 | 111 | ```shell 112 | ver=2.18 #glibc版本 113 | dist=/usr/local/glibc-$ver #glibc安装的路径 114 | 115 | tar -xJvf glibc-$ver.tar.xz 116 | 117 | #tar -xvf glibc-ports-$ver.tar.xz #2.16及以下版本需要 118 | #mv glibc-ports-$ver glibc-$ver/ports -f #2.16及以下版本需要 119 | 120 | cd glibc-$ver 121 | 122 | mkdir build -p && cd build #直接在源码目录configure会报错 123 | ../configure --prefix=$dist 124 | 125 | make -j4 && make install 126 | 127 | #make localedata/install-locales #2.16及以下版本需要执行避免locale问题 128 | #cp /etc/ld.so.conf $prefix/etc/ #2.16及以下版本需要执行 129 | 130 | make install 131 | 132 | strings $dist/lib/libc.so.6 | grep GLIBC 133 | ``` 134 | 135 | 136 | 137 | 3. 指定环境变量 138 | 139 | 以`export LD_LIBRARY_PATH`的方式临时加载新glibc环境变量: 140 | 141 | ```shell 142 | export PATH=$dist/bin:$PATH 143 | export LD_LIBRARY_PATH=$dist/lib:$LD_LIBRARY_PATH 144 | ``` 145 | 146 | 注意: 147 | 148 | - 不应当将以上内容写入到shell登录后自动加载的配置文件中 149 | 150 | 如使用bash,不应当写到`/etc/profile.d/`下的`*sh`文件中。 151 | 152 | 153 | 154 | # 修复glibc 155 | 156 | 直接升级系统的glibc会造成系统大多数命令的失效,不应当直接编译安装来覆盖系统自带的glibc(覆盖lib中的 `libc.so.6`等文件), 157 | 158 | 159 | 160 | 如果误操作的主机是远程主机,千万不要退出SSH,否则再也登录不上去,因此建议在进行此类重要软件包升级前,先以tmux和screen之类的工具开启一个后台窗口备用。 161 | 162 | 163 | 164 | 执行以下命令立即修复为旧版本的glibc: 165 | 166 | ```shell 167 | LD_PRELOAD=/lib64/libc-2.12.so #根据系统中实际的libc版本修改 168 | 169 | #创建链接库 170 | #使用ln命令 171 | ln -sf /lib64/libc-2.12.so libc.so.6 172 | 173 | #或者使用ldconfig命令 174 | ldconfig -lv $LD_PRELOAD 175 | 176 | unset LD_PRELOAD #去掉LD_PRELOAD 177 | ``` 178 | 179 | 这里的2.12应该以原来系统存在的glibc版本更改。 180 | 181 | 182 | 183 | # 问题 184 | 185 | - 执行date提示`Local time zone must be set--see zic ` 186 | 187 | ```shell 188 | ln -sf /etc/localtime /usr/local/glibc-$ver/etc/localtime 189 | #echo "export LD_LIBRARY_PATH=$prefix/lib:\$LD_LIBRARY_PATH" > /etc/profile.d/glibc.sh 190 | ``` -------------------------------------------------------------------------------- /linux/update-alternatives-multi-vers-switch多版本软件环境切换.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # update-alternatives 4 | 5 | ## 简介 6 | 7 | 创建、删除、维护和显示关于包含替代系统的符号链接的信息。 8 | 9 | 用于管理: 10 | 11 | - 一个软件的多个版本的默认版本 12 | 13 | 例如:系统中安装了gcc-7,gcc-9,`$PATH`中默认的`gcc`,如`/usr/bin/gcc`只可能为其中的一个gcc版本。 14 | 15 | - 一个功能的多个实现的默认实现 16 | 17 | 例如:系统中安装了多个编辑器,vim、nano、vi,而一些软件在编辑文件时会调用`$EDITOR`变量指向的某个编辑器如`vi`。 18 | 19 | 20 | 21 | update-alternatives以权重来确定默认值,数值最大的为默认值, 22 | 23 | update-alternatives本质上是通过建立两重软链接的方式工作的,其在shell命令与真正的执行程序间加入匹配层。例如一个系统中的editor可能是这样链接的: 24 | 25 | > ```shell 26 | > $ ls -l /usr/bin/editor 27 | > lrwxrwxrwx 1 root root 24 Jan 10 2020 /usr/bin/editor -> /etc/alternatives/editor 28 | > 29 | > $ ls -l /etc/alternatives/editor 30 | > lrwxrwxrwx 1 root root 17 Jun 25 20:21 /etc/alternatives/editor -> /usr/bin/vim.tiny 31 | > ``` 32 | 33 | 在shell中键入`editor`会先找到`/etc/alternatives/editor`,然后找到`/usr/bin/vim.tiny`。 34 | 35 | 36 | 37 | ## 使用 38 | 39 | 设置默认链接: 40 | 41 | ```shell 42 | #update-alternatives --install 43 | 44 | update-alternatives --install /usr/bin/gcc gcc gcc-7 50 45 | ``` 46 | 47 | - `` 要创建的软连接的位置 48 | 49 | - `` 同一软件的不同版本或同一功能的不同实现公用的名字,例如gcc-7,gcc-9,一般将公用名字设置为gcc 50 | 51 | - `` 被软链接的文件的路径 52 | 53 | - `` 优先级(权重) 54 | 55 | 当前``中权重值最高的才会成为默认的链接最终指向的源文件,相同则后install的覆盖为最新默认值。 56 | 57 | 例如为每个`gcc-*`设置不同的权重,权重高的将成为默认的`gcc`。 58 | 59 | 60 | 61 | 设置指定项的各个版本的优先级: 62 | 63 | ```shell 64 | # update-alternatives --config 65 | update-alternatives --config editor #设置editor的优先级 66 | ``` 67 | 68 | 移除指定项的相关链接: 69 | 70 | ```shell 71 | #update-alternatives --remove 72 | #update-alternatives --remove-all #移除所有 73 | 74 | update-alternatives --remove gcc /usr/bin/gcc-7 75 | ``` 76 | 77 | 查看指定项的各个版本的路径: 78 | 79 | ```shell 80 | update-alternatives --diplay 81 | ``` 82 | -------------------------------------------------------------------------------- /linux/user-management/ldap/ldap简介.md: -------------------------------------------------------------------------------- 1 | # LDAP协议简介 2 | 3 | **LDAP**,Lightweight Directory Access Protocol,是轻量目录访问协议,提供访问控制和维护分布式信息的目录信息。使用LDAP构建一个统一的账号管理、身份验证平台,实现SSO单点登录机制(用户在多个应用服务系统中使用同一套帐号密码)。 4 | 5 | 6 | 7 | 整个LDAP目录信息集可以表示为一个目录信息树,树中的一个节点称为条目(Entry),条目中包含该节点的属性及属性值。 8 | 9 | 10 | 11 | - Directory目录:存放信息单元 12 | 13 | - entry条目:LDAP的基本信息单元。由属性(attribute)的一个聚集组成,具有一个唯一的**专有名称**(**distinguished name**,DN)。 14 | 15 | - 对象类:与某个实体类型对应的一组属性(可继承)。 16 | - attribute 属性:与entry直接关联的信息,描述条目的某个信息,由一个属性类型和一个或多个属性值组成。 17 | 18 | - LDIF: LDAP数据交换格式( *LDAP Data Interchange Format* )是一种标准的文本文件,该文件的格式如下: 19 | 20 | > ```text 21 | > [id] dn: distinguished_name 22 | > attribute_type: attribute_value… 23 | > attribute_type: attribute_value… 24 | > ``` 25 | 26 | 这种标准化格式称之为schema,schema指定对象的类型,以及每一个类型中的可选属性。 27 | 28 | 29 | 30 | 31 | ldap中组织结构的描述术语: 32 | 33 | - DC, domain component,域组件,一个组织的名字 34 | 35 | 例如公司的名字,公司abc.com表示为dc=abc,dc=com 36 | 37 | - OU, organization unit,组织单元, 38 | 39 | 例如公司的一个部门,ou=research 40 | 41 | 一个组织单元可以包含其他的一个活多个组织单元,例如research部门下属有dev部门和test部门。 42 | 43 | - CN, common name,公用名称,一个组织单元中的一个成员 44 | 45 | 例如公司某个部门的员工或员工的电脑主机名,cn=member1 46 | 47 | cn描述人的姓名时,可以使用属性sn(surname,姓)和givenName(名)组合。 48 | 49 | - DN, distinguished name,专有名称,ldap全局唯一的名字,由CN、OU和DC组成 50 | 51 | 例如公司abc.com的research部门的leader,dn表示为:`cn=leader,ou=research,dc=abc,dc=com` 52 | 53 | - RDN, relative istinguished name,相对辨识名,类似文件系统中的相对路径,dn中的每个组成部分都是rdn 54 | 55 | 例如`cn=user1,ou=users,dc=cluster,dc=org`中逗号分隔的每个部分就是这个dn的rdn。 56 | 57 | 58 | 59 | 一个ldap树状结构示例: 60 | 61 | > ``` 62 | > 公司(DC) 63 | > |-----------------|-------------|------------| 64 | > 研发部(OU) 市场部(OU) 人事部(OU) 65 | > |-----------|---------| 66 | > CTO(CN) 开发组(OU) 测试组(OU) 67 | > | 68 | > 张三(CN) 69 | > ``` 70 | 71 | 72 | 73 | # LDAP协议实现 74 | 75 | - [openldap](https://openldap.org) 76 | 77 | 开源的LDAP协议实现。 78 | 79 | - [389 Directory Server](https://directory.fedoraproject.org)(389 DS),[Red Hat Directory Server(RHDS)](https://www.redhat.com/en/contact) 和 Red Hat Identity Management(RH Idm) 80 | 81 | *Redhat7.4+版本和SUSE15.3+版本开始不再提供对openldap的官方支持,替代品为389 DS或RHDS。* 82 | 83 | 389 DS由Fedora Directory Server项目发展而来;RHDS是389 DS的商业版本,提供一些高级管理功能;RH Idm是基于RHDS的身份管理解决方案,提供了完整的身份认证和授权功能,包括LDAP目录服务,Kerberos认证,证书管理和访问控制等。 84 | 85 | - [Apache Directory Server](https://directory.apache.org) (apache DS) 86 | 87 | - [freeIPA](https://www.freeipa.org/page/Main_Page) 88 | 89 | 开源身份认证和授权解决访问,集成389 DS,MIT Kerberos,AD,NTP、[DNS](https://pagure.io/bind-dyndb-ldap)、[Dogtag证书系统](http://pki.fedoraproject.org/)、[SSSD](https://pagure.io/SSSD/sssd)等。 90 | 91 | - Microsoft Active Directory(windows AD) 92 | 93 | - IBM Directory Server(基于DB2) 94 | 95 | - Oracel Internet Directory(OID) 96 | 97 | # 图形界面管理工具 98 | 99 | - [freeIPA](https://www.freeipa.org/page/Main_Page) 100 | - [ldap-account-manager](https://www.ldap-account-manager.org/lamcms/) (LAM) 101 | - [ldapadmin](http://www.ldapadmin.org) 102 | - [apache ds studio](https://directory.apache.org/studio/downloads.html) 103 | - windows AD管理器 104 | -------------------------------------------------------------------------------- /linux/user-management/ldap/pGina-ldap-config/enable-ldap-plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levinit/itnotes/d98fd8580d2fee37a7d6d59c2f8ac8ece8e845b4/linux/user-management/ldap/pGina-ldap-config/enable-ldap-plugin.png -------------------------------------------------------------------------------- /linux/user-management/ldap/pGina-ldap-config/enable-pgina-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levinit/itnotes/d98fd8580d2fee37a7d6d59c2f8ac8ece8e845b4/linux/user-management/ldap/pGina-ldap-config/enable-pgina-service.png -------------------------------------------------------------------------------- /linux/user-management/ldap/pGina-ldap-config/ldap-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levinit/itnotes/d98fd8580d2fee37a7d6d59c2f8ac8ece8e845b4/linux/user-management/ldap/pGina-ldap-config/ldap-config.png -------------------------------------------------------------------------------- /linux/user-management/user-management.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | 用户在系统中的用户名是唯一的,用户具有这些属性: 4 | 5 | - uid 用户的id,唯一 6 | 7 | 为一个数字,一般1000及以上的为普通用户(可设置),1000以下为系统用户,0为root用户 8 | 9 | - groups 用户组 10 | 11 | 一个用户可以属于多个用户组,每个7用户组都有一个唯一的gid(一个数字)。 12 | 13 | - primary group 主要组,是当前生效的某一个用户组 14 | 15 | - supplementary groups 补充组,包含用户所属的所有组 16 | 17 | 18 | 19 | # 查看用户信息 20 | 21 | - `id ` 打印指定用户的信息 22 | 23 | > ```shell 24 | > # id user1 25 | > uid=1050(user1) gid=10000(group1) groups=1000(group1),1001(group2),1002(group3) 26 | > ``` 27 | 28 | 29 | 30 | - 记录本系统用户信息的文件 31 | 32 | - `/etc/passwd` 33 | - `/etc/shadow` 34 | - `/etc/group` 35 | - `/etc/gshadow` 36 | 37 | - 查看NSS(Name Service Switch)中的用户信息——使用`getent`(get entries) 38 | 39 | *会包含获取自用户信息管理工具如NIS、LDAP等的条目信息。* 40 | 41 | 使用`getent --help`查看支持的数据库类型。 42 | 43 | ```shell 44 | getent #可查看用户相关的数据库:passwd shadow group gshadow 45 | ``` 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | # 用户管理 54 | 55 | ## 添加用户 56 | 57 | ```shell 58 | useradd 59 | 60 | useradd -m -d /path/to/userhome/ -s /bin/bash -g -u -G 61 | 62 | useradd -r #创建一个系统用户 63 | ``` 64 | 65 | 常用选项: 66 | 67 | - `-m` 创建家目录 68 | - `-d` 用户家目录路径 69 | - `-u` 用户uid,不指定时由系统自动分配 70 | - `-s` shell 71 | - `-g` 用户主组(primary group),默认与用户名相同 72 | - `-G` 用户补充组(supplementary group) 73 | - `-r` 创建系统用户 74 | - `-k` 指定一个目录代替默认的`/etc/login.defs`目录作为 75 | 76 | 77 | 78 | ### 新用户的默认配置文件 79 | 80 | - `/etc/login.defs` 81 | 82 | 定义了创建新用户的一些参数,如 83 | 84 | - `UID_MIN`/`UID_MAX`和`GID_MIN`/`GID_MAX`的值,在这个MIN-MAX区间(包含MIN和MAX自身)的id为普通可登录用户的uid和gid。 85 | 86 | - `SYS_UID_MIN`/`SYS_UID_MAX`和`SYS_GID_MIN`/`SYS_GID_MAX`,含义同上,用户系统用户。 87 | - `PASS_`开头的配置行可定义密码复杂度要求和过期时间等 88 | 89 | `/etc/skel`目录为新建用户家目录的模板目录,使用`useradd`创建用户家目录时,会自动复制该目录的内容到用户家目录中。 90 | 91 | 92 | 93 | ## 更改密码 94 | 95 | - 交互式 96 | 97 | ```shell 98 | #更改指定用户密码,如不指定username则默认用当前用户自身 99 | passwd #更改其他用户密码需要root权限 100 | ``` 101 | 102 | 103 | 104 | ```shell 105 | 106 | 107 | #batch模式修改密码 108 | echo | passwd --stdin #部分linux版本中的passwd支持--stdin选项 109 | 110 | echo : | chage 111 | ``` 112 | 113 | 114 | 115 | 116 | 117 | ## 删除用户 118 | 119 | 需要退出被删除的用户的所有进程。 120 | 121 | ```shell 122 | userdel 123 | userdel -r #-r同时删除用户家目录 124 | ``` 125 | 126 | 127 | 128 | ## 管理用户组 129 | 130 | - gpasswd 131 | - groupmems 132 | 133 | 134 | 135 | ## 变更用户组 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /linux/virtualization&container/podman-basic.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | > [Podman](http://podman.io/) is a daemonless, open source, Linux native tool designed to make it easy to find, run, build, share and deploy applications using Open Containers Initiative ([OCI](https://www.opencontainers.org/)) [Containers](https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.j2uq93kgxe0e) and [Container Images](https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.dqlu6589ootw). 4 | 5 | 参看RedHat文档[构建、运行和管理容器](https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/9/html/building_running_and_managing_containers/assembly_starting-with-containers_building-running-and-managing-containers) 6 | 7 | 8 | 9 | *pod的含义为豆荚,类似docker集装箱,是一个很形象的名字。* 10 | 11 | > Podman使用libpod库管理整个容器生态系统,包括豆荚(pod)、容器、容器图像和容器卷。 12 | 13 | [podman](https://docs.podman.io)兼容docker的大部分命令,将命令中的docker替换成podman即可。 14 | 15 | podman计成 rootless ,它可以在没有 root 权限的情况下运行。 16 | 17 | # 基本设置 18 | 19 | 一般的,在linux上安装podman后,全局配置文件目录为`/etc/containers`,仅作用于用户的配置文件目录为`~/.config/containers`。 20 | 21 | ## 镜像源 22 | 23 | 配置文件为registries.conf,示例: 24 | 25 | ```shell 26 | #unqualified-search-registries = ["docker.io","quay.io" "registry.redhat.io", "registry.access.redhat.com"] 27 | 28 | unqualified-search-registries = ["docker.io"] 29 | 30 | [[registry]] 31 | prefix = "docker.io" 32 | location = "docker.io" 33 | 34 | [[registry.mirror]] 35 | location = "hub-mirror.c.163.com" 36 | 37 | [[registry.mirror]] 38 | location = "mirror.baidubce.com" 39 | 40 | [[registry.mirror]] 41 | location = "dockerproxy.com" 42 | 43 | [[registry.mirror]] 44 | location = "ghcr.io" 45 | ``` 46 | 47 | 48 | 49 | ## 存储位置 50 | 51 | 配置文件为storage.conf可定义存储位置。默认情况: 52 | 53 | - 对于root用户,镜像和容器等存储在`/var/lib/containers` 54 | 55 | - 对于普通用户,镜像和容器等存储在`~/.local/share/containers` 56 | 57 | 58 | 59 | 60 | 61 | ## 用户id映射 62 | 63 | 如果以普通用户运行容器,且在容器中运行了需要使用主机的用户或组身份验证的应用程序,那么容器中必须存在与主机上相同UID和GID的用户或组。 64 | 65 | `useradd` 命令会在 `/etc/subuid` 和 `/etc/subgid` 文件中自动设置可访问用户和组 ID 的范围。 66 | 67 | 如果当前发行版的`useradd`不能实现自动设置,可使用以下方法为已有用户设置subuid和subid: 68 | 69 | - `usermod` 70 | 71 | ```shell 72 | usermod --add-subuids - --add-subgids - 73 | 74 | #例子: 75 | usermod --add-subuids 100000-165535 --add-subgids 100000-165535 user1 76 | ``` 77 | 78 | *使用 65536 UID 和 GID 来最大限度地与现有容器镜像兼容,但这个数字可以设置得更小。* 79 | 80 | 81 | 82 | - 编辑``/etc/subuid`和`/etc/subgid`,添加相同的行,示例: 83 | 84 | ```shell 85 | user1:10000000:65535 #表示从1000000开始后面的65535个数字 86 | ``` 87 | 修改了以上文件必须执行迁移操作: 88 | 89 | ```shell 90 | podman system migrate 91 | ``` 92 | 93 | 94 | 95 | 在运行容器的命令中使用`--users=keep-id`可以保持容器中UID/GID与外部的一致性,也可以使用`--uidmap`和`--gidmap`选项手动映射容器中的用户或组到主机上的用户或组。 96 | 97 | 98 | 99 | # 容器创建 100 | 101 | 参考docker的build。 102 | 103 | 注意:Podman 默认使用 `crun` 作为其 OCI 运行时,Docker file中如果使用`RUN`指令则需要 `runc`。可以通过编辑 `/etc/containers/containers.conf` 文件来更改运行时。 104 | 105 | 106 | 107 | 通过dockerfile或者podman的文件(yaml格式)创建: 108 | 109 | ```shell 110 | podman build -t <名字> -f <文件路径> 111 | ``` 112 | 113 | 114 | 115 | # 容器编排 116 | 117 | - `podman generate`从容器生成编排文件 118 | 119 | - spec 生成json格式,符合 [Open Container Initiative (OCI) runtime specification](https://github.com/opencontainers/runtime-spec) ) 120 | 121 | `podman generate spec > container.json` 122 | 123 | - kube 生成yaml格式,兼容kubernets 124 | 125 | `podman generate kube > mycontainer.yaml` 126 | 127 | - `podman play`使用编排文件运行容器 128 | 129 | ```shell 130 | podman play kube #可以是yaml或json的编排文件 131 | ``` 132 | 133 | 注意:`podman play kube` 命令主要是用于处理 Kubernetes 兼容的 YAML 文件的,对于 OCI 兼容的 JSON 文件,可能需要一些额外的处理。 134 | 135 | 136 | -------------------------------------------------------------------------------- /linux/web-server/lnmp搭建.md: -------------------------------------------------------------------------------- 1 |  部署lnmp环境 2 | 3 | [TOC] 4 | 5 | LNMP(linux,nginx,mariadb,php)部署,以下默认在root权限下操作,以centos7为例。 6 | 7 | # 安装 8 | 9 | - 安装nmp(nginx-mariadb-php) 10 | 11 | `yum install nginx mariadb-server php php-fpm` 12 | 13 | - 设置开机启动并立即启动服务: 14 | 15 | `systemctl enable nginx mariadb php-fpm && systemctl start nginx mariadb php-fpm` 16 | 17 | - 可安装phpmyadmin方便管理mariadb数据库: 18 | 19 | `yum install phpMyAdmin` 20 | 21 | # 配置 22 | 23 | ## mariadb配置 24 | 25 | `mysql_secure_installation` 26 | 27 | 回车>根据提示输入Y>输入2次密码(不建议无密码)>回车>根据提示一路输入Y>最后出现:Thanks for using MariaDB! 28 | 29 | ## php配置 30 | 31 | - 修改php-fpm的执行用户为nginx组的nginx(默认为apache组的apache) 32 | 33 | 编辑/**etc/php-fpm.d/www.conf**,修改用户名和组: 34 | 35 | ```shell 36 | user = nginx #修改用户为nginx 37 | group = nginx #修改组为nginx 38 | 39 | #... 40 | #取消以下行的注释以启用 php-fpm 的系统环境变量 41 | env[HOSTNAME] = $HOSTNAME 42 | env[PATH] = /usr/local/bin:/usr/bin:/bin 43 | env[TMP] = /tmp 44 | env[TMPDIR] = /tmp 45 | env[TEMP] = /tmp 46 | ``` 47 | 48 | - 将储存php会话(session)记录文件夹权限赋给nginx组的nginx: 49 | 50 | ```shell 51 | mkdir -p /var/lib/php/session 52 | chown nginx:nginx /var/lib/php/session -R 53 | ``` 54 | 55 | 提示:自定义session路径,可在`/etc/php.ini`中找到`session.save_path`行,去掉其注释,指定自定义路径值 56 | 57 | ## nginx配置 58 | 59 | 在[/etc/nginx/nginx.conf](nginx/nginx.conf)使用`include conf.d/*.conf;` ,而从`/tec/nginx/conf.d`中引入各个配置文件。 60 | 61 | 在`/etc/nginx/conf.d/`中新建一个.conf文件,如website.conf,内容如下(据情况修改): 62 | ```nginx 63 | server{ 64 | listen 80; 65 | server_name localhost; 66 | root /srv; 67 | index index.html index.php; 68 | charset utf-8,gbk; 69 | 70 | #为一个单页应用配置解析的示例 71 | location single_page_app { 72 | try_files $uri $uri/ /index.html; 73 | } 74 | } 75 | ``` 76 | 77 | - listen 监听端口 78 | - server_name 服务主机名 79 | - root 根目录 80 | - index 默认主页 81 | - charset 编码格式(默认为utf8,中文gbk会乱码) 82 | 83 | ### php解析 84 | 85 | 在server中添加[php解析](nginx/conf.d/backend-parse/php): 86 | 87 | ```nginx 88 | location ~ \.php$ { 89 | fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 90 | #fastcgi_pass 127.0.0.1:9000; 91 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 92 | include fastcgi_params; 93 | } 94 | ``` 95 | 96 | `fastcgi_pass` 根据php-fpm的配置文件中`listen`的值设置。 97 | 98 | ## phpmyadmin配置 99 | 100 | 将phpMyAdmin复制`/usr/share/phpMyAdmin`到web根目录`/srv/web`下,或者创建一个软链接:location ~ \.php$ { 101 | fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; #127.0.0.1:9000; 102 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 103 | include fastcgi_params; 104 | } 105 | 106 | ```shell 107 | ln -s /usr/share/phpMyAdmin /usr/share/nginx/html 108 | ``` 109 | 110 | 提示:有的发行版中,通过包管理安装的phpmyadmin位于`/usr/share/webapps`目录下。 111 | 112 | ### 权限问题 113 | 114 | 如果出现“403forbiden”,可能是该目录下没有index规定的默认主页文件(如index.html)或者nginx的执行用户不具有读取该目录的权限。可以用以下方法解决: 115 | 116 | - 确保正确的读取权限 117 | 118 | 文件644(rw-r--r--),文件夹755(rwx-r-xr-x)。假如nginx的执行用户是nginx组的nginx,web主目录是/srv/http,可使用以下命令修改所有权限: 119 | 120 | ```shell 121 | chown -R nginx.nginx /srv/http/ 122 | find /srv/web/ -type f -exec chmod 644 {} \; 123 | find /srv/web/ -type d -exec chmod 755 {} \; 124 | ``` 125 | 126 | 127 | - 给予该用户相应权限,如将执行用户(假如执行用户名为nginx)加入具有读取该目录的用户组(假如该用户组是users)中`useradd -aG users nginx` 。 128 | - 换用具有权限的用户执行,如换用root用户,在`/etc/nginx/nginx.conf`中将user改为root。 129 | 130 | ## 测试 131 | 132 | 配置完后,测试前重启所有服务: 133 | 134 | `systemctl restart nginx mariadb php-fpm` 135 | 136 | - 测试nginx: 137 | 138 | `nginx -t`   139 | 140 | 注意:该命令默认使用nginx的运行用户监测。 141 | 142 | 成功则返回如下内容: 143 | >nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 144 | >nginx: configuration file /etc/nginx/nginx.conf test is successful 145 | 146 | - 登录网站测试,在浏览器打开域名或IP。 147 | 148 | - 测试php解析: 149 | 添加phpinfo.php测试文件到根目录,其内容为: 150 | 151 | ```php 152 | 155 | ``` 156 | 保存后,打开网站,例如网址是xxx.com,浏览xxx.com/info.php,就可以看到php详情页面。 157 | 158 | - mariadb测试,以主目录下phpMyAdmin名字未更改为例,例如网址是xxx.com,浏览xxx.com/phpMyAdmin进入到mariadb的登录页面,用户名root,密码是mariadb配置时输入的密码。 159 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/auth-pages/auth-templ: -------------------------------------------------------------------------------- 1 | server{ 2 | listen 1996; 3 | server_name 132.232.114.236; 4 | 5 | location / { 6 | auth_basic "another"; 7 | #use htpasswd generate lock-info file 8 | #htpasswd -c /etc/nginx/conf.d/lock username password 9 | auth_basic_user_file /etc/nginx/conf.d/visiti-lock-info; 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/demo.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | root /srv/http/; 5 | #php解析 6 | include conf.d/php; 7 | 8 | #40x和50x页面 9 | include conf.d/40x-50x; 10 | 11 | #如果强制使用https 12 | include conf.d/ssl/forcessl; 13 | } 14 | 15 | server { 16 | listen 443; #http2; 17 | server_name localhost; 18 | ssl on; 19 | root /srv/http/; 20 | index index.html index.htm; 21 | 22 | #ssl证书 23 | include conf.d/ssl/ssl-xx.com; 24 | 25 | include conf.d/indexview; 26 | auth_basic "auth-tips"; 27 | #use htpasswd generate lock-info file 28 | #htpasswd -c /etc/nginx/conf.d/auth1 username password 29 | auth_basic_user_file conf.d/auth-pages/auth1; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/donotvisitbyip.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | server_name _; 4 | return 444; 5 | } 6 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/public/40x-50x: -------------------------------------------------------------------------------- 1 | error_page 404 /404.html; 2 | location = /40x.html { 3 | } 4 | 5 | error_page 500 502 503 504 /50x.html; 6 | location = /50x.html { 7 | } 8 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/public/forcessl: -------------------------------------------------------------------------------- 1 | #强制使用ssl 在server中引用 2 | listen 80; 3 | #server_name xxx; 4 | return 301 https://$server_name$request_uri; 5 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/public/index-view: -------------------------------------------------------------------------------- 1 | autoindex on; 2 | autoindex_exact_size off; 3 | autoindex_localtime on; 4 | charset utf-8,gbk; 5 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/public/php: -------------------------------------------------------------------------------- 1 | location ~ .*\.php(\/.*)*$ { 2 | fastcgi_pass unix:/run/php-fpm/php-fpm.sock; 3 | fastcgi_index index.php; 4 | include fastcgi.conf; 5 | } 6 | -------------------------------------------------------------------------------- /linux/web-server/nginx/conf.d/public/ssl-tpl: -------------------------------------------------------------------------------- 1 | #ssl证书模板 假设网站a的证书放到/etc/nginx/conf.d/ssl/a下 2 | #证书 3 | ssl_certificate conf.d/ssl/a/a.pem; 4 | #密钥 5 | ssl_certificate_key conf.d/ssl/a/a.key; 6 | ssl_session_timeout 5m; 7 | ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 8 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 9 | ssl_prefer_server_ciphers on; 10 | -------------------------------------------------------------------------------- /linux/web-server/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user root; 2 | worker_processes auto; 3 | error_log /var/log/nginx/error.log; 4 | #error_log logs/error.log notice; 5 | #error_log logs/error.log info; 6 | #pid logs/nginx.pid; 7 | 8 | # load_module "/usr/lib/nginx/modules/ngx_http_fancyindex_module.so"; 9 | events { 10 | worker_connections 1024; 11 | } 12 | 13 | http { 14 | include mime.types; 15 | default_type application/octet-stream; 16 | #types_hash_max_size 2048; 17 | types_hash_bucket_size 128; 18 | access_log /var/log/nginx/access.log; 19 | 20 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 | '$status $body_bytes_sent "$http_referer" ' 22 | '"$http_user_agent" "$http_x_forwarded_for"'; 23 | 24 | client_max_body_size 20m; 25 | 26 | sendfile on; 27 | #tcp_nopush on; 28 | 29 | keepalive_timeout 65; 30 | 31 | gzip on; 32 | gzip_min_length 10k; 33 | gzip_comp_level 2; 34 | 35 | include conf.d/*.conf; 36 | } 37 | 38 | -------------------------------------------------------------------------------- /macos/automater/Open Terminal.app.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levinit/itnotes/d98fd8580d2fee37a7d6d59c2f8ac8ece8e845b4/macos/automater/Open Terminal.app.tar.xz -------------------------------------------------------------------------------- /macos/automater/Open iTerm.app.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levinit/itnotes/d98fd8580d2fee37a7d6d59c2f8ac8ece8e845b4/macos/automater/Open iTerm.app.tar.xz -------------------------------------------------------------------------------- /macos/macos-tips.md: -------------------------------------------------------------------------------- 1 | # Finder 2 | 3 | 默认显示/不显示隐藏文件: 4 | 5 | ```shell 6 | defaults write com.apple.finder AppleShowAllFiles -boolean true #false 7 | ``` 8 | 9 | 10 | 11 | ## terminal打开慢 12 | 13 | 开机后首次打开terminal慢,删除log: 14 | 15 | ```shell 16 | sudo rm -rf /private/var/log/asl/*.asl 17 | ``` 18 | 19 | 20 | 21 | # 命令行工具 22 | 23 | ## diskutil 24 | 25 | 图形界面的磁盘管理工具不能完成一些操作,可以通过diskutil实现: 26 | 27 | ```shell 28 | diskutil list #列出所有disk 29 | 30 | 31 | #--删除disk2的所有分区 32 | #diskutil eraseDisk 文件系统格式 硬盘名字 硬盘标志符 33 | #diskutil listFilesystems 可查看支持的文件系统格式 fee表示不创建文件系统 34 | diskutil eraseDisk free usb disk2 #分区表将变为GPT类型,且自动创建EFI 分区 35 | #可挂载该efi分区 36 | 37 | #---挂载分区 38 | #diskutil mount 39 | diskutil mount disk2s1 40 | 41 | #创建为mbr分区表 42 | #diskutil eraseDisk 文件系统格式 硬盘名字 MBR 硬盘标志符 43 | ``` 44 | 45 | 46 | 47 | ## homebrew相关 48 | 49 | - [homebrew-rmtree](https://github.com/beeftornado/homebrew-rmtree) `brew rmtree` 删除安装自formula仓库的软件包及其依赖 50 | 51 | ```shell 52 | brew tap beeftornado/rmtree #安装 53 | brew rmtree git #使用示例 54 | ``` 55 | 56 | - [brew-cask-upgrade](https://github.com/buo/homebrew-cask-upgrade) `brew cu` 检查和更新安装自cask仓库的应用 57 | 58 | ```shell 59 | brew tap buo/cask-upgrade #安装 60 | brew cu #检查 如有更新会提示 61 | brew cu -ay #检查并同意自动更新 62 | ``` 63 | 64 | - [mas](https://formulae.brew.sh/formula/mas) `mas` 通过命令行更新app store应用 65 | 66 | ```shell 67 | brew install mas #安装 68 | mas upgrade 69 | ``` 70 | 71 | 72 | 73 | ## 剪切板 74 | 75 | - pbcopy 复制到剪切板 76 | - pbpaste 从剪切板粘贴 77 | 78 | ```shell 79 | cat file.txt |pbcopy 80 | pbcopy < file.txt 81 | 82 | pbpaste > newfile.txt 83 | ``` 84 | 85 | 86 | 87 | ## 消息提示osascript 88 | 89 | ```shell 90 | osascript -e 'display notification "text1" with title "title1"' 91 | ``` 92 | 93 | 弹出消息的标题是title1,内容是text1。 94 | 95 | 96 | 97 | ## 获取文件路径 98 | 99 | ```shell 100 | #!/bin/bash 101 | path=$(cd $(dirname $0); pwd -P) 102 | ``` 103 | 104 | -------------------------------------------------------------------------------- /programming/GCC编译.md: -------------------------------------------------------------------------------- 1 | # 交叉编译 2 | 3 | 以在amd64(x86_64)上编译aarch64(arm64)程序为例。 4 | 5 | 1. 安装aarch64的C编译器,例如aarch64-linux-gnu-gcc 6 | 7 | 2. 指定C编译器和目标系统类型和当前系统类型 8 | 9 | ```shell 10 | CC=aarch64-linux-gnu-gcc ./configure \ 11 | --host=aarch64-linux-gnu \ 12 | --build=x86_64-linux-gnu 13 | ``` 14 | 15 | `--build` 当前系统的类型(非必要),一般configure脚本都会检测当前系统类型 16 | 17 | `--host` 目标系统的类型 18 | 19 | 20 | 21 | 在GNU构建系统中,系统类型的名字通常由三部分构成: 22 | 23 | - CPU类型 24 | - 厂商 25 | - 操作系统 26 | 27 | 这三部分通过破折号连接在一起,形成了一个称为“三元组”的字符串,例如`x86_64-pc-linux-gnu` 28 | -------------------------------------------------------------------------------- /programming/R-lang-basic.md: -------------------------------------------------------------------------------- 1 | # 运行R 2 | 3 | 以下示例中R文件名为`~/file.R`,且`Rscript`位于`/usr/bin/Rscript`。 4 | 5 | - 交互式运行 -- R命令行 6 | 7 | `R`运行后将进入R的命令行,可以用以下方式运行R代码: 8 | 9 | - 直接输入命令:如`getwd()` 10 | - 载入写好的R文件:`source("~/file.R")` 11 | 12 | - 脚本运行 -- 使用`Rscritp` 13 | 14 | - 前台运行 15 | 16 | - `~/file.R` 17 | 18 | 要求: 19 | 20 | - 该R文件需要有可执行权限 `chmod +x ~/file.R` 21 | - 该R文件头部需要添加shebang: `#!/usr/bin/Rscript`或`#!/usr/bin/env Rscript` 22 | 23 | - `Rscript ~/file.R` 24 | 25 | 无需shebang和可执行权限 26 | 27 | - `R --slave -f ~/file.R` 28 | 29 | 无需shebang和可执行权限 30 | 31 | - 后台运行 32 | 33 | 输出内容将写入到与脚本文件同名切后缀为Rout的文件中,此例子中为`file.Rout`。 34 | 35 | ```shell 36 | R CMD BATCH --args ~/file.R 37 | #或 38 | R CMD BATCH ~/file.R 39 | ``` 40 | 注意:实际上该方法执行的r脚本会一直等待计算完成才返回shell的提示符,想要使其后台运行可在命令后添加`&`放入后台,如: 41 | ```shell 42 | R CMD BATCH ~/file.R & 43 | #使用nohup忽略挂起信号 避免该命令被终止 44 | nohup R CMD BATCH ~/file.R & 45 | ``` 46 | 或可使用scree/tmux之类的工具运行r脚本避免其进程被挂断。 47 | - 在bash脚本中插入R 48 | 49 | 使用EOF将R语言代码传递给`R --slave [option]`执行(option是R的其他可选参数): 50 | 51 | ```bash 52 | #!/bin/sh 53 | echo "this is a bash script" 54 | echo "=====these are R lang codes below=====" 55 | # R 56 | R --slave <,[mode,...]) #返回文件对象用于读写 7 | #do something 8 | f.close() #关闭 9 | ``` 10 | 11 | `open()`不指定mode时,默认为`rt`(read text),以文本模式读。 12 | 13 | 读写模式: 14 | 15 | - `r`:读read 16 | - `w`:写write(清空内容) 17 | - `a`:追加写append(不清空已有内容,等同于`w+`) 18 | - `x`:新建文件并写入create(文件已经存在时会报错) 19 | - `+`模式可读写,写为追加写,等同于`rw+` 20 | - `r+`模式可读写,写模式将清空已有内容,等同于`rw` 21 | 22 | 读写数据类型: 23 | 24 | - `t` 文本(text,默认模式) 25 | - `b` 二进制(binary) 26 | 27 | 28 | 29 | 使用with语句读写文件,无需显式编写`close()`代码: 30 | 31 | ```python 32 | with open(,[mode,...]) as f: 33 | #do something 34 | ``` 35 | 36 | 37 | 38 | # 文件读取 39 | 40 | 使用`open()`打开文件,返回一个可迭代的文件对象,例如返回的对象命名为f,可对f使用以下方法读取: 41 | 42 | - `read()` 方法 `f.read()`一次性读取所有内容,返回一个字符串。 43 | - `readlines()` 方法`f.readlines()`一次性读取所有行,返回以行内容字符串作为元素的列表 44 | - `readline()` 方法`f.readline()`每次迭代读取一行,返回一个字符串 45 | - 使用for循环迭代文件对象,按行读取 46 | ```python 47 | with open('/etc/hosts','r') as f: 48 | for line in f: 49 | #do something 50 | ``` 51 | 52 | **一次性读取所有内容到内存操作更快;按行读取占用内存更小。** 53 | 54 | - 文件对象可迭代,因此也可使用`next()`函数按行读取,`next(f)`返回当前迭代的行的内容(字符串)。 55 | 56 | 57 | 58 | ## 检测编码chardet 59 | 60 | 读取文件默认使用`UTF-8`,可在`open()`函数中使用`encoding=`参数指定编码格式。 61 | 62 | 对于不能确定文件编码的情况,可使用chardet模块检查编码: 63 | 64 | ```python 65 | import chardet 66 | with open('file1','r') as f 67 | res=chardet.detect(f) #返回类似{'encoding': 'EUC-JP', 'confidence': 0.99} 68 | ``` 69 | 70 | 返回值的`confidence`是猜测编码的准确率。 71 | 72 | 读取一个大文件,无需全部读取读完,可使用`universaldetector`(非贪婪模式): 73 | 74 | ```python 75 | import chardet 76 | detector = chardet.universaldetector.UniversalDetector() 77 | with open(file, 'rb') as f: 78 | for line in f.readlines(): 79 | detector.feed(line) 80 | if detector.done: 81 | detector.close() #返回类似{'encoding': 'EUC-JP', 'confidence': 0.99} 82 | break 83 | ``` 84 | 85 | 86 | 87 | # 文件写入 88 | 89 | 示例: 90 | 91 | ```python 92 | with open('output_file', 'w', newline='') as f: 93 | #一些写入示例 94 | print('world',f) 95 | f.write(b'hello') #二进制 96 | f.write('new_info'.encode('utf-8')) 97 | f.writelines('a line with \n or \r\n') 98 | ``` 99 | 100 | 换行符`newline`参数默认值为`None`,表示写入当前系统的默认换行符。 101 | 102 | 103 | 104 | # 字符串I/O 105 | 106 | 使用操作类文件对象的程序来操作字符串I/O,可使用: 107 | 108 | - `io.StringIO()` 用于文本数据 109 | - `io.BytesIO()` 用于二进制数据 110 | 111 | ```python 112 | import io 113 | 114 | s=io.StringIO() 115 | s.write('111') 116 | s.getvalue() #'111' 117 | s.close() 118 | ``` 119 | 120 | 121 | 122 | # 展开`~`为家目录 123 | 124 | 因为`~`不会被扩展识别为当前用户的家目录路径,可使用一下子方法实现: 125 | 126 | ```python 127 | os.path.expanduser('~/abc') 128 | #或者调用shell去执行: 129 | os.system("mkdir -p ~/abc") 130 | ``` 131 | 132 | # 临时文件和目录 133 | 134 | `TemporaryFile`模块 135 | 136 | - 临时目录 137 | 138 | ```python 139 | from tempfile import TemporaryDirectory 140 | 141 | with TemporaryDirectory() as dirname: 142 | print('dirname is:', dirname) 143 | # Use the directory 144 | ... 145 | # Directory and all contents destroyed 146 | ``` 147 | 148 | - 临时文件 149 | 150 | - `TemporaryFile()` 151 | 152 | 在大多数Unix系统上, `TemporaryFile()` 创建的文件都是匿名的,无法获取路径 153 | 154 | - `NamedTemporaryFile()` 155 | 156 | 有名称的临时文件 157 | 158 | ```python 159 | from tempfile import NamedTemporaryFile 160 | 161 | with NamedTemporaryFile('w+t') as f: 162 | f.write('Hello World\n') 163 | # Seek back to beginning and read the data 164 | f.seek(0) 165 | data = f.read() 166 | print('file is : ', f.name) 167 | ``` 168 | 169 | 170 | 171 | # 序列化对象 172 | 173 | > 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。 174 | 175 | 反序列化则相反,将序列化后的内容还原。 176 | 177 | 178 | 179 | pickle模块: 180 | 181 | 仅用于python对象,将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输。 182 | 183 | 序列化后的内容只能在Python内部使用。 184 | 185 | 反序列化则将存储的字节流内容创建python对象。 186 | 187 | - 序列化对象 188 | 189 | - 存储到文件:`pickle.dump()` 190 | - 转换为字符串:`pickle.dumps()` 191 | 192 | - 反序列化对象 193 | 194 | - 从文件中恢复:`pickle.load()` 195 | - 从字符串恢复:`pickle.loads()` 196 | 197 | 198 | 199 | json模块:也提供了`dumps()`、`dump()`、`loads()`、`load()`,与`pickle`用法一致,唯一的区别在于**JSON序列化后的格式为字符型**。 200 | 201 | 202 | 保存序列化对象到文件: 203 | 204 | ```python 205 | import pickle 206 | 207 | data = [1,2,3] 208 | f = open('somefile', 'wb') 209 | pickle.dump(data, f) 210 | f.close() 211 | ``` 212 | 213 | 注意: 214 | 215 | > 不要对不信任的数据使用pickle.load()。 216 | > pickle在加载时有一个副作用就是它会自动加载相应模块并构造实例对象。 217 | 218 | 从文件中读取并还原被序列化的对象: 219 | 220 | ```python 221 | f = open('somefile', 'rb') 222 | data = pickle.load(f) 223 | f.close() 224 | ``` 225 | -------------------------------------------------------------------------------- /programming/rust-basic.md: -------------------------------------------------------------------------------- 1 | rust 2 | 3 | --- 4 | 5 | # 环境搭建 6 | 7 | - rust RUST编译器(根据需要安装对应操作系统的rust) 8 | - [cargo](https://crates.io/) RUST项目管理器(一般集成在rust包中) 9 | - [rustup](https://www.rustup.rs/) 可方便地安装和管理多个操作系统(windows、mac、android等)和架构(x86、x86_64、arm等)的rust工具 10 | 11 | 12 | 13 | ## rustup 14 | 15 | 选择安装rustup方便管理多个平台的rust。 16 | 17 | - 镜像源 18 | 19 | 可根据需要添加更快的镜像源。例如: 20 | - [tuna rsutup](https://mirror.tuna.tsinghua.edu.cn/help/rustup/) 21 | 22 | - [ustc rustup](https://mirrors.ustc.edu.cn/help/rust-static.html) 23 | 24 | ```shell 25 | export CARGO_HOME=xx 26 | export RUSTUP_HOME=xxx 27 | 28 | export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static 29 | export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup 30 | 31 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 32 | ``` 33 | 34 | 35 | 36 | - 工具链安装 37 | 38 | ```shell 39 | rustup toolchain list #当前安装的所有版本rust工具链 40 | rustup default #查看当前默认版本rust 41 | #查看当前默认的stable版本rust 42 | rustup default stable #如果尚未安装将自动安装 43 | #查看所有可安装的rust版本 44 | rustup target list 45 | 46 | #安装指定版本rust 47 | rustup toolchain install 48 | #toolchain由两部分组成,前者可为stable、nightly、beta、1.2(版本号)等组成 49 | #后者以架构加平台名字构成,可从rustup list列表中获取 50 | rustup toolchain install stable #stable-x86_64-unknown-linux-gnu 51 | ``` 52 | 53 | 54 | 55 | ## 环境变量 56 | 57 | rust常用环境变量示例 58 | 59 | ```shell 60 | export CARGO_HOME="~/.cargo/" 61 | export RUSTBINPATH="~/.cargo/bin" 62 | export RUST="~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu" 63 | export RUST_SRC_PATH="$RUST/lib/rustlib/src/rust/src" 64 | export PATH=$PATH:$RUSTBINPATH 65 | ``` 66 | 67 | 68 | 69 | ## 开发环境 70 | 71 | - IDE及插件:参看[rust dev tools](https://www.rust-lang.org/zh-CN/tools) 72 | 73 | - rls 为各种IDE或编辑器提供Rust语言服务器协议实现以方便调试 74 | 75 | ```shell 76 | #一些开发工具需要Rust源代码来提供更好的自动完成、跳转到定义等功能 77 | rustup component add rust-src 78 | 79 | #一个独立项目,实现了 Language Server Protocol (LSP) 的 Rust 语言服务器 80 | rustup component add rust-analyzer 81 | 82 | #rustfmt代码格式化 clippy静态代码分析 83 | component add rustfmt clippy 84 | ``` 85 | 86 | rust官方也提供一个名为`rust-analysis` 的分析工具以及LSP工具`rls`,它们是 `rustc`(Rust 编译器)的一部分,用于生成 Rust 代码的静态分析数据。 87 | 88 | - clippy 提供lint校验 89 | 90 | ```shell 91 | rustup component add clippy 92 | ``` 93 | 94 | - rustfmt 代码格式化 95 | 96 | ```shell 97 | rustup component add rustfmt 98 | ``` 99 | 100 | 101 | 102 | 103 | ## cargo 104 | 105 | Cargo 是 Rust 的构建系统和包管理器。 106 | 107 | - 创建项目 108 | 109 | ```shell 110 | cargo new hello_world 111 | ``` 112 | 113 | cargo项目结构: 114 | 115 | > - src/ 源码 116 | > - Cargo.toml 配置文件 117 | > - target/ 编译生成文件 118 | 119 | - 编译项目 120 | 121 | ```shell 122 | #编译debug 123 | cargo build #默认编译生成到 target/debug/下 124 | cargo run #编译并运行 125 | cargo check #仅检查是否可正确编译(速度快) 126 | #编译release 将会优化optimizations(耗时更长) 127 | cargo build --release 128 | ``` 129 | 130 | 131 | 132 | 133 | # 变量和常量 134 | 135 | 声明变量需要使用`let`关键字,变量值不可变(不可变变量),但是变量可以重复定义,后定义的变量将覆盖前面相同的变量;如果额外使用`mut`关键字修饰,则变量值可变: 136 | 137 | ```rust 138 | let x=1; //不可再次赋值 139 | x=2; //error 140 | let mut y = 5; //mut让变量值可变 141 | y=6; 142 | ``` 143 | 144 | 145 | 146 | 声明常量 (constants)使用`const`关键字,常量绑定到一个名称的不允许改变的值,不可以使用`mut`关键字使其可变;常量**只能被设置为常量表达式**,不可以是其他任何只能在运行时计算出的值。 147 | 148 | 149 | 150 | # 数据类型 151 | 152 | rust是静态类型(*statically typed*)语言,编译时就必须知道所有变量的类型。 153 | 154 | - 标量类型 155 | 156 | - 整型:没有小数部分的数字 157 | 158 | | 长度 | 有符号 | 无符号 | 159 | | ------- | ------- | ------- | 160 | | 8-bit | `i8` | `u8` | 161 | | 16-bit | `i16` | `u16` | 162 | | 32-bit | `i32` | `u32` | 163 | | 64-bit | `i64` | `u64` | 164 | | 128-bit | `i128` | `u128` | 165 | | arch | `isize` | `usize` | 166 | 167 | - 浮点型 168 | 169 | - 布尔类型 170 | 171 | - 字符类型 172 | 173 | - 174 | -------------------------------------------------------------------------------- /programming/web-frontend/dom-event-事件相关.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 事件流 4 | 5 | > 页面中接收事件的**顺序**。 6 | 7 | ## 事件模型:冒泡 与 捕获 8 | 9 | 假如目标元素是div,二者的接收顺序分别如下: 10 | 11 | - 冒泡:div>body>html>Document 12 | - 捕获:Document>html>body>div 13 | 14 | ## DOM事件流 15 | 16 | W3C标准采用了捕获+冒泡的模型,即DOM事件流。 17 | 18 | DOM标准规定(DOM2级)事件流包括三个阶段,按顺序为: 19 | 20 | 1. 事件**捕获**阶段——**事件从Document开始传播** 21 | 22 | 注: 23 | 24 | - 实际上浏览器是从window对象开始捕获的。 25 | - “DOM2级事件标准规范”规定,事件捕获阶段不会涉及事件目标对象,但在浏览器中捕获阶段也会触发目标对象上的事件。(也就是有两次机会在目标对象上面操作事件) 26 | 27 | 28 | 2. 处于**目标**阶段——**事件在目标上发生并处理**(执行事件处理程序) 29 | 30 | 注:事件处理会被看成是冒泡阶段的一部分。 31 | 32 | 3. 事件**冒泡**阶段——**事件传播回Document** 33 | 34 | --- 35 | 有些事件是可以取消的,在整个事件流的任何位置通过调用事件的stopPropagation方法可以停止事件的传播过程。参看后文[事件对象的属性和方法](#事件对象的属性和方法) 36 | 37 | 此外: 38 | 39 | > 所有的事件都要经过捕获阶段和处于目标阶段,但是有些事件会跳过冒泡阶段。 40 | 41 | 例如:focus事件(获取焦点)和的blur事件(失去焦点)会跳过冒泡阶段。 42 | 43 | # 事件处理程序 44 | 45 | ## HTML事件处理程序 46 | 47 | 在HTML标签中添加事件属性,该属性的值为要执行的脚本代码或者要调用的函数。 48 | 49 | ```html 50 | 51 | 52 | 53 | 54 | 59 | ``` 60 | 61 | ## DOM0级事件处理程序 62 | 63 | 将函数赋值给一个事件处理程序的属性: 64 | 65 | 1. 取得要操作的对象 66 | 67 | 2. 将一个函数赋值给该对象的事件处理程序属性。(事件名前面要用on,如click事件写成`onclick`) 68 | 69 | 删除事件处理程序方法:将事件处理程序属性设置为`null`; 70 | 71 | ```javascript 72 | var ele=document.getElementById("btn");//取得一个id名为btn的元素对象 73 | btn.onclick=function(){ //添加事件处理程序 74 | alert('hi'); 75 | } 76 | btn.onclick=function(){ 77 | alert('yes') //会覆盖前面的事件处理程序 78 | } 79 | btn.onclick=null; // 删除事件处理程序 80 | ``` 81 | 82 | 实际上没有DOM0官方标准,1998 年 10 月 才有W3C的DOM1级推荐规范,DOM1级推出时并没有添加增加事件功能,而此前的事件功能的实现被习惯称为DOM0级。(IE4和Netscape 4.0这些浏览器最初支持的DHTML)。 83 | 84 | ## DOM2级事件处理程序 85 | 86 | 1. 取得要操作的对象 87 | 2. 向该对象添加`addEventListene() `方法,该方法有三个参数: 88 | - type事件类型 89 | - listener事件处理程序:该事件的处理函数(或实现了EventListener 接口的对象) 90 | - options参数对象(可选):包含三个属性(属性值均为布尔值,默认false) 91 | - capture 事件处理程序是否在事件**捕获阶段**传播到该 EventTarget 时触发 92 | - once 事件处理程序是否调用(一次)之后被**自动移除** 93 | - passive 事件处理程序是否调用 `preventDefault()` 94 | - useCapture使用捕获(可选) 布尔值 默认false 95 | 96 | ```javascript 97 | var btn=document.getElementById("btn"); 98 | var fn=function(){ //事件处理的方法 99 | alert(this.id); 100 | }; 101 | btn.addEventListener('click', fn, { 102 | capture: false, 103 | once: false, 104 | passive: false 105 | },false) ; //添加 106 | 107 | btn.removeEventListener("click",fn,false); //删除 108 | ``` 109 | 110 | 注意:DOM2级事件,同一节点的**相同事件的多个事件处理程序中,后面的事件处理程序并不会覆盖前面的事件处理程序,而是会按先后顺序叠加执行**,故而:对于某节点可能出现反复绑定同一事件处理程序的情况,一定记得在下一次绑定该事件处理程序前**适时地解除事件绑定**!**或改为DOM0级事件进行前后覆盖。** 111 | 112 | 删除事件处理程序用 `removeEventListener()` 113 | 114 | IE8-使用`attachEvent()`和`deattatchEvent()`(事件名前面要用on,如click事件写成`onclick`) 115 | 116 | ## DOM3级事件处理程序 117 | 118 | 在DOM2基础上添加一些新的事件(如input、textInput、Location),对不同类型事件进行了重新定义和分类(如UI、焦点、鼠标、滚轮等等类)。 119 | 120 | 121 | # 事件对象 122 | 123 | > 在触发DOM上的某个事件时,会在事件处理程序函数中会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。 124 | 125 | - 事件对象——W3C标准规定,事件对象通过事件函数的第一个参数(参数名随意)传入,但是一些浏览器中自带event对象,兼容性写法示例: 126 | 127 | ```javascript 128 | ele.onclick=function(ev){ 129 | var e=ev||event; //或window.event 130 | //some codes need Event object 131 | } 132 | ``` 133 | 134 | ## 事件对象的属性和方法 135 | 136 | 以下是常用的属性和方法: 137 | 138 | - DOM事件对象的属性 139 | - target 触发此事件的节点 140 | - currentTarget 事件监听器触发该事件的节点 141 | 142 | target在事件流的目标阶段;currentTarget可在事件流任何阶段。currentTarget是事件处理程序当前正在处理事件的那个元素,只有当事件流处在目标阶段的时候,两个的指向才是一样的。 143 | 144 | - timeStamp 事件生成的日期和时间 145 | - type 当前 Event 对象表示的事件的名称 146 | - bubbles 事件是否是起泡事件类型 147 | - cancelable 事件是否可拥可取消的默认动作的属性(如果有—值为true,则能使用preventDefault()阻止事件的默认动作) 148 | - eventPhase 事件传播的当前阶段 149 | 150 | - DOM事件对象方法 151 | 152 | - preventDefault() 阻止事件的默认动作 153 | - stopPropagation() 中止事件传播 154 | - initEvent() 初始化新创建的 Event 对象的属性 155 | 156 | # 事件委托 157 | 158 | 将事件“委托”给父节点,事件触发时,根据一定的条件进行筛选,对实际触发该事件的元素对象添加处理程序。 159 | 160 | 例如对某ul下的多个li添加点击事件处理程序: 161 | 162 | ```javascript 163 | const list = document.getElementById('lists') //获取id为lists的ul对象 164 | list.addEventListener('click', fn) 165 | 166 | //给list对象绑定事件处理程序 167 | function fn(ev) { 168 | const e = ev || event 169 | const target = e.target //获取真正触发点击的元素 170 | 171 | switch (target.id) { //针对每个元素添加不同的事件处理程序 172 | case 'a': //id为a的li元素 173 | location.href = 'http://www.w3.org' 174 | break 175 | case 'b': //id为b的li元素 176 | alert('Me')解除事件绑定 177 | break 178 | // ... 179 | default: 180 | break 181 | } 182 | } 183 | ``` 184 | -------------------------------------------------------------------------------- /programming/web-frontend/proxy监听对象属性.md: -------------------------------------------------------------------------------- 1 | > [**Proxy**](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy) 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。 2 | 3 | 监听对象值的变化,实现只需修改值即可根据变化自动触发某些操作的功能。 4 | 5 | 创建proxy代理: 6 | 7 | ```javascript 8 | const proxy=new Proxy(target,handler) 9 | ``` 10 | 11 | - target 12 | 用Proxy包装的目标对象 13 | 14 | 任何类型的对象(可以是空对象`{}`),包括原生数组,函数,甚至另一个代理)。 15 | 16 | - handler 17 | 一个对象,其属性是当执行一个操作时定义代理的行为的函数。 18 | 19 | ```javascript 20 | var userInfo= new Proxy({}, { 21 | get(obj,prop,val) { 22 | console.log("get val!!!") 23 | } 24 | set(obj, prop, val) { 25 | if (prop === 'username' && val === 'admin') { 26 | console.log("hello, admin") 27 | //could do someting here 28 | } else { 29 | console.log("hello, dear user.") 30 | } 31 | obj[prop] = val 32 | return true 33 | } 34 | }) 35 | 36 | loginInfo.loginState=false 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /programming/位运算.md: -------------------------------------------------------------------------------- 1 | 位运算符作用于二进制数的位上。 2 | 3 | 用位运算就是直接对整数在内存中的二进制位进行操作,一些场景中使用位运算,其执行效率更高。 4 | 5 | 6 | 7 | # 数字的二进制表示方式 8 | 9 | 原码、反码、补码是有符号整数的三种不同表示方式,其中正数的原码、反码、补码一致。 10 | 11 | 12 | 13 | 计算机在存储一个数字时并不是直接存储该数字对应的二进制数字(原码),而是存储该数字对应二进制数字的补码。 14 | 15 | 原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程。 16 | 17 | 18 | 19 | *本小节例子的二进制位数为八位。* 20 | 21 | ```mermaid 22 | graph LR 23 | 0(计算机输入-1) --> 1(原码1000 0001) --> 2(反码1111 1110) --> 3(补码1111 1111) --> 4(内存) 24 | ``` 25 | 26 | 有符号的八位二进制数中,最大数是1000 0000,而左侧1表示`-`,但是`-0`并没有什么实际意义,因此这个数字被用以表示十进制整数`-128`(它也不存在原码和补码),这也可以解释为什么计算机中一个字节的取值范围是[-128,127]。 27 | 28 | 29 | 30 | - 原码 31 | 32 | 1位符号位+数字绝对值转换的二进制;符号位0表示正,1表示负。 33 | 34 | > +1 原码: 0000 0001 35 | > 36 | > -1 原码: 1000 0001 37 | 38 | 39 | 40 | - 反码 41 | 42 | 表示负数的一种方法,本质是通过取反实现正负的区分。 43 | 44 | - 正数的反码是其本身(即原码) 45 | - 负数的反码:符号位不变,对其余各位取反 46 | 47 | > +1 原码: 0000 0001 反码: 0000 0001 48 | > 49 | > -1 原码: 1000 0001 反码: 1111 1110 50 | 51 | ​ 52 | 53 | - 补码 54 | 55 | 补码是通过反码实现正负数区分的一种方式。 56 | 57 | - 正数的补码就是其本身(即原码),因此直接转换位十进制数字输出; 58 | - 负数的补码:第1位为1不变,其余为原码取反再加一 59 | 60 | > +1 原码:0000 0001 反码: 0000 0001 补码: 0000 0001 61 | > 62 | > -1 原码:1000 0001 反码: 1111 1110 补码: 1111 1111 63 | 64 | 65 | 66 | # 位运算 67 | 68 | 以下例子中除按位取非运算中均使用正数,略去了符号位以让描述更简约(并不影响计算结果的准确性)。 69 | 70 | 71 | 72 | ## & 位与 73 | 74 | 对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。 75 | 76 | ```python 77 | 1&2 == 0 78 | # 01 79 | # 11 80 | # 01 --> 1 81 | ``` 82 | 83 | 84 | 85 | ## | 位或 86 | 87 | 对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。 88 | 89 | ```python 90 | 1|2 == 3 91 | 92 | # 01 93 | # 11 94 | # 11 --> 3 95 | ``` 96 | 97 | 98 | 99 | ## ^位异或 100 | 101 | 对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。 102 | 103 | ```python 104 | 1^2 == 3 105 | # 01 106 | # 10 107 | # 11 -> 3 108 | ``` 109 | 110 | 111 | 112 | ## ~ 位非 113 | 114 | 对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。 115 | 116 | ```python 117 | ~1 == -2 118 | ``` 119 | 120 | 121 | 122 | 1. 十进制2用八位二进制表示为:`0000 0001` (原码即补码——正数) 123 | 124 | 2. 对二进制的`0000 0001`取反得到:`1111 1110` 125 | 126 | 由于的符号位是1,计算机认为这是一个负数的**补码**,负数输出时先按规则处理: 127 | 128 | - 符号位不变,符号为`-` 129 | 130 | - 补码减一取反得原码 131 | 132 | 1. 二进制计算`1111 1110`减`1` 得到 `1111 1101` 133 | 134 | > ```shell 135 | > 1111 1110 136 | > - 0000 0001 137 | > 1111 1101 #10 - 01 -> 01 138 | > ``` 139 | 140 | 2. 上一步结果取反 141 | 142 | `1111 1101`取反得到`000 0010`即为二进制的`2` 143 | 144 | 3. 原码输出使进制数字即为`-2` 145 | 146 | 147 | 148 | ## << 左移位 149 | 150 | 将操作数的所有位向左移动指定的位数。左移 n 位相当于乘以 2 的 n 次方。二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 151 | 152 | ```python 153 | 5*2**3 == 5<<3 # 5x8 == 5*2**3 == 40 154 | ``` 155 | 156 | 157 | 158 | ## >> 右移位 159 | 160 | 将操作数的所有位向右移动指定的位数。右移n位相当于除以 2 的 n 次方。二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。 161 | 162 | ```python 163 | 40/2**3 == 40>>3 # 40/8 == 40/2**3 == 5 164 | ``` 165 | 166 | 167 | 168 | ### >>> 无符号右移位 169 | 170 | 丢弃各二进位全部右移若干位,高位补0,低位丢弃。某些语言不支持。 171 | 172 | ```java 173 | 12>>>2 == 3 174 | -12>>>2 == 1073741821 175 | ``` 176 | 177 | 178 | 179 | # 位运算使用技巧 180 | 181 | ## 判断奇偶数 182 | 183 | 用整数和1进行与运算,结果值为0则为偶数,否则为基数: 184 | 185 | ```python 186 | n&1 == 0 #为真则n为偶数,否则n为奇数 187 | ``` 188 | 189 | 190 | 191 | ## 判断正整数是否为2的幂 192 | 193 | ```python 194 | (n - 1) & n==0 #为真则n是2的幂 195 | ``` 196 | 197 | 198 | 199 | ## 不使用额外空间交换两个整数 200 | 201 | 如果两个变量的值都为整数,且希望交换两个变量的值,可使用按位异或: 202 | 203 | ```python 204 | a ^= b 205 | b ^= a 206 | a ^= b 207 | 208 | #如果语言支持连续^= 209 | #a ^= b ^= a ^= b 210 | 211 | #---需要额外空间的方法 212 | # 方法 1 使用临时变量 213 | # 方法 2 使用加减法 214 | a = a+b 215 | b = a-b 216 | a = a-b 217 | ``` 218 | -------------------------------------------------------------------------------- /test-benchmark/disk-io-testing硬盘测试.md: -------------------------------------------------------------------------------- 1 | [toc] 2 | 3 | # io监控工具 4 | 5 | - atop 6 | 7 | - iotop 8 | 9 | - iostat 10 | 11 | # 测试工具 12 | 13 | ## dd 14 | 15 | dd只能进行简单的单线程串行读写操作测试。 16 | 17 | ```shell 18 | if=/dev/zearo #读取的文件 19 | of=test_file #写入到该文件 20 | bs=4k #block size 每个块文件的大小 21 | count=64k #块文件个数 64k=64000 22 | time dd if=/dev/zero of=$of bs=$bs count=$count conv=fdatasync 23 | ``` 24 | 25 | if文件也可以是已经存在的一个文件。(创建一个测试用的大文件可以使用`fallocate -l `。) 26 | 27 | of文件位于要测试的硬盘的挂载目录中。 28 | 29 | `/dev/zero`输入设备,不停输出0,可以忽略其读取速度,用以测试纯写入。 30 | 31 | `/dev/null`空设备,抛弃任何输入的字符,可以忽略其写入速度,用以测试纯读取。 32 | 33 | `/dev/urandom` 随机数生成设备,可用以测试随机读写。 34 | 35 | conv和oflag/iflag参数的选择可按实际应用场景需要选择。 36 | 37 | - `conv` 38 | 39 | - `fdatasync` physically write output file data before finishing 40 | 41 | dd完成前将文件写入硬盘,读取所有数据到缓存后,最后将数据从缓存写入到硬盘 完全写到硬盘后返回完成,和平常使用场景类似。 42 | 43 | - `fsync` likewise (fdatasync), but also write metadata 同上,只是还要写入元数据 44 | 45 | - `sync` 在每个块左侧用NUL填充空值,遇到错误即使不是所有数据本身都可以包含在映像中,也会保留原始 数据(单纯dd测试用不上) 46 | 47 | - `iflag`/oflag 48 | 49 | - `dsync` use synchronized I/O for data 同步IO写入数据 每次一个数据块完全输出到磁盘后才返回完成,继续写入下一个数据块。(每次读取bs大小的文件,再写入到硬盘中,直到读写完毕) 50 | 51 | - `sync` likewise, but also for metadata 同上,只是还要写入元数据 52 | 53 | - `direct` direct I/O for data 54 | 55 | direct I/O 避免内核中整个缓存层并将I/O直接发送到磁盘。每个数据块完全完成后,再进行下一次IO,绕过缓存,用来测试硬盘的实际性能。 56 | 57 | - `nonblock` 非阻塞IO 58 | 59 | direct I/O和sync I/O: 60 | 61 | direct I/O从用户态直接跨过“**stdio缓冲区的高速缓存**”和“**内核缓冲区的高速缓存**”,直接写到存储上。 62 | 63 | sync I/O控制“**内核缓冲区的高速缓存**”直接写到存储上,即强制刷新内核缓冲区到输出文件的存储。 64 | 65 | IO流:用户数据 –> stdio缓冲区 –> 内核缓冲区高速缓存 –> 磁盘 66 | 67 | ## fio 68 | 69 | 参看[fio](fio.md) 70 | 71 | 72 | 73 | ## smallfile 74 | 75 | [Smallfile](https://github.com/distributed-system-analysis/smallfile)用于分布式文件系统的小文件IO测试 76 | 77 | 78 | 79 | ## ior 80 | 81 | 测试元数据性能。 82 | 83 | 84 | 85 | ## iozone 86 | 87 | 参看[iozone](iozone.md) 88 | 89 | # 其他测试工具 90 | 91 | - hparm 92 | - gnome-disks的测试工具 -------------------------------------------------------------------------------- /test-benchmark/iops.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # IOPS和数据吞吐量 4 | 5 | IOPS即Input/Output Operations per Second,每秒钟处理的I/O次数。 6 | 7 | **IOPS是衡量在随机读写频繁的应用(大量小文件的读写如图片、数据库、邮件服务器等)场景下的重要衡量指标。** 8 | 9 | > IOPS的数值会随系统配置而有很大的不同,依测试者在测试时的控制变因而异,控制变因包括读取及写入的比例、其中[循序访问](https://zh.wikipedia.org/wiki/循序存取)及[随机存取](https://zh.wikipedia.org/wiki/隨機存取)的比例及配置方式、[线程](https://zh.wikipedia.org/wiki/线程)数量及访问队列深度,以及资料区块的大小。其他因素也会影响IOPS的结果,例如系统设置、存储设备的[驱动程序](https://zh.wikipedia.org/wiki/驅動程式)、操作系统后台运行的作业等。若在测试[固态硬盘](https://zh.wikipedia.org/wiki/固态硬盘)时,是否先进行预调(preconditioning)机制也会影响IOPS的结果. 10 | 11 | 顺序读写频繁的应用(传输大量连续数据--如视频编辑)场景,主要关注连续读写性能,其重要衡量指标是数据吞吐量,即单位时间内(一般是每秒)的I/O流量。 12 | 13 | # IOPS计算 14 | 15 | 机械硬盘一次IO操作流程如下: 16 | 17 | 1. IO指令发起 18 | 19 | 即控制器对磁盘发出一个IO操作指令 20 | 21 | 2. 机械臂寻址 -- 磁头移动到目标磁道正上方 22 | 23 | 磁盘的驱动臂(Actuator Arm)带读写磁头(Head)离开着陆区(Landing Zone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为**寻址时间**(ST, **Seek** **T**ime),一般取多次测试的平均寻址时间。 24 | 25 | *当前(2020年)主流技术制造的产品寻址时间为3ms-15ms* 26 | 27 | 3. 等待读取扇区 -- 磁头在目标磁道上方等待目标扇区就位 28 | 29 | 找到对应磁道不一定能马上读取数据,需要等待盘片(Platter)旋转到初始数据块所在的扇区(Sector),磁头落在读写磁头正上方的之后才能开始读取数据,该过程中消耗的时间称为**旋转延时**(RD, **R**otational **D**elay,一般单位为毫秒ms),最坏的情况就是盘片旋转整整一圈(360度)之后磁头才能读取到数据,所以一般取均值即旋转半圈(0度-360度的均值为180度)的消耗时间: 30 | $$ 31 | RD = 60 / RPM / 2 32 | $$ 33 | *RPM即**R**evolution(s) **P**er **M**inute,每分钟转速。* 34 | 35 | 例如7200转硬盘理论旋转延时=60/7200/2,约4.1666ms。 36 | 37 | 4. 读写数据 -- 磁头读写数据 38 | 39 | 接着,随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(Data Transfer),该过程的时间称为**传送时间**(Transfer Time)。磁盘参数会提供其最大读写速度,要达到这种速度是很有难度的(目前--2020年可以理解为远远达不到),消耗的时间很短,在用于计算测试指标时可以忽略不计。 40 | 41 | 一次IO消耗时间=寻址时间+旋转延时+传送时间 42 | 43 | 于是得出每秒IO次数IOPS计算公式(忽略到耗时极短的数据传送时间): 44 | $$ 45 | IOPS = 1000/ ( RD + ST ) 46 | $$ 47 | 48 | 49 | 最常用的量测的指标是“随机存取”及“循环访问”。 50 | 51 | | 量测 | 说明 | 52 | | :----------: | :--------------------------------------: | 53 | | 总IOPS | 每秒读写次数的总和(混合读取及写入测试) | 54 | | 随机读取IOPS | 每秒平均的随机读取次数 | 55 | | 随机写入IOPS | 每秒平均的随机写入次数 | 56 | | 循序读取IOPS | 每秒平均的循序读取次数 | 57 | | 循序写入IOPS | 每秒平均的循序写入次数 | 58 | 59 | 机械硬盘或是其他类似的机电存储设备,其随机存取IOPS主要和存储设备的寻址时间有关; 60 | 61 | 固态硬盘及其他固态电子设备,其随机存取IOPS主要和存储设备的内部控制器及记亿体接口速度有关。 62 | 63 | 循序访问的IOPS公式如下: 64 | $$ 65 | IOPS * TransferSize = Bytes/Sec 66 | $$ 67 | TransferSize即传输大小单位为Byte,计算完毕一般转换为MB之类的单位便于阅读。 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /test-benchmark/memory-test.md: -------------------------------------------------------------------------------- 1 | ## memtester内存正确性验证工具 2 | 3 | > Utility to test for faulty memory subsystem. 4 | 5 | 下载[memtester](https://github.com/jnavila/memtester)使用make编译即可。 6 | 7 | 测试方法: 8 | 9 | ```shell 10 | #memtester [-p physaddrbase] [runs] 11 | memtester 100G 1 #申请100G内存,测试1次 12 | ``` 13 | 14 | - `-p` 指定申请内存的开始地址 15 | - `` 指定要申请的内存大小 16 | - `` 指定要重复测试的次数(如不指定则为无限次,需要自行终止) 17 | 18 | 测试结果中正常的项会输出OK,输出示例(部分内容): 19 | 20 | > Stuck Address : ok 21 | > Random Value : ok 22 | > Compare XOR : ok 23 | > Compare SUB : ok 24 | > Compare MUL : ok 25 | > Compare DIV : ok 26 | > Compare OR : ok 27 | > Compare AND : ok 28 | > Sequential Increment: ok 29 | > Solid Bits : ok 30 | > Block Sequential : ok 31 | > Checkerboard : ok 32 | > Bit Spread : ok 33 | > Bit Flip : ok 34 | > Walking Ones : ok 35 | > Walking Zeroes : ok 36 | > 8-bit Writes : ok 37 | > 16-bit Writes : ok 38 | 39 | 如不需要测试某些项,可以通过修改memtester.c文件中`struct test tests[]`结构体内容,注释掉无需测试的项后重现make编译,例如: 40 | 41 | 42 | 43 | ## stream内存带宽测试工具 44 | 45 | [Stream](https://github.com/jeffhammond/STREAM)用于测量持续内存带宽, 具有良好的空间局部性,是对TLB友好,Cache友好的一款测试程序,其分为Copy、Scale、Add和Triad四个更基本的测试功能。 46 | 47 | 获取[stream.c](https://www.cs.virginia.edu/stream/FTP/Code/stream.c)源码,编译后使用: 48 | 49 | ```shell 50 | #wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c 51 | #gcc -O stream.c -o stream #一般编译 单线程,使用源码默认的STREAM_ARRAY_SIZE值 52 | 53 | #--自定义参数编译 54 | #这里lscpu获取的值单位是k,如果不是k,根据具体情况进行换算 55 | L3_cache=$(lscpu|grep 'L3 cache'|awk '{print $NF}'|grep -oE '[0-9]+') #N kbytes 56 | cpu_sockets=$(lscpu|grep 'Socket(s)'|awk '{print $NF}') 57 | multiple=8 #一般为cpu3级缓存的4倍即可 58 | STREAM_ARRAY_SIZE=$(($L3_cache*1024*$multiple*$cpu_sockets/8)) 59 | NTIMES=16 60 | mcmodel_param='' 61 | #STREAM_ARRAY_SIZE大于2gb时 62 | [ $STREAM_ARRAY_SIZE -le $((1024*1024*1024*2)) ] && $mcmodel_param='-mcmodel=medium' 63 | gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=$STREAM_ARRAY_SIZE -DNTIMES=$NTIMES $mcmodel_param stream.c -o stream 64 | 65 | #运行stream测试 66 | #./stream #简单测试 67 | 68 | #先指定运行线程和系统线程数一致(linux中nproc可以得到这个数值) 69 | export OMP_NUM_THREADS=$(nproc) 70 | ./stream 71 | ``` 72 | 73 | 编译参数: 74 | 75 | - -O3 76 | 77 | 指定最高编译优化级别为3(一般不指定时为O0) 78 | 79 | 80 | 81 | - -fopenmp:多线程支持,fopenmp为gcc使用 82 | 83 | icc为-openmp,pgcc为-mp,Open64的opencc为-openmp 84 | 85 | 多处理器环境最好启用以获得到内存带宽实际最大值。 86 | 87 | 开启后,运行stream时如不指定线程数量,则程序默认运行线程为CPU线程数。 88 | 89 | 90 | 91 | - -DSTREAM_ARRAY_SIZE=20000000 92 | 93 | 指定测试数组a[]、b[]、c[]的大小(Array size),该值对测试结果影响较大。必须设置测试数组大小远大于CPU 最高级缓存(一般为L3 Cache)的大小,否则测试时会因为CPU缓存的作用而获得更高的虚假值,其并内存吞吐性能的值。 94 | 95 | (根据stream.c源码)一般建议是STREAM_ARRAY_SIZE必须至少是系统中最高级别缓存的4倍(可以更高,可调高倍数后再次测试),且测试数组类型为双精度浮点,单个数组的占用内存为STREAM_ARRAY_SIZE*8字节,因此STREAM_ARRAY_SIZE推荐计算公式: 96 | $$ 97 | SIZE=CPU最高级别缓存(KB)*1024*4*CPU颗数/8 98 | $$ 99 | *注意:根据实际的cpu缓存值的单位进行换算得到以Byte为单位的值。* 100 | 101 | 102 | 103 | - -DNTIMES=10:执行的次数(默认10) 104 | 105 | stream的输出结果是所有次测试结果中最优的一次 106 | 107 | 108 | 109 | - stream.c:待编译的源码文件 110 | 111 | 112 | 113 | - stream:输出的可执行文件名 114 | 115 | 其他可用参数 116 | 117 | - -mtune=native -march=native:针对CPU指令的优化,此处由于编译机即运行机器。故采用native的优化方法。更多编译器对CPU的[优化参考](http://gcc.gnu.org/onlinedocs/gcc-4.5.3/gcc/i386-and-x86_002d64-Options.html) 118 | - -mcmodel=medium ;当STREAM_ARRAY_SIZE过大(一般<=2GB时)需要设置此参数 119 | - -DOFFSET=4096 ;数组的偏移,一般可以不定义 120 | - -DSTREAM_TYPE=double :默认值为double即双精度测试,一般无需更改,单精度改为float 121 | 122 | -------------------------------------------------------------------------------- /windows/reg-files/get-administrator-permission-in-right-click-menu.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | [HKEY_CLASSES_ROOT\*\shell\runas] 3 | @="管理员取得所有权" 4 | "NoWorkingDirectory"="" 5 | [HKEY_CLASSES_ROOT\*\shell\runas\command] 6 | @="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F" 7 | "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F" 8 | [HKEY_CLASSES_ROOT\exefile\shell\runas2] 9 | @="管理员取得所有权" 10 | "NoWorkingDirectory"="" 11 | [HKEY_CLASSES_ROOT\exefile\shell\runas2\command] 12 | @="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F" 13 | "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F" 14 | 15 | [HKEY_CLASSES_ROOT\Directory\shell\runas] 16 | @="管理员取得所有权" 17 | "NoWorkingDirectory"="" 18 | [HKEY_CLASSES_ROOT\Directory\shell\runas\command] 19 | @="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t" 20 | "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t" -------------------------------------------------------------------------------- /windows/reg-files/remove-get-administrator-permission-from-right-click-menu.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | [-HKEY_CLASSES_ROOT\*\shell\runas] 3 | [-HKEY_CLASSES_ROOT\Directory\shell\runas] 4 | [-HKEY_CLASSES_ROOT\dllfile\shell] 5 | [-HKEY_CLASSES_ROOT\Drive\shell\runas] 6 | [-HKEY_CLASSES_ROOT\exefile\shell\runas] 7 | [HKEY_CLASSES_ROOT\exefile\shell\runas] 8 | "HasLUAShield"="" 9 | [HKEY_CLASSES_ROOT\exefile\shell\runas\command] 10 | @="\"%1\" %*" 11 | "IsolatedCommand"="\"%1\" %*" -------------------------------------------------------------------------------- /windows/reg-files/utc.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] 3 | "RealTimeIsUniversal"=dword:00000001 -------------------------------------------------------------------------------- /windows/reg-files/小鹤双拼.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS] 4 | "UserDefinedDoublePinyinScheme0"="XIAOHE*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt" 5 | -------------------------------------------------------------------------------- /windows/windows-terminal/Profile.ps1: -------------------------------------------------------------------------------- 1 | # $HOME/Documents/PowerShell/Profile.ps1 2 | 3 | # if your powershel version is lower than 6.0, you need to upgrade it first (Recommended): 4 | # winget install Microsoft.PowerShell 5 | # and then and open the new version of powershell 6 | # you can also set the new version of powershell as the default shell. 7 | 8 | # ===== Modules 9 | 10 | Invoke-Expression (&starship init powershell) 11 | 12 | #====== Aliases 13 | function ps_plugin_install { 14 | winget install --id Starship.Starship 15 | 16 | Install-Module -Name ZLocation -Scope CurrentUser -Force 17 | 18 | echo "Please restart your terminal to see the changes, or run . $PROFILE to reload the profile" 19 | 20 | echo "----" 21 | echo "a nerd font is required for the theme to work properly, you can download it from: https://www.nerdfonts.com/font-downloads" 22 | echo "" 23 | echo "after installing the font, you need to set it as the default font in your terminal" 24 | 25 | echo "!!! use the gruvbox-rainbow theme. To get more preset themes by: starship preset list" 26 | starship preset gruvbox-rainbow -o $HOME/.config/starship.toml 27 | } 28 | 29 | #nvim nvchad: git clone https://github.com/NvChad/starter $ENV:USERPROFILE\AppData\Local\nvim && nvim 30 | # ===== Alias 31 | Set-Alias vim nvim 32 | 33 | # ====== Bindkeys 34 | #ctrl a to move to the beginning of the line 35 | Set-PSReadLineKeyHandler -Chord "Ctrl+a" -Function BeginningOfLine 36 | #ctrl e to move to the end of the line 37 | Set-PSReadLineKeyHandler -Chord "Ctrl+e" -Function EndOfLine 38 | #ctrl k to delete from cursor to the end of the line 39 | Set-PSReadLineKeyHandler -Chord "Ctrl+k" -Function KillLine 40 | #ctrl u to delete from cursor to the beginning of the line 41 | Set-PSReadLineKeyHandler -Chord "Ctrl+u" -Function BackwardKillLine 42 | 43 | #ctrl d to exit the shell 44 | Set-PSReadLineKeyHandler -Chord "Ctrl+d" -Function ViExit 45 | 46 | # some PSReadLine default key bindings 47 | # #使用历史命令记录来应用自动补全 48 | # Set-PSReadLineOption -PredictionSource History 49 | 50 | # # 每次回溯输入历史,光标定位于输入内容末尾 51 | # Set-PSReadLineOption -HistorySearchCursorMovesToEnd 52 | 53 | # # 设置 Tab 为补全的快捷键 54 | # Set-PSReadLineKeyHandler -Key "Tab" -Function MenuComplete 55 | 56 | # # 设置 Ctrl + Z 为撤销 57 | # Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo 58 | 59 | # # 设置向上键为后向搜索历史记录 60 | # Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward 61 | 62 | # # 设置向下键为前向搜索历史纪录 63 | # Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward -------------------------------------------------------------------------------- /windows/windows-tips.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 启用gpedit 4 | 5 | ```cmd 6 | @echo off 7 | 8 | pushd "%~dp0" 9 | 10 | dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt 11 | 12 | dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt 13 | 14 | for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i" 15 | 16 | pause 17 | ``` 18 | 19 | 20 | 21 | # 禁止windows挂载某个硬盘 22 | 23 | 例如Linux+Windows双系统时,禁止Windows挂载文件系统为ext4的外置硬盘,避免因windows无法识别ext4而提示格式化硬盘,用户因此不慎格式化该硬盘。 24 | 25 | 1. 以管理员身份运行diskpar工具 26 | 27 | 2. 禁止自动挂 28 | 29 | ```shell 30 | automount disable 31 | #恢复 automount enable 32 | automount scrub #删除此前连接的磁盘的驱动器号 33 | ``` 34 | 35 | 36 | 37 | # 问题 38 | 39 | ## 桌面增删文件后不自动刷新 40 | 41 | 桌面增删文件后不自动刷新,例如在桌面删除某个文件到回收站或者从回收站恢复文件,但在桌面上文件图标无变化)。 42 | 43 | 解决方法:修改注册表 44 | 45 | 1. 击“开始→运行”,在对话框中输入“regedit”启动注册表编辑器,展开`HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Update` 46 | 47 | 2. 在右面找到`UpdateMode`的`DWORD`值,用鼠标双击`UpdateMode`在出现的窗口中将其值修改为`0`。(值`0`为自动刷新,`1`为手动刷新) 48 | 49 | 如果没有`UpdateMode`,则自行在`Control`下新建一个`updateMode`,添加`DWORD32`,值为`0`。 50 | 51 | 52 | 53 | ## 某些软件无法发现挂载的网络存储 54 | 55 | windows挂载网络存储并映射到某个盘符,虽然在资源管理器里面能够看到并打开这个盘符,但是某些软件可能找不到这个盘符号。 56 | 57 | ​ 例如在windows中挂载了smaba服务器的share文件夹到s盘,在某软件中想使用s盘中的文件,但是却找不到s盘。 58 | 59 | 解决方法: 60 | 61 | - 关闭UAC 62 | 1. 打开注册表(regedit),定位到`HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System`。 63 | 1. 找到`EnableLUA` ,将`Value data`的值改成`0`。 64 | 1. (如果还不能找到,再)重启系统。 -------------------------------------------------------------------------------- /windows/wsl2-archlinux.md: -------------------------------------------------------------------------------- 1 | 以下内容中windows命令在powershell或windows terminal(建议,其默认使用powershell)中执行。 2 | 3 | # 启用wsl2 4 | 5 | 在 系统设置--应用和功能--程序和功能--打开或关闭**Windows** 功能,勾选启用: 6 | 7 | - 启用于linux的子系统 8 | 9 | - 启用hyperv 10 | 11 | 命令行启用hyper 12 | 13 | ```powershell 14 | Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 15 | ``` 16 | 17 | 家庭版启用hyperv,可创建一个bat文件如hyperv.bat,内容如下: 18 | 19 | ```bat 20 | pushd "%~dp0" 21 | 22 | dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt 23 | 24 | for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i" 25 | 26 | del hyper-v.txt 27 | 28 | Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL 29 | 30 | Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 31 | ``` 32 | 33 | 管理员用户执行上面的bat文件。 34 | 35 | 可能要重启系统。 36 | 37 | 38 | 39 | # 安装wsl2 archlinux 40 | 41 | 1. 将wsl作为默认wsl版本: 42 | 43 | ```shell 44 | wsl --set-default-version 2 45 | ``` 46 | 47 | 使用`wsl -l -v`查看当前wsl 版本及linux列表。 48 | 49 | 可能提示需要更新其内核组件,根据提示的网址下载内核安装。 50 | 51 | 2. 下载[ArchWSL2](https://github.com/yuk7/ArchWSL2/releases),解压目录,这里假设将加压的目录ArchWSL2放到`C:\`目录下,点击目录内的`Arch2.exe`安装。 52 | 53 | 3. 将`C:\ArchWSL2`加入环境变量方便使用 54 | 55 | 搜索path,在 系统属性--环境变量 中编辑 `Path` 行,添加该环境变量。 56 | 57 | 58 | 59 | 60 | # arch 基本配置 61 | 62 | 以下内容在wsl archlinux的shell中执行,根据需要进行一些基本配置: 63 | 64 | ```shell 65 | #密钥初始化 66 | pacman-key --init 67 | pacman-key --populate archlinux 68 | 69 | #修改源,使用China源 70 | curl 'https://www.archlinux.org/mirrorlist/?country=CN&protocol=https&ip_version=4'|sed "s/^#//" >/etc/pacman.d/mirrorlist 71 | 72 | #更新系统 73 | pacman -Syyu --noconfirm 74 | 75 | #root密码 76 | passwd root 77 | 78 | #添加archlinuxcn源(可选) 79 | echo '[archlinuxcn] 80 | Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch' >> /etc/pacman.conf 81 | pacman -Syy 82 | pacman -S archlinuxcn-keyring --noconfirm 83 | 84 | #安装一些软件(可选) 85 | pacman -S --noconfirm vim htop git sudo 86 | 87 | #添加一个普通用户(可选) 88 | useradd -m -g wheel user1 89 | 90 | 91 | #将windows的一些目录与linux共用(可选) 92 | #ln -sf /mnt/c/path/to/Documents ~/ 93 | ``` 94 | 95 | ## 设置wsl默认登录用户 96 | 97 | archlinux的wsl默认使用root用户登录。在wsl装创建了普通用户后,在windows terminal中配置wsl默认登录用户: 98 | 99 | ```powershell 100 | Arch config --default-user user1 101 | ``` 102 | 103 | 104 | 105 | # wsl2硬件资源分配 106 | 107 | 在用户目录`C:\Users\`下创建`.wslconfig`文件: 108 | 109 | ```ini 110 | [wsl2] 111 | #kernel=C:\\temp\\myCustomKernel 112 | memory=4GB # 将WSL 2中的VM内存限制为4 GB 113 | processors=2 #使WSL 2 VM使用两个虚拟处理器 114 | ``` 115 | 116 | # wsl2可访问宿主机网络 117 | 118 | windows中允许WSL中对网卡`vEthernet (WSL)`(WSL网卡的默认名字) 119 | 120 | 管理员执行powershell命令 121 | 122 | ```powershell 123 | #Requires -RunAsAdministrator 124 | New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allo\ 125 | ``` 126 | 127 | 可编写以下cmd脚本,实现从右键菜单的管理员运行,编写文件wsl-to-host-net.cmd文件,内容为: 128 | 129 | ```cmd 130 | PowerShell -Command "New-NetFirewallRule -DisplayName 'WSL' -Direction Inbound -InterfaceAlias 'vEthernet (WSL)' -Action Allow " > wsl-net-log 131 | ``` 132 | 133 | 可使用task scheduler(任务计划程序),创建一个任务,选择最高权限运行(用户需要有管理员权限),实现在登录时触发执行该脚本的操作,实现自动化。 134 | -------------------------------------------------------------------------------- /自签名的TLS.md: -------------------------------------------------------------------------------- 1 | 1. 生成CA私钥`ca.key`,用该私钥生成一个CA证书`ca.crt` 2 | 3 | 2. 生成一个私钥`server.key`,用该私钥创建一个请求文件`server.csr`,再使用CA的私钥和证书签名一个`server.crt` 4 | 5 | 3. 服务端使用`server.key`和`server.crt` 6 | 7 | 例如web服务器需要读取这两个文件。 8 | 9 | 4. 客户端安装CA证书`ca.crt`即可。 10 | 11 | 在windows上安装时,在”证书存储“这一步,选择“将所有的证书都放入下列存储”,点击“浏览”,选择“受信任的证书颁发机构”。 12 | 13 | 如果是浏览器访问使用`server.crt`提供web服务的站点,安装完证书后需要重启浏览器。 14 | 15 | 16 | 17 | ```shell 18 | #!/bin/bash 19 | expire_days=3650 20 | #----1. create CA files (key file and certificate file) 21 | #1.1 create a private key as a CA key 22 | openssl genrsa -des3 -out ca.key 2048 #input an key pharse for ca.key 2 times 23 | #1.1.1 optional remove 24 | openssl rsa -in ca.key -out ca.key #input the pharse of ca.key 25 | 26 | #input some information, country, province/state, city , organazition ... 27 | openssl req -utf8 -x509 -new -nodes -key ca.key -sha256 -days $expire_days -out ca.crt 28 | 29 | #----2. sign a cert by CA key 30 | 31 | #2.1 create a private key 32 | openssl genrsa -out server.key 2048 33 | #2.2 create a request file (csr) for generate a certificate 34 | openssl req -new -key server.key -out server.csr 35 | 36 | #2.3.0 conf file for generate a certificate 37 | echo " 38 | authorityKeyIdentifier=keyid,issuer 39 | basicConstraints=CA:FALSE 40 | keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment 41 | subjectAltName = @alt_names 42 | [alt_names] 43 | DNS.1 = xxx.yy.com #domain 1 44 | DNS.2 = aa.bb.cc #optional, domain 2 45 | IP.1 = 1.2.3.4 #optionally, an IP (if it requires) 46 | " >server.ext 47 | 48 | #2.3 sign a certificate (crt) 49 | openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days $expire_days -sha256 -extfile server.ext 50 | ``` 51 | 52 | 53 | 54 | 得到的文件中重要的有: 55 | 56 | - `ca.key` CA证书密钥文件,如需再次签署需要使用 57 | - `ca.crt` CA证书文件,安装到客户端操作系统的**受信任的第三方证书颁发机构**里面 58 | - `server.key` 和 `server.crt` 部署到服务端口的密钥和证书文件 59 | 60 | 其余文件: 61 | 62 | - `server.csr` 证书签发请求的文件 63 | - `server.ext` 生成证书的配置文件 --------------------------------------------------------------------------------