All this I did without you
Letter No. 028
July 31st, 1978
Gerald Durrell, a respected conservationist wrote a love letter to his future wife, and then one of his students taking her PhD at Duke University, Lee McGeorge.
~
My darling McGeorge,
You said that things seemed clearer when they were written down. Well, here with is a very boring letter in which I will try and put everything down so that you may read and re-read it in horror at your folly in getting involved with me. Deep breath.
To begin with I love you with a depth and passion that I have felt for no one else in this life and if it astonishes you it astonishes me as well. Not I hasten to say, because you are not worth loving. Far from it. It’s just that, first of all, I swore I would not get involved with another woman. Secondly, I have never had such a feeling before and it is almost frightening. Thirdly, I would never have thought it possible that another human being could occupy my waking (and sleeping) thoughts to the exclusion of almost everything else.
Fourthly, I never thought that — even if one was in love — one could get so completely besotted with another person, so that a minute away from them felt like a thousand years.
Fifthly, I never hoped, aspired, dreamed that one could find everything one wanted in a person. I was not such an idiot as to believe this was possible. Yet in you I have found everything I want: you are beautiful, gay, giving, gentle, idiotically and deliciously feminine, sexy, wonderfully intelligent and wonderfully silly as well. I want nothing else in this life than to be with you, to listen and watch you (your beautiful voice, your beauty), to argue with you, to laugh with you, to show you things and share things with you, to explore your magnificent mind, to explore your magnificent mind, to explore your wonderful body, to help you, protect you , serve you, and bash you on the head when I think you are wrong… not to put too fine a point on it I consider that I am the only man outside mythology to have found the crock of gold at the rainbow’s end.
But — having said all that — let us consider things in detail. Don’t let this become public but… well, I have one or two faults. Minor ones, I hasten to say. For example, I am inclined to be overbearing. I do it for the best possible motives (all tyrants say that) but I do tend (without thinking) to tread people underfoot. You must tell me when I am doing it to you, my sweet, because it can be a very bad thing in a marriage.
Right. Second blemish. This, actually, is not so much a blemish of character as a blemish of circumstance. Darling I want you to be you in your own right, and I will do everything I can to help you in this. But you must take into consideration that I am also me in my own right and that I have a headstart on you… what I am trying to say is that you must not feel offended if you are sometimes treated simply as my wife. Always remember that what you lose on the swings, you gain on the roundabouts. But I am an established ‘creature’ in the world, and so — on occasions — you will have to live in my shadow. Nothing gives me less pleasure than this but it is a fact of life to be faced.
Third (and very important and nasty) blemish: jealousy. I don’t think you know what jealousy is (thank God) in the real sense of the word. I know you have felt jealousy over Lincoln’s wife and child but this is what I call normal jealousy, and this — to my regret — is not what I’ve got. What I have got is a black moster that can pervert my good sense, my good humour and any goodness that I have in my make-up. It is really a Jekyll and Hyde situation… my Hyde is stronger than my good sense and defeats me, hard though I try. As I told you, I have always known that this lurks within me, but I couldn’t control it, and my monster slumbered and nothing happened to awake it. Then I met you and I felt my monster stir and become half awake when you told me of Lincoln and others you have known, and with your letter my monster came out of its lair, black, irrational, bigoted, stupid, evil, malevolent. You will never know how terribly corrosive jealousy is; it is a physical pain as though you had swallowed acid or red hot coals. It is the most terrible of feelings. But you can’t help it — at least I can’t, and God knows I’ve tried. I don’t want any ex-boyfriends sitting in church when I marry you. On our wedding day, I want nothing but happiness, for both you and me, and I know I won’t be happy if there is a church full of your ex-conquests. When I marry you I will have no past, only a future: I don’t want to drag my past into our future and I don’t want you to do it , either. Remember I am jealous of you because I love you. You are never jealous of something you don’t care about. OK, enough about jealousy.
Now, let me tell you something… I have seen a thousand sunsets and sunrises, on land where it floods forest and mountains with honey-coloured light, at sea where it rises and sets like a blood orange in a mul ...
Gnome快捷键
Gnome桌面环境的快捷键。
快速启动一个应用
Super
Hot Corner这两个我都用,HotCorner不是一个按键,而是一个动作,是指屏幕的右上角,鼠标指针用力撞过去,撞开所有的应用窗口。在Gnome的环境中,Super是一个超方便的键,当我需要打开vscode的时候,可以在任意时候通过super+code+Enter直接打开vscode应用。当按下Super的时候会自动触发一个全局的搜索,可以通过Super快速查看自己的需要的文件或者应用,这个功能是我最喜欢Gnome的地方。
执行命令
Alt+F2最常用的就是重启Gnome环境,通过Alt+F2 调出的命令窗口,使用r命令重启Gnome。
应用的切换
Super+TAB使用Super+TAB可以在应用之间快速切换。如果Cover-alt-tab的插件,还有三维动画。
Super+`这个组合键是切换应用内窗口的,我自己用的不多。
快速显示主屏幕应用菜单
Super+a快速显示主屏幕的所有应用程序页。
切换工作区
Super+PageUP or PageDown
Ctrl+Alt+UP or DOWN可以在多个工作区之间快速切换,但是我自己常用的是第二种。键位上舒服一些。
移动窗口到其他工作区
Ctrl+Alt+Shift+UP or Down
Super+Shift+PageUP or PageDown将当前的焦点窗口移动到前后的工作区,并保持当前窗口的焦点不变。这个也是特别好用的快捷键。
呼出通知中心和日历
Super+m这个快捷键最早的Gnome上是通知栏,现在用的比较少了,毕竟Gnome已经不是下方的通知栏了,是上面的日历加上通知中心的方式了。我自己的用的时候大部分是看时间和日历。
截图
PrintScreen截取所有屏幕内容,保存到文件。
Alt+PrintScreen截取当前窗口的内容,保存到文件。
Shift+PrintScreen截取选择的区域,保存到文件。
NOTE: 最方便的就是,使用Ctrl+Shift PrintScreen和Ctrl+PrintScreen 可以直接选取的区域截图,将截图保存在剪贴板,截图完成直接粘贴即可。
最大化最小化和分屏
Super+UP最大化到铺满屏幕
Super+LEFT靠左占据一般屏幕
Super+RIGHT靠右占据一般屏幕
Super+H最小化,隐藏
这些基本上就是我觉得常用而且好用的快捷键啦,但是还是可以自定义的,在设置里面,也可以随便设置,但是那样的话就不是拿来直接可以用的啦。
Nginx配置文件中if判断与try_files
Nginx的if判断问题,导致try_files字段未能正常生效。
配置文件server {
listen 80;
server_name liarlee.site;
set $mobile_rewrite do_not_perform;
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
set $mobile_rewrite perform;
}
if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
set $mobile_rewrite perform;
}
if ($http_cookie ~ 'gotopc=true') {
set $mobile_rewrite do_not_perform;
}
location / {
root /var/html/www/[PC_WEB_ROOT];
# 问题出现在了这里。
if ($mobile_rewrite = perform) {
root /var/html/www/[MOBILE_WEB_ROOT];
}
index index.html index.htm
error_page 404 index.html
# 问题就出现在了这里。
try_files $uri $uri/ /index.html 404;
}
}
表现在访问请求来的同时,判断是不是手机访问,如果是PC使用默认的PC_WEB_ROOT, 如果是手机的话,访问到MOBILE_WEB_ROOT。本身逻辑和使用是没有问题的,但是需要使用try_files字段的时候,会导致PC站点的tryfiles可以正常生效;但是手机不会有tryfile的效果。
可行的方式 - Proxypass看到了一篇文章说到nginx的IF语句,可以正常不出奇怪问题的只有Proxy_pass,Rewrite两个,因为项目无法用rewrite所以选择了Proxypass。配置文件分为两个部分,每个网站放在一个Server下。
PC配置文件server {
listen 80;
server_name liarlee.site;
set $mobile_rewrite do_not_perform;
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
set $mobile_rewrite perform;
}
if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo| ...
虚拟机制作模板的步骤及设置
换了工作之后接管了这边旧的ESXi和上面的虚拟机,之前的模板不是特别的合适,自己开始动手做模板。最终期望的目标是:
修改IP地址
yum install 收工
CentOS虚拟机模板制作流程系统的硬件配置系统的硬件规格
4cpu
8G-RAM
OS的版本系统的版本
CentOS 7.6 1810 x64
安装VMwareToolsyum install -y epel vim wget curl net-tools open-vm-tools htop iotop iftop tree atop sysstat
安装Zabbix-agentrpm -ivh zabbix-agent-$version.rpm
关闭SELinuxsed -i 's@SELINUX=enforcing@SELINUX=disabled@g' /etc/selinux/config
更改hostnamehostname有一些有趣的问题,CentOS6.8 中的hostname可以定义在/etc/sysconfig/network文件中,系统启动的时候先读取/etc/sysconfig/network文件中的定义,如果没有的话读取/etc/hosts文件中的定义.和我自己的之前的记忆不一样。我之前一直都是之间编辑/etc/hostname,直接将主机名echo到这个文件中就可以了,不过想来这些区别都不大,先这样吧。
清除硬件及网卡的信息将网卡配置文件中的UUID和 HWADDR直接删除或者是注释掉,IPADDR留空。
/etc/sysconfig/network-scripts/ifcfg-eth0
删除udevrm -rf /etc/udev/rules.d/70-*
```
NOTE:命令的效果貌似和 sys-unconfig 的效果是一样的。
### 关闭防火墙
```bash
systemctl disable firewalld
iptables -F
iptables -X
iptables -Z
更改Grub的等待时间虚拟机中的模板大部分是不需要等待grub给出的操作选单时间的,等待操作的时间是5秒,我们给出1秒就够了。
vim /etc/default/grub
GRUB_TIMEOUT=1
清理工作rm -rf /etc/ssh/*key*.
rm -rf /root/.ssh/
systemctl stop rsyslog
systemctl stop auditd
/usr/bin/yum clean all
logrotate -f /etc/logrotate.conf
rm -f /var/log/dmesg.old
rm -rf /var/log/anaconda*
cat /dev/null > /var/log/audit/audit.log
cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/lastlog
cat /dev/null > /var/log/grubby
清除系统的唯一ID> /etc/machine-id
清除系统命令历史记录unset HISTFILE
history -c && rm -rf /root/.bash_histroy
Sys-unconfig关机执行sys-unconfig等待关机,然后转换为模板。
通过systemd管理软件和服务
通过systemctl 来管理系统的服务和软件,但是如果是自己安装的软件就没有办法使用了。其实是可以自己定义systemd的管理脚本的,类似与之前的SysV风格的管理脚本。
Systemd
systemd is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system. systemd provides aggressive parallelization capabilities, uses socket and D-Bus activation for starting services, offers on-demand starting of daemons, keeps track of processes using Linux control groups, maintains mount and automount points, and implements an elaborate transactional dependency-based service control logic. systemd supports SysV and LSB init scripts and works as a replacement for sysvinit. Other parts include a logging daemon, utilities to control basic system configuration like the hostname, date, locale, maintain a list of logged-in users and running containers and virtual machines, system accounts, runtime directories and settings, and daemons to manage simple network configuration, network time synchronization, log forwarding, and name resolution.
管得还是挺多的,主要是启动PID为1的进程并启动其他的程序,并行执行,维护挂载点及自动挂载,服务之间的依赖关系,日志进程,
Systemd的Units文件Systemd默认的文件配置路径有: - /etc/systemd/system/* - /run/systemd/system/* - /usr/lib/systemd/system/*
Systemd Unit File 的模板有这样的几个模块:
[Unit]
[Service]
[Install]
UnitUnit的作用是记录文件的通用信息。
Descripition – 对软件或服务的描述。
Before OR After – 定义启动的顺序,在某些服务 启动之前 OR 启动之后 ,在启动这个服务。其中还定义了服务的依赖关系,先后顺序。常用的值有 network.target, Multi-User.target, network.service 等等。
Requires – 并行启动所指定的其他服务。
RequireOverrideable – 类似与require,但是不同的是手动启动的时候不会报错。
Requisite – 只要启动失败了就直接报错停止,强硬版本的requires。
Wants – 启动依赖单元的常用选项,在启动的同时调起其他的Unit,如果其他单元启动失败了也不会影响当前定义的Unit的启动。
Conflicts – 冲突单元,启动的时候发现了Conflict中定义的其他单元就会尝试终止Unit。
Service
Type – 对服务类型的定义,通常有如下三种:- simple 默认的类型,启动就启动,停止就结束了。- forking 守护进程的类型,把必要的启动之后留下守护进程。- oneshot 一次性的服务,启动后就结束了。
ExecStart – 启动的时候执行的命令, 这条命令就是服务的主体。
ExecStartPre OR ExecStartPost – ExecStart执行前后的动作。
ExecStop – 指定服务结束的动作,如果未指定直接kill。
Restart – 定义了重启的条件和动作,常用的参数有: no, on-sucess, on-failure, on-watchdog, on-abort。
SuccessExitStatus – ExecStart的返回值。 SuccessExitStatus=1 2 8 SIGKILL
Install
WantedBy – 定义启动的情景,几种不同的target: multi-user.target | poweroff.target | rescue.target | graphical.target | reboot.target
Alias – 别名的设置在这里定义。
标准配置文件 - Libvirtd[Unit]
Description=Virtualization daemon
Requires=virtlogd.socket
Requires=virtlockd.socket
Wants=systemd-machined.service
Before=libvirt-guests.service
After=network.target
After=dbus.service
After=iscsid.service
After=apparmor.service
After=local-fs.target
After=remote-fs.target
After=systemd-logind.service
After=systemd-machined.service
Documentation=man:libvirtd(8)
Documentation=https://libvirt.org
[Service]
Type=simple
EnvironmentFile=-/etc/conf.d/libvirtd
ExecStart=/usr/bin/libvirtd $LIBVIRTD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
# At least 1 FD per guest, often 2 (eg qemu monitor + qemu agent).
# eg if we want to support 4096 guests, we'll typically need 8192 FDs
# If changing this, also consider virtlogd.service & virtlockd.service
# limits which are also related to number of guests
LimitNOFILE=8192
# The cgroups pids controller can limit the number of tasks started by
# the daemon, which can limit the number of domains for some hypervisors.
# A conservative default of 8 tasks per guest results in a TasksMax of
# 32k to support 4096 guests.
TasksMax=32768
[Install]
WantedBy=multi-user.target
Also=virtlockd.socket
Also=virtlogd.socket
ElasticSearch 安装记录
ElasticSearch的安装过程。
准备源码包
需要下载的包有三个:网站地址
ElasticSearch- 分布式、RESTful 风格的搜索和分析。/usr/local/src/elasticsearch
Logstash - 采集、转换、充实,然后输出。/usr/local/src/logstash
Kibana - 实现数据可视化。在 Elastic Stack 中进行导航。/usr/local/src/kibana
安装 ElasticSearch
解压下载的安装包
tar zxvf elasticsearch-7.3.1-linux-x86_64.tar.gz
tar zxvf kibana-7.3.1-linux-x86_64.tar.gz
tar zxvf logstash-7.3.1.tar.gz
修改系统参数
vim /etc/sysctl.conf
fs.file-max=65535
vm.max_map_count=262144
sysctl -p : 重新读取配置文件中的参数,更新的条目会显示在命令执行结果中。
vim /etc/security/limits.conf * soft nofile 65536
* hard nofile 131072
* soft noproc 4096
* hard noproc 4096
保存退出。
建立elk用户 useradd elk -p "YOUR-PASSWD"
将/usr/local/src/elasticsearch目录的权限给elk用户。 chown -R elk:elk /usr/local/src/elasticsearch/
在/usr/local/src/elasticsearch/elasticsearch/config/目录下修改配置文件elasticsearch.yml。 cluster.name: CLUSTER_NAME
node.name: HOSTNAME & ROLES
node.master: true
node.data: true
network.host: YOUR_HOSTNAME
discovery.zen.ping.unicast.hosts: ["YOUR_OTHER_NODE_HOSTNAME "]
切换到elk用户,尝试启动elk su elk cd /usr/local/src/elasticsearch/elasticsearch/bin/ ./elasticsearch 如果没有错误就可以使用 -d 选项将服务启动到后台。
文件系统及文件管理
Linux文件管理笔记
文件系统默认的规定是遵守FHS规定的。
FHS(Filesystem Hierarchy Standard) defines the directory structure and directory contents in Linux distributions.FHS_Website
标准的根文件系统,应该具有如下的结构,所有的文件目录均在根文件系统下。
/bin – 单用户模式下可运行的二进制命令。所有用户都可以使用。
/sbin – 基本的系统二进制文件。
/boot – 一般为BootLoaderFiles,例如内核,ramfs,grub等等。
/etc – 常用的应用程序的全局配置文件。Host-specific system-wide configruation。
/etc/opt – /opt目录下的程序的配置文件。
/usr – 包含了主要的多用户工具及应用。
/usr/share – Architecture-independent(shared) data.独立架构的共享数据。
/usr/sbin – 非基础的系统库文件,例如网络管理的守护进程。
/usr/src – 放内核源码及头文件的目录。
/usr/bin – 非基础的命令二进制文件,不需要运行在单用户模式下的命令。
/usr/local – 特指存放本地的数据,例如源码包,二进制包等等。
/usr/lib – /usr/bin & /usr/sbin下的命令所需要的库文件。
/opt – Optional application software packages.
/mnt – 文件系统的临时挂载位置。
/media – 默认的可移动设备挂载位置。
/dev – 所有的设备,字符设备,块设备。
/lib – 为/bin & /sbin目录下的文件及程序提供的库文件。
/lib64 – 可替代格式的库文件,这个目录不是必须存在的,例如64位程序会需要这个目录。
/tmp – 临时文件存放目录。定期清除。
/sys – 设备,驱动,一些内核功能的相关信息。
/proc – 虚拟文件系统展示进程及内核信息文件。系统启动目录创建,系统关闭目录消失。
/var – 变量文件。在系统运行的过程中反复变化的文件。比如日志,邮件,信息输出等。
/var/log – 系统应用程序产生的日志文件默认存放路径。
/var/spool/mail – 每个用户的邮件。
/home – 用户的家目录,saved files, personal settings,etc.
Bash文件色彩显示的定义在: /etc/DIR_COLORS , 文件中定义了所有文件类型在Bash中的色彩。新技巧: 有一个$OLDPWD,可通过cd - 切换到上一次离开的目录
Kubernetes集群的学习笔记(2)
Kubernetes的基本使用命令。
对控制命令进行分类整理:
查看k8s整体状态的命令
kubectl describe node node1.docker 查看node的详细信息
kubectl version 查看kube的版本信息,同时显示客户端的版本及服务端的版本
kubectl cluster-info 查看kube的集群信息,master节点的所在地址及kubeDNS的所在地址
手动运行Pods的命令
kubectl run nginx –image=nginx –replicas=5 启动5个nginx的pods
kubectl run nginx –image=nginx –port:80 –replicas=5 –dry-run=true 启动5个nginx的pod的测试,但不执行改变,并expose端口80
查看Pods的命令
kubectl get pods 列出所有节点正在运行的pod的状态信息
kubectl get deployment 列出所有的deployment控制器的信息,所有的pod属于cni0桥,不属于docker桥
删除单独一个Pods的命令
kubectl delete pods hayden-nginx-6dd3ffd4c5-ww7mk删除一个指定的pod
手动建立Pods并对外发布的命令
kubectl expose deployment hayden-nginx –type=[{ClusterIP},NodePort,LoadBalancer,ExternalName] –name=nginx-service –target-port=80 –protocol=TCP创建一个新的service,将内部的通信以service的形式对外交付
查看svc状态的命令
kubectl get svc查看service的状态
查看属于某个名称空间的命令
kubectl get nodes -n kube-system -o wide查看属于kube-system的节点的信息
kubectl get svc -n kube-system -o wide查看属于kube-system的服务的信息
从不重启Pods的设置
kubectl run t-centos –image=centos -it –restart=Never –replicas=1启动1个普通的容器作为客户端进行服务的访问
kubectl describe svc nginx-service查看指定服务的详细信息
kubectl get nodes –show-labels查看节点的标签
对svc进行编辑和修改
kubectl edit svc nginx-service编辑一个service的属性,命令打开vim的编辑界面进行配置文件的更改
kubectl delete svc nginx-service删除一个service
kubectl get deployment -w长时间监控一个控制器的状态改变
对Pods的升级和回滚
kubectl set image deployment hayden-nginx hayden-nginx=nginx:latest对容器指定其他的镜像进行动态的升级及更新
kubectl rollout status deployment hayden-nginx对容器版本的更新进行进度的查看
指定版本的回滚
kubectl rollout undo deployment hayden-nginx对升级的版本进行回滚,可指定回滚的版本,默认是上一个版本
Service发布到NodePort外部访问到service的方法是定义type为NodePort,可在创建service的时候定义类型,或者使用kubectl edit svc nginx-service将type变更为NodePort 。
创建资源的逻辑思路刚从docker的管理思路过来的时候还是有些茫然, 不太知道该怎么用。其实从k8s的管理逻辑上,我们将之前的container 变更为 pod,将pod的管理交给一个deployment,将deployment已经启动的所有容器通过对外提供service的方式expose到外部。例如:我需要一个httpd服务,不需要直接去docker启动了,我直接在k8s上定义一个deployment-httpd,通过k8s的控制器去调度容器。如果需要控制容器对外提供服务,那就直接创建一个service,通过service去直接定义和管理对外的服务即可。
Kubernetes集群的学习笔记(1)
Kubernetes基础知识及笔记。
概念定义容器的出现以及容器编排引擎出现的原因。
容器编排工具容器最早的模型时LXC+Linux Namespace。容器的出现导致了我们需要对容器进行管理,单机的管理不能满足业务的需要,于是快速衍生出了多种不同的容器编排工具。Docker提供的工具:
docker compose
docker swarm
docker machine
IDC的操作系统:
mesos(资源分配工具), marathron(面向容器编排的框架)
Google的工具:
Kubernetes
当一个产品可以占据35%以上的份额就已属于自然垄断。k8s现在已经处于垄断地位。透过容器所产生的衍生概念有: DevOps, MicroServices, BlockChain.开发模式的开发:瀑布模型,进化到了敏捷开发,精益开发,到现在的DevOps.发布线上的做法:蓝绿部署,灰度部署,金丝雀(canary)DevOps几个简单的名词解释:
CI: 持续集成 - 持续集成通俗一些就是快速提交代码,快速变更需求,快速合并代码。
CD: 持续部署 - 持续部署是指在代码提交变更之后,快速进行部署及测试;传统的代码在提交后需要运维人员手动部署,持续部署其实就是缩短的部署所需要的步骤和周期,尽可能将部署操作交由自动化完成。
CD: 持续交付 - 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状态。
有时候,持续交付也与持续部署混淆。持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到生产环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。
云原生的概念Native Cloud Application To Wikipedia.
A native cloud application (NCA) is a type of computer software that natively utilizes services and infrastructure from cloud computing providers.
例如:当容器中的nginx需要变更项目文件的时候,容器的环境已经决定了不太容易对项目的变更,早期的程序设计使用配置文件进行定义。因此,最好的办法是可以通过传递宿主机环境变量的方式对镜像进行设置,当项目有变更的时候直接通过读取环境变量的方式对容器内项目的数据进行配置和更改。基于这种思路设计出来的容器或者软件,叫做云原生应用(Native Cloud Application)。
K8s的前世k8s本来开始是Google内部的Brog系统,Google在Docker被发现了之后,快速的使用Go语言重写了Brog系统,借鉴了Brog的逻辑和设计,所有的代码进行了全面的重构。
Kubernetes项目的Github页面
K8s的特点
自动装箱
自我修复
水平扩展
服务发现与负载均衡
自动发布和回滚
密钥的配置和管理 – 将配置定义在k8s的对象中,通过k8s在容器启动的时候自动传递环境变量到容器中。
存储编排 – 可自动创建存储卷供容器需要的自动管理及使用
批量处理执行
K8s的工作流程及逻辑
Kubernetes组合多台主机的资源,整合成资源池,并统一对外提供计算、存储等能力的集群。k8s的集群是Master\Node模型,具有角色分类,需要部署master节点及node节点。master节点一般有三个,node节点理论上可以无限增加。
k8s的简要工作流程: 收到请求后,Master节点上的Scheduler用来收集所有Node上的可用资源信息,并通过API Server告知资源充足的Node启动相关的容器;Node收到请求会查找需要的镜像,如果本地不存在从Docker Registery上面拉取相应的镜像进行所请求容器的启动。
k8s可将 Master节点 + Node节点 + Registery节点 同时托管在k8s自身的环境中,也就是直接托管在docker虚拟化层上,因此我们可以通过kubeadm等相关的工具将所有的组件使用容器的方式进行管理和调度。
Master上的主要组件及服务
API Server # 负责提供对外的及对内的服务接口
Scheduler # 选出适合部署容器的node节点,两级筛选:选出所有可以使用的node,在所有合规的node上进行最优选择,选择取决于调度算法。
Controller-Manager # 检测容器的状态,如果出现异常或不符合定义的状态,就向API申请重新部署相关容器。
Node上的主要服务及组件
Kube-Proxy
容器引擎,docker
Kubelet
Flannel
逻辑组件:PodNode上可以运行及调度逻辑单元pod,pod是k8s的一个逻辑概念,真实运行起来的还是Container,只是k8s为了方便管理,将一个或多个Container封装了成了逻辑上的Pod,打上了相应的标签,使得可以通过Seletor对不同的Pod进行分类管理和选择。Pod是模拟了传统的虚拟机模式(相同主机上的Pod可以使用宿主机的lo进行网络通信),使得可以构建精细的模型。
一个pod中可以有多个容器,共享底层名称空间net,UTS,IPC,另外三个互相隔离user,mnt,pid.
Sidecar的概念一般来讲,一个Pod只放入一个容器,如果我们需要放置多个容器,一般为一个主要的一个辅助的,辅助的叫做 sidecar.例如主程序运行在一个容器中,收集日志的程序放在sidecar中。
Pod的标签选择Pod已经被附加了一些元数据,创建完成的Pod可以通过标签的数值直接识别Pod的类别。k8s使用标签选择器selector来过滤符合条件的资源。所有的对象都可以通过标签选择器进行选择。
Pod的不完全分类
自主式pod # 自行控制自己的生命周期
控制器管理的pod # 通过管理器可管理生命周期的pod
k8s使用的pod的控制器
ReplicationController - 最早提供的组件,支持滚动更新和回滚,最早只有一个。现在已经不再使用。
ReplicaSet - 新的工具替代了原始的控制器,但是不直接使用,直接使用的是Deployment来管理无状态的pod。
StatefulSet - 对有状态的Pod进行管理。
DaemonSet - 控制容器的进程为守护进程的控制器,每个Node上都会运行一个,无法指定副本的数量。一般用于信息和日志的收集。
Job, Cronjob - 作业管理, 周期性作业管理。
HPA - HorizontalPodAutoscaler
服务发现的概念为了能快速管理新启动的pod,在pod和用户之间添加了逻辑的中间层,pod启动后需要在service中注册自己的信息,客户端需要相关的服务的时候从service取得相关的信息,完成服务的管理。service是逻辑组件,通过iptables的DNAT来实现相关的service的功能。
其实服务发现相当于消息中间件,有Pods(生产者)来注册,有用户(消费者)来消费,只是不会被消费掉。
Kube-proxy的作用一旦发现了service的改变,反映到Iptables上,同时向API Server报告。
Kubernetes的安装部署通过kubeadm工具进行安装及部署,部署的过程其实不复杂,只是镜像的拉取麻烦了一些,记录了一些简单的步骤和问题。安装的时候启动了三个虚拟机,一台虚拟机作为Master节点,其他的两台作为Node节点,所有的机器都需要关闭firewalld,k8s会默认托管iptables的相关规则。安装采用k8s自托管的方式,结构如下,列出了在每个节点上必须运行的服务和容器:
master
Node1
Node2
Kubelet
Kubelet
Kubelet
Pause
Pause
Pause
Flannel
Flannel
Flannel
Kube-Proxy
Kube-Proxy
Kube-Proxy
API Server
Schedular
Controller-manager
Coredns
etcd
机器的信息如下:
IP-ADDRESS
HOSTNAME
ROLES
192.168.229.144
master.docker
master
192.168.229.145
node1.docker
node
192.168.229.146
node2.docker
node
安装基础环境这里记录一下所有机器都需要安装的环境及软件。
编辑hostname vim /etc/hostname
关闭firewalld systemctl mask firewalld
关闭selinux sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
关闭Swap分区, 注释掉swap的相关行,或者在安装的时候默认不分区即可。 vim /etc/fstab
配置docker-ce,kubernetes相关软件源,从阿里云直接配置到本地的机器上。 # kubernetes部分
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# docker -ce部分
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
同步镜像仓库,从docker-ce源安装docker-ce/docker-cli/containerd;其实可以关闭gpgcheck,并将其他同步失败的源关闭即可,我自己只是为了做学习用途,关闭了fedora的update源,总是同步失败耽误我的时间。 dnf makecache -y && \
dnf install -y docker-ce docker-cli containerd && \
systemctl start docker && \
systemctl enable docker
从kubernetes源安装kubeadm\kubectl\kubernetes-cni\kubelet四个组件。 dnf install - y kubeadm kubectl kubelet kubernetes-cni && \
systemctl start kubelet && \
systemctl enable kubelet
四个组件的用途分别是:
kubeadm 用来进行所有节点的部署及初始化。
kubectl 集群的cli接口。
kubelet 每个Node节点都会启动kubelet进程,用来处理Master节点下发到本节点的任务,管理Pod和其中的容器。kubelet会在API Server上注册节点信息,定期向Mast ...
面试记录
这个月还是发生了不少事情了,面试,换房子,真快。
面试题
有一个字符串s=“kjdfdsfevsdf”,使用python单独输出每个字符并在后面加上”th”.
s = "asdfaurhgauh"
for i in s:
print(i+'th')
数据库问题,增删改查。基本上都没答上来。select语句对数据库内容Where做一个筛选。
提取b.txt中的所有域名,awk我写的grep。
grep -E -o "www.[[:alpha:]]*.com" ./b.txt | sort | uniq -c | sort -nr
awk -F / '{print $3}' b.txt | sort | uniq -c | sort -nr
我写的这个唯一个不好的地方就是不能匹配数字的部分,如果域名有数字就提取不出了。其实中间如果全部用正则也可以,但是正则会特别的长。
nginx的反向代理配置文件是不是能看懂,考了一个upstream模块,考了一个weight的分配,考了一个 proxy_pass模块的调用。
描述Raid0 , 1 ,5的区别,但是没让说raid10。
描述如果你有多的资源如何搭建高可用和高并发,这种题目其实还挺无聊的,高并发靠负载均衡分流,四层转发七层代理。高可用靠的冗余和故障的快速切换。没什么特别的架构,web服务也就是keepalived + lvs。硬件的话F5直接搞,虽然我没见过,但是也听说过。
容器问了一个私有的register,不记得叫什么名字,但是我知道Docker官方有文档。软件名称是Harbor
k8s没什么可说了,昨天晚上听了一堆的k8s的理论,一个集群简单而要三个网络,要不是设计思路清晰,网络就已经是一锅粥了。软件的架构真的是越来越复杂了,现在的网络里面不是桥桥桥,就是NAT转换。
查看Linux系统CPU,MEM,NET-IO,DISK-IO的命令。top | htop | free -m | iostat -a
ext4如果分区超过2T如何操作。这题估计本来是问Ext3文件系统的,改的。Ext4随便分了已经。
如何理解top命令中的load average的含义 这个问题本来是聊到了服务器性能的观察,我说到了top命令查看系统的当前状况,所以后续有了这个问题,其实在系统中,这三个数值的计算方式是通过CPU进程队列的长度来进行计算的,具体的数值及计算公式网上有很多,等我不记得了我在去找资料吧,这种东西已经是死知识了,到处都是。 我说说我的理解,这三个数值其实是system load average,是系统的负载状态,其实是描述了系统的压力变化趋势,计算的CPU参数主要是Running Process & uninterreptable Process , 其实就是正在运行和不可中断运行的进程,这些是CPU的工作量。还有一个衡量的参数实际上是IO,IO的指标也会体现在三个不同时间点的计算中。 如何查看或者分析是我一直理解的不透彻的点,记录一下。单项指标的观察不足以解决系统的问题,需要搭配其他的工具进行分析才可以。 看三个参数的变化趋势,1,5,15三个时间点:
如果1分钟高,但是后面两个都低,说明系统当前的状态是压力高的,但是是暂时的。
如果是三个数值都高,可以说明可能是系统的性能不足或者有问题需要解决。
如果1分钟的数值低,但是15分钟的数值高,说明系统的压力会慢慢平稳下来,不会持续太久。
ps命令的使用
ps aux
To see every process on the system using BSD syntax USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 186736 10160 ? Ss 09:32 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:32 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:32 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 09:32 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 09:32 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 09:32 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S 09:32 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I 09:32 0:00 [rcu_preempt]
root 11 0.0 0.0 0 0 ? I 09:32 0:00 [rcu_sched]
root 12 0.0 0.0 0 0 ? I 09:32 0:00 [rcu_bh]
ps axjf / ps -ejH
To print a process tree PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 555 555 555 ? -1 Ssl 0 0:00 /usr/bin/gdm
555 585 555 555 ? -1 Sl 0 0:00 \_ gdm-session-worker [pam/gdm-launch-environment]
585 789 789 789 tty1 789 Ssl+ 120 0:00 | \_ /usr/lib/gdm-x-session gnome-session --autostart /usr/share/gdm/g
789 791 789 789 tty1 789 Sl+ 120 0:01 | \_ /usr/lib/Xorg vt1 -displayfd 3 -auth /run/user/120/gdm/Xautho
791 848 789 789 tty1 789 S+ 0 0:00 | | \_ xf86-video-intel-backlight-helper intel_backlight
789 939 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gnome-session-binary --autostart /usr/share/gdm/gree
939 970 789 789 tty1 789 Sl+ 120 0:04 | \_ /usr/bin/gnome-shell
970 1032 1032 789 tty1 789 Sl 120 0:00 | | \_ ibus-daemon --xim --panel disable
1032 1035 1032 789 tty1 789 Sl 120 0:00 | | \_ /usr/lib/ibus/ibus-dconf
1032 1200 1032 789 tty1 789 Sl 120 0:00 | | \_ /usr/lib/ibus/ibus-engine-simple
939 1086 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-rfkill
939 1088 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-smartcard
939 1089 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-clipboard
939 1090 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-xsettings
939 1091 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-housekeeping
939 1092 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-mouse
939 1093 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-power
939 1094 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-screensaver-proxy
939 1095 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-sound
939 1099 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/lib/gsd-color
939 1101 789 789 tty1 789 Sl+ 120 0:00 | \_ /usr/ ...