动态 版块 发帖 消息 我的
Loading...
HuPei.net
商•龙虎纹青铜尊及其虎食人纹局部,战国•玉螭虎食人佩!
子版块
hupei
9
1、对于码农来说,有时候可能会需要实时查看自己的程序执行的sql语句以方便排查问题调试程序,实时监控查看mysql执行的sql语句,下面主要介绍两种方法:1)启用记录sql的日志文件:查看是否开启日志记录sql, general_log的值为off,则没有开启 mysql> SHOW VARIABLES LIKE "general_log%"; +------------------+----------------------------------+ | Variable_name | Value | +------------------+----------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/VM_0_8_centos.log | +------------------+----------------------------------+ 2 rows in set (0.06 sec) 执行下面命令可临时开启sql记录功能 mysql> SET GLOBAL general_log = 'ON'; mysql> SET GLOBAL general_log_file = '/topath/sql.log';如果想永久开启记录sql功能,则需要修改mysql的配置文件my.cnf,重启mysql使之生效。general_log = 1 general_log_file = /topath/sql.log2)在客户端服务器上使用抓包命令实时监控sql语句(推荐),127.0.0.1和3306分别替换成自己的mysql地址和端口号,-i参数指定网络接口名称,换成自己的。[root@VM_0_8_centos ~]# tcpdump -s 0 -l -w - dst 127.0.0.1 and port 3306 -i eth0 |strings tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 2、修改mysql密码策略,mysql8默认开启了密码安全检查插件,目前很多客户端都不支持此插件,需要修改密码验证策略,它要求要求密码必须包含:数字、大小写字母和特殊符号,且长度不能少于8个字符,否则会提示错误:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,可按照下面步骤修改密码验证策略:修改mysql配置文件my.cnf [root@VM_0_8_centos ~]# vim /etc/my.cnf 找到关键字default_authentication_plugin这一行,修改它的值为mysql_native_password default_authentication_plugin = mysql_native_password登录mysql终端,执行sql语句ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘YourNewPassword’。[root@VM_0_8_centos ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15516 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword'; #刷新权限 mysql> FLUSH PRIVILEGES;如果报错误ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’,说明@后面的登录地址不正确,然后执行进行下面操作:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select Host,User from user where User='root'; +------+------+ | Host | User | +------+------+ | % | root | +------+------+ 1 row in set (0.00 sec) mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'YourNewPassword'; #刷新权限 mysql> FLUSH PRIVILEGES;3、对于很多情况我们需要远程连接mysql进行操作,而不是每次登录到mysql所在的服务器上去操作,下面介绍下远程连接的配置:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed #为了安全起见不要设置root用户远程连接 mysql> CREATE USER 'user'@'%' IDENTIFIED BY 'userPassword'; #授予user用户dbname数据库的所有权限 mysql> grant all on dbname.* to 'user'@'%';4、msyql8.0忘记密码以后如何修改密码,步骤如下:编辑mysql配置文件:[root@VM_0_8_centos ~]# vim /etc/my.cnf最末尾添加一行skip-grant-tables,保存退出重启mysql:[root@VM_0_8_centos ~]# systemctl restart mysqld.service如果重启失败执行下面命令强制杀死所有mysql进程:[root@VM_0_8_centos ~]# ps -ef | grep mysql | awk '{print $2}' | xargs kill -9执行命令mysql -u root -p直接回车进入mysql[root@VM_0_8_centos ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16306 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>修改root密码为空mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> update user set authentication_string='' where user='root'; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 退出mysql,修改mysql配置文件/etc/my.cnf,删掉skip-grant-tables,再次用命令systemctl restart mysqld.service重启mysql登录mysql:#直接回车即可进入mysql [root@VM_0_8_centos ~]# mysql -u root -p修改密码:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> alter user 'root' identified by 'yourPassword'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges;大功告成!
 0    0  3天前
hupei
15
在这里不给大家列出最基本的linux命令,相信大家从网上一搜就是一堆基本命令的使用手册,这里只给同学们列出来最干货的,最能解决实际问题的命令:1、强制杀死所有指定进程。相信同学们在杀进程的时候经常用到是kill -9 进程号,这样的命令,但是这样只针对杀单进程,如果进程有成百上千个呢,总不能手动一个个得杀死吧,所以这个命令组合就派上用场了:#其中PROCESS为进程名称 [root@ixxxx ~]# ps -ef | grep PROCESS | grep -v grep | awk '{print $2}' | xargs kill -92、查看文件总行数。我们在运维工作中避免不了查看文件总行数,如果文件很小还可以但要是文件很大,甚至超过了服务器内存,那么我们就不能简单的使用vim 然后set nu查看行数了,这样会把文件整个加载到内存里,造成服务器崩溃,这个时候就该cat命令上场了,cat不会把文件一次性加载到内存里,所以不会大量占用内存的情况,命令如下:[root@ixxxx ~]# cat index.php |wc -l 173、查看占用系统内存最高的进程。如果发现系统负载过高,内存占用情况是我们排查的重要指标,其中找出内存占用最高的进程显得尤为重要,如下面的命令,默认找出前10个内存占用最高的进程,如果想列出top5 则在head后面追加 -n 5即可:#默认找出占用内存最高的top10进程 [root@ixxxx ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 26687 0.0 5.0 993736 50904 ? Sl 7月16 16:56 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock www 18489 0.0 4.7 356764 48564 ? S 8月08 0:11 php-fpm: pool www www 27745 0.0 4.5 353940 45900 ? S 8月07 0:17 php-fpm: pool www www 17313 0.0 4.4 353136 45112 ? S 8月08 0:12 php-fpm: pool www www 18486 0.0 4.3 352704 44524 ? S 8月08 0:11 php-fpm: pool www www 17312 0.0 4.3 352168 44020 ? S 8月08 0:12 php-fpm: pool www www 11171 0.0 4.3 352044 43668 ? S 8月09 0:04 php-fpm: pool www www 11168 0.0 4.2 352988 42964 ? S 8月09 0:04 php-fpm: pool www www 18488 0.0 4.1 351356 41660 ? S 8月08 0:11 php-fpm: pool www www 17310 0.0 4.1 350600 42176 ? S 8月08 0:11 php-fpm: pool www4、实时监控发往mysql服务器的sql语句。这个命令时程序员排查问题的实用命令,在客户端服务器上执行如下命令即可抓包sql语句,127.0.0.1和3306分别替换成mysql服务器的地址和端口号[root@xxxx ~]# tcpdump -s 0 -l -w - dst 127.0.0.1 and port 3306 |strings tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes5、查看服务器内存剩余情况。其中free列代表内存剩余多少。[root@xxxx ~]# free -mh total used free shared buff/cache available Mem: 991M 442M 127M 120K 420M 362M Swap: 1.0G 125M 898M6、查看磁盘空间占用概况。[root@xxxx ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/vda1 40G 4.7G 33G 13% / devtmpfs 486M 0 486M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 464K 496M 1% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/07、 取两个文件的差集。得出的结果是在中存在但不在a.log中存在的行,如下:[root@xxxx ~]# cat a.log 11 22 [root@xxxx ~]# cat b.log 22 33 [root@xxxx ~]# grep -F -v -f a.log b.log | sort | uniq 338、查找某个字符串在哪些文件里存在。-r为递归查找,-n为显示字符串所在的行号,如下在当前目录下查找关键字为itboy的文件。[root@VM_0_8_centos ~]# cat f.log 111 222 333 444 itboy 555 [root@VM_0_8_centos ~]# grep -rn itboy ./* ./f.log:5:itboy9、查找指定文件在哪个目录下。“/”可以换成你想要查找的目录路径[root@VM_0_8_centos ~]# find / -name filename10、查看正在运行的进程。比如查看正在运行的php-fpm进程。[root@VM_0_8_centos ~]# ps -ef | grep -v grep | grep php-fpm nginx 19765 27832 0 18:35 ? 00:00:06 php-fpm: pool www nginx 24722 27832 0 18:56 ? 00:00:03 php-fpm: pool www root 27832 1 0 8月08 ? 00:00:06 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf) nginx 30174 27832 1 19:17 ? 00:00:00 php-fpm: pool www敬请期待!持续更新中~
 0    0  3天前
hupei
44
1.相关技术解释:     1) BIOS+MBR相关:        ①BIOS:集成在电脑主板上的电脑自检系统,并且能够加载磁盘MBR上的引导程序。        ②MBR:win7之前磁盘分区的一种标准,内含引导操作系统的引导程序和磁盘分区表。        ③MBR上的引导程序:完成对磁盘上系统装载入内存的过程,即引导系统载入和启动。        ④MBR上的磁盘分区表:最多有4个主分区或者扩展分区(源于MBR限制),最多有一个扩展分区(源于操作系统限制),综上即最多有三个主分区,一个扩展分区。MBR采用32位标识块在磁盘的位置,故最多能标识2^32个块,每个块512KB,故最大支持约2TB容量。2)EFI+GPT相关:        ⑤EFI:一种基于新型主板的一种简易操作系统,可以识别.efi文件,采用C语言开发。(该操作系统完成的功能=BIOS+MBR上引导程序)        ⑥GPT:一种新的磁盘分区标准,与EFI共生,采用64位标识磁盘上的块(MBR为32位来标识),旨在弥补MBR对大容量磁盘无法识别的不足,其所能识别的磁盘最大容量为(2^32)*2TB。(GPT完成的功能=MBR上的分区表)         ⑦EFI+GPT的功能=BIOS+MBR(MBR引导程序+MBR磁盘分区表)2.EFI+GPT因何出现?        ①对开机速度的提升的渴望:BIOS+MBR启动过程繁琐,EFI+GPT启动简易。         ②增强对大容量硬盘识别:MBR支持2TB,GPT支持(2^32)*2TB。         ③统一启动程序和标准。         ④安装系统更加简易:BIOS+MBR必须依靠工具将系统的引导程序写入MBR,EFI+GPT只需系统镜像中有efi格式的安装程序即可,便可被EFI这个微型操作系统识别,运行。3.发展趋势:      由于磁盘单位价格的持续走低,大容量磁盘已经是必然的趋势,到某个时刻你必须采用EFI+GPT来识别你硬盘的全部容量。4.值得注意的点     由于,EFI+GPT的组合,只能将系统装到GPT分区的磁盘上,即只能装到GPT格式的磁盘上。故存在MBR分区转GPT分区的情况。     该过程需要格盘,我们需要备份好重要数据。5.EFI+GPT的必备条件:      ①系统镜像中需要有efi格式的文件,被用于EFI系统的识别并安装程序。      ②主板支持efi,操作系统支持efi。      ③操作系统必须安装到GPT格式的磁盘
 0    0  24天前
hupei
41
内容简介作为最具吸引力的优势,systemd拥有强大的处理与系统日志记录功能。在使用其它工具时,日志往往被分散在整套系统当中,由不同的守护进程及进程负责处理,这意味着我们很难跨越多种应用程序对其内容进行解读。相比之下,systemd尝试提供一套集中化管理方案,从而统一打理全部内核及用户级进程的日志信息。这套系统能够收集并管理日志内容,而这也就是我们所熟知的journal。Journal的实现归功于journald守护进程,其负责处理由内核、initrd以及服务等产生的信息。在今天的教程中,我们将探讨如何使用journalctl工具,并在其帮助下访问并操作journal内部的数据。总体思路Systemd journal的深层驱动力在于以集中方式管理对来自任意来源的日志信息。由于大部分引导进程都是由systemd进程处理的,因此我们有理由以标准化方式实现日志的收集与访问。其中jornald守护进程会收集全部来源的数据并将其以二进制格式加以存储,从而轻松实现动态操作。这种作法能够实现多种收益。通过单一工具与数据交互,管理员能够以动态方式显示日志数据。另外,我们也可以轻松查看历史引导数据,或者将日志条目同其它相关服务加以结合,从而 完成通信问题调试。将日志数据以二进制形式存储还意味着这些数据可根据需求随时以二进制输出格式显示。例如,大家可以通过标准syslog格式查看日志以实现日常管理,并在需要使用图形服务时将各条目作为JSON对象交由图形化服务处理。由于数据不会以纯文本形式被写入磁盘,因此我们无需进行任何格式转换。大家可以将systemd journal与现有syslog方案配合使用,也可利用其替代现有syslog功能,具体取决于实际需求。尽管systemd journal足以涵盖大部分管理工作需求,但其同时也能够补充现有日志记录机制。例如,大家可以建立一套集中式syslog服务器,从而对来自多台服务器的数据进行编译;或者,我们也能够利用systemd journal将来自多项服务的日志汇总在单一系统当中。设置系统时间使用二进制journal的一大好处在于,它能够以UTC或者本地时间显示日志记录。在默认情况下,systemd会以本地时间显示结果。有鉴于此,在我们开始使用journal之前,首先要确保时区得到正确设置。Systemd套件中还提供一款timedatectl工具,专门用于解决此类问题。首先,利用list-timezones选项查看可用时区:timedatectl list-timezones结果将列出系统上可用的全部时区。而后选择与服务器所在地相匹配的项目,并使用set-timezone选项加以设置:sudo timedatectl set-timezone zone 为了确保我们的设备使用正确的时间,可单独使用timedatectl命令或者添加status选项。显示结果如下:timedatectl status第一行所示应为正确时间。基础日志查看要查看journald守护进程收集到的日志,可使用journalctl命令。在单独使用时,系统中的每个journal条目都会被显示在单一pager中供我们浏览。条目时间越早,排列越靠前:journalctl大家可以一页页进行翻看,不过如果系统运行时间较长,那么systemd中的日志也将成千上万,这也证明了journal数据库中可观的数据量。其格式与标准的syslog日志非常相似。然而,其收集数据的来源较syslog要丰富得多。其中包含有来自先前引导进程、内核、initrd以及应用程序标准错误与输出的日志。这一切都可在journal中查看到。大家可能还注意到,全部时间戳都以本地时间为准。由于已经为系统正确设置了本地时间,所以显示的时间戳也都准确无误。如果大家希望以UTC显示时间戳,则可使用–utc标记:journalctl --utc按时间进行journal过滤浏览大量数据当然有其作用,但信息量过于庞大则会让我们很难甚至根本不可能找到真正重要的内容。因此,journalctl提供了极为关键的过滤选项。显示当前引导进程下的日志其中最常用的就是-b标记了,其将显示全部最近一次重新引导后收集到的journal条目。journalctl -b通过这种方式,我们能够识别并管理源自当前环境下的信息。过往引导记录大家通常只需要查看当前引导环境下的信息,但有时候查看过往引导记录也非常必要。Journal能够保存大量过往引导信息,从而允许journalctl轻松显示相关内容。有些版本会在默认情况下保存过往引导信息,而有些则默认禁用这项功能。要启用此功能,可以使用以下功能以创建用于存储journal信息的目录:- sudo mkdir -p /var/log/journal或者直接编辑journal配置文件:vi /c/systemd/journald.conf在[Journal]区段下将Storage=选项设定为“persistent”以启用持久记录:/etc/systemd/journald.conf 当启用保存过往引导信息功能后,journalctl会提供额外命令以帮助大家将各引导记录作为独立单元操作。要查看Journald中已经记录的引导信息,可使用–list-boots选项:journalctl --list-boots这里每次引导都将显示为一行。第一列可用于在journalctl中引用该次引导。如果大家需要更为准确的引用方式,则可在第二列中找到引导ID。末尾记录的两次时间为当次引导的开始与结束时间。要显示这些引导中的具体信息,则可使用第一或者第二列提供的信息。例如,要查看上次引导的journal记录,则可使用-1相对指针配合-b标记:journalctl -b -1另外,也可以使用引导ID:journalctl -b 5fd460bd42c7448b89ed9a697112a543时间窗按照引导环境查看日志条目当然非常重要,但我们往往还需要使用与系统引导无关的时间窗作为浏览基准。这种情况在长期运行的服务器当中较为常见。大家可以利用–since与–until选项设定时间段,二者分别负责说明给定时间之前与之后的记录。时间值可以多种格式输出。对于绝对时间值,大家可以使用以下格式:YYYY-MM-DD HH:MM:SS例如,我们可以通过以下命令查看全部2015年1月10日下午5:15之后的条目:journalctl --since "2018-01-5"如果以上格式中的某些组成部分未进行填写,系统会直接进行默认填充。例如,如果日期部分未填写,则会直接显示当前日期。如果时间部分未填写,则缺省使用“00:00:00”(午夜)。第二字段亦可留空,默认值为“00”:journalctl --since "2018-01-5" --until "2018-01-7 3:00"另外,journal还能够理解部分相对值及命名简写。例如,大家可以使用“yesterday”、“today”、“tomorrow”或者“now”等表达。另外,我们也可以使用“-”或者“+”设定相对值,或者使用“ago”之前的表达。获取昨天数据的命令如下:journalctl –since yesterday要获得早9:00到一小时前这段时间内的报告,可使用以下命令:journalctl --since 09:00 --until "1 hour ago"时间窗的过滤机制非常灵活且易用。按信息类型过滤现在我们要探讨如何利用感兴趣的服务或者组件类型实现过滤。Systemd journal同样提供多种方式供大家选择。按单元最常用的此类过滤方式当数按单元过滤了。我们可以使用-u选项实现这一效果。例如,要查看系统上全部来自Nginx单元的日志,可使用以下命令:journalctl -u nginx.service一般来讲,我们可能需要同时按单元与时间进行信息过滤。例如,检查今天某项服务的运行状态:journalctl -u nginx.service --since today我们还可以充分发挥journal查看多种单元信息的优势。例如,如果我们的Nginx进程接入某个PHP-FPM单元以处理动态内容,则可将这两个单元合并并获取按时间排序的查询结果:journalctl -u nginx.service -u php-fpm.service --since today这种能力对于不同程序间交互及系统调试显然非常重要。按进程、用户或者群组ID由于某些服务当中包含多个子进程,因此如果我们希望通过进程ID实现查询,也可以使用相关过滤机制。这里需要指定_PID字段。例如,如果PID为8088,则可输入:journalctl _PID=8088有时候我们可能希望显示全部来自特定用户或者群组的日志条目,这就需要使用_UID或者_GID。例如,如果大家的Web服务器运行在www-data用户下,则可这样找到该用户ID:id -u www-data接下来,我们可以使用该ID返回过滤后的journal结果:journalctl _UID=33 --since todaySystemd journal拥有多种可实现过滤功能的字段。其中一些来自被记录的进程,有些则由journald用于自系统中收集特定时间段内的日志。之前提到的_PID属于后一种。Journal会自动记录并检索进程PID,以备日后过滤之用。大家可以查看当前全部可用journal字段:man systemd.journal-fields下面来看针对这些字段的过滤机制。-F选项可用于显示特定journal字段内的全部可用值。例如,要查看systemd journal拥有条目的群组ID,可使用以下命令:journalctl -F _GID其将显示全部journal已经存储至群组ID字段内的值,并可用于未来的过滤需求。按组件路径我们也可以提供路径位置以实现过滤。如果该路径指向某个可执行文件,则journalctl会显示与该可执行文件相关的全部条目。例如,要找到与bash可执行文件相关的条目:journalctl /usr/bin/bash一般来讲,如果某个单元可用于该可执行文件,那么此方法会更为明确且能够提供更好的相关信息(与子进程相关的条目等)。但有时候,这种作法则无法奏效。显示内核信息内核信息通常存在于dmesg输出结果中,journal同样可对其进行检索。要只显示此类信息,可添加-k或者–dmesg标记:journalctl -k默认情况下,其会显示当前引导环境下的全部内核信息。大家也可以使用常规的引导选择标记对此前的引导记录进行查询。例如,要查询五次之前引导环境的信息:journalctl -k -b -5按优先级管理员们可能感兴趣的另一种过滤机制为信息优先级。尽管以更为详尽的方式查看日志也很有必要,不过在理解现有信息时,低优先级日志往往会分散我们的注意力并导致理解混乱。大家可以使用journalctl配合-p选项显示特定优先级的信息,从而过滤掉优先级较低的信息。例如,只显示错误级别或者更高的日志条目:journalctl -p err -b这将只显示被标记为错误、严重、警告或者紧急级别的信息。Journal的这种实现方式与标准syslog信息在级别上是一致的。大家可以使用优先级名称或者其相关量化值。以下各数字为由最高到最低优先级:0: emerg1: alert2: crit3: err4: warning5: notice6: info7: debug以上为可在-p选项中使用的数字或者名称。选定某一优先级会显示等级与之等同以及更高的信息。修改journal显示内容到这里,过滤部分已经介绍完毕。我们也可以使用多种方式对输出结果进行修改,从而调整journalctl的显示内容。截断或者扩大输出结果我们可以缩小或者扩大输出结果,从而调整journalctl的显示方式。在默认情况下,journalctl会在pager内显示各条目,并通过右箭头键访问其信息。如果大家希望截断输出内容,向其中插入省略号以代表被移除的信息,则可使用–no-full选项:journalctl --no-full 大家也可以要求其显示全部信息,无论其是否包含不可输出的字符。具体方式为添加-a标记:journalctl -a标准输出结果默认情况下,journalctl会在pager内显示输出结果以便于查阅。如果大家希望利用文本操作工具对数据进行处理,则可能需要使用标准格式。在这种情况下,我们需要使用–no-pager选项:journalclt --no-pager这样相关结果即可根据需要被重新定向至磁盘上的文件或者处理工具当中。输出格式如果大家需要对journal条目进行处理,则可能需要使用更易使用的格式以简化数据解析工作。幸运的是,journal能够以多种格式进行显示,只须添加-o选项加格式说明即可。例如,我们可以将journal条目输出为JSON格式:journalctl -b -u nginx -o json这种方式对于工具解析非常重要。大家也可以使用json-pretty格式以更好地处理数据结构:journalctl -b -u nginx -o json-pretty以下为可用于显示的各类格式:cat: 只显示信息字段本身。export: 适合传输或备份的二进制格式。json: 标准JSON,每行一个条目。json-pretty: JSON格式,适合人类阅读习惯。json-sse: JSON格式,经过打包以兼容server-sent事件。short: 默认syslog类输出格式。short-iso: 默认格式,强调显示ISO 8601挂钟时间戳。short-monotonic: 默认格式,提供普通时间戳。short-precise: 默认格式,提供微秒级精度。verbose: 显示该条目的全部可用journal字段,包括通常被内部隐藏的字段。这些选项允许大家以最适合需求的格式显示journal条目。活动进程监控:Journalctl命令还能够帮助管理员以类似于tail的方式监控活动或近期进程。这项功能内置于journalctl当中,允许大家在无需借助其它工具的前提下实现访问。显示近期日志:要显示特定数量的记录,大家可以使用-n选项,具体方式为tail -n。默认情况下,其会显示最近十条记录:journalctl -n大家可以在-n之后指定要查看的条目数量journalctl -n 20追踪日志要主动追踪当前正在编写的日志,大家可以使用-f标记。方式同样为tail -f:journalctl -fJournal维护存储这么多数据当然会带来巨大压力,因此我们还需要了解如何清理部分陈旧日志以释放存储空间。 了解现有磁盘使用量大家可以利用–disk-usage标记查看journal的当前磁盘使用量:journalctl --disk-usage删除旧有日志如果大家打算对journal记录进行清理,则可使用两种不同方式(适用于systemd 218及更高版本)。如果使用–vacuum-size选项,则可硬性指定日志的总体体积,意味着其会不断删除旧有记录直到所占容量符合要求:sudo journalctl --vacuum-size=1G另一种方式则是使用–vacuum-time选项。任何早于这一时间点的条目都将被删除。例如,去年之后的条目才能保留:sudo journalctl --vacuum-time=1years限定Journal扩展大家可以配置自己的服务器以限定journal所能占用的最高容量。要实现这一点,我们需要编辑/etc/systemd/journald.conf文件。以下条目可用于限定journal体积的膨胀速度:SystemMaxUse=: 指定journal所能使用的最高持久存储容量。SystemKeepFree=: 指定journal在添加新条目时需要保留的剩余空间。SystemMaxFileSize=: 控制单一journal文件大小,符合要求方可被转为持久存储。RuntimeMaxUse=: 指定易失性存储中的最大可用磁盘容量(/run文件系统之内)。RuntimeKeepFree=: 指定向易失性存储内写入数据时为其它应用保留的空间量(/run文件系统之内)。RuntimeMaxFileSize=: 指定单一journal文件可占用的最大易失性存储容量(/run文件系统之内)。通过设置上述值,大家可以控制journald对服务器空间的消耗及保留方式。总结到这里,systemd journal对系统及应用数据的收集与管理机制就介绍完毕了。其出色的灵活性源自将广泛的元数据自动记录至集中化日志之内。另外,journalctl命令则显著简化了journal的使用方式,从而让更多管理员得以利用它完成面向不同应用组件的分析与相关调试工作。
 0    0  24天前
hupei
51
先问一个问题,”启动”用英语怎么说?回答是boot。可是,boot原来的意思是靴子,”启动”与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:"pull oneself up by one's bootstraps"字面意思是”拽着鞋带把自己拉起来”,这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!早期真的是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做”拉鞋带”,久而久之就简称为boot了。计算机的整个启动过程分成四个阶段。一、第一阶段:BIOS上个世纪70年代初,”只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序叫做”基本輸出輸入系統”(Basic Input/Output System),简称为BIOS。1.1 硬件自检BIOS中主要存放的程序包括:自诊断程序(通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化)、CMOS设置程序(引导过程中,通过特殊热键启动,进行设置后,存入CMOS RAM中)、系统自动装载程序(在系统自检成功后,将磁盘相对0道0扇区上的引导程序装入内存使其运行)和主要I/O驱动程序和中断服务(BIOS和硬件直接打交道,需要加载I/O驱动程序)。BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。1.2 启动顺序硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这时,BIOS需要知道,”下一阶段的启动程序”具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做”启动顺序”(Boot Sequence)。打开BIOS的操作界面,里面有一项就是”设定启动顺序”。二、第二阶段:主引导记录BIOS按照”启动顺序”,把控制权转交给排在第一位的储存设备。即根据用户指定的引导顺序从软盘、硬盘或是可移动设备中读取启动设备的MBR,并放入指定的位置(0x7c000)内存中。这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给”启动顺序”中的下一个设备。这最前面的512个字节,就叫做”主引导记录”(Master boot record,缩写为MBR)。2.1 主引导记录的结构“主引导记录”只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。主引导记录由三个部分组成:(1) 第1-446字节:调用操作系统的机器码。(2) 第447-510字节:分区表(Partition table)。(3) 第511-512字节:主引导记录签名(0x55和0xAA)。其中,第二部分”分区表”的作用,是将硬盘分成若干个区。2.2 分区表硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统,”主引导记录”因此必须知道将控制权转交给哪个区。分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做”主分区”。每个主分区的16个字节,由6个部分组成:(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。(3) 第5个字节:主分区类型。(4) 第6-8个字节:主分区最后一个扇区的物理位置。(5) 第9-12字节:该主分区第一个扇区的逻辑地址。(6) 第13-16字节:主分区的扇区总数。最后的四个字节(”主分区的扇区总数”),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利用的空间最大也不超过2TB。如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是增加扇区总数。三、第三阶段:硬盘启动这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。3.1 情况A:卷引导记录上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做”卷引导记录”(Volume boot record,缩写为VBR)。“卷引导记录”的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。3.2 情况B:扩展分区和逻辑分区随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)。所谓”扩展分区”,就是指这个区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)。计算机先读取扩展分区的第一个扇区,叫做”扩展引导记录”(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。3.3 情况C:启动管理器在这种情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统。Linux环境中,目前最流行的启动管理器是Grub。对于grub而言,在MBR中的446字节的引导程序属于GRUB的开始执行程序,通过这段程序,进一步执行stage1.5或是stage2的执行程序,将在下面详细介绍执行过程。其中stage1.5或是stage2便属于阶段2引导的过程了,stage2过程也是作为GRUB kernel的核心代码出现。Stage1.5过程(对于GRUB而言存在stage1.5,GRUB2则不存在)的功能很单一,主要就是为了引导stage2过程服务。由于stage2过程的代码存放在文件系统下的boot分区目录中,因此stage1.5过程就是需要提供一个文件系统的环境,而该文件系统环境需要保证系统可以找到stage2过程的文件,那么stage1.5阶段提供的文件系统需要是boot文件系统所对应的,这个在执行grub install过程中就已经确定了。stage2过程中,主要会把系统切换到保护模式,设置好C运行时环境,找到config文件(事实上就是menulist文件),如果没有找到就执行一个shell,等待用户的执行。然后的工作就变成了输入命令->解析命令->执行命令的循环中。当然该阶段引导的最终状态就是执行boot命令,将内核和initrd镜像加载进入内存中,进而将控制权转交给内核。四、第四阶段:操作系统控制权转交给操作系统后,操作系统的内核首先被载入内存。以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。至此,全部启动过程完成。另外在大磊的博客中还有许多细节部分:BIOS启动细节:a) 按下电源开关,电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号);CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。b) 系统BIOS的启动代码首先进行POST(Power-On Self Test,加电后自检)。POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型;在正常情况下,POST过程进行得非常快,几乎无法感觉到它的存在。POST结束之后就会调用其它代码来进行更完整的硬件检测。c) 接下来系统BIOS将查找显卡的BIOS。前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡。此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。d) 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。e) 接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM,并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。f) 内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口和软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。g) 标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备。每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。h) 到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。i) 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时都能够看到“Update ESCD… Success”这样的信息。不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的启动过程中会把ESCD数据修改成自己的格式。但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来。如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。j) ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序顺序比较其放置MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。在确定之后,将该引导设备的MBR内容读入到0x7C00[1]的位置,并再次判断其最后两位,当检测正确之后,进行阶段1的引导。EFI启动细节 与传统MBR相比,GPT采用了不同的分区方式。对于传统MBR,其结构主要如下:上图即对上文中所述的很形象的说明,在图中看到MBR被分成三个部分,分别是:Bootloader、分别表以及Magic Number。其中Bootloader部分为stage1中被执行的起始部分。相反,对于EFI系统中所采用的GPT分区方式,则采用了不同于MBR分区方式的形式,从下图中可以发现:如上图所示,GPT分区表主要包括:保护MBR、首要GPT头、首要GPT、备用GPT、备用GPT头和磁盘数据区。保护MBR与正常的MBR区别不大,主要是分区表上的不同,在保护MBR中只要一个表示为0xEE的分区,以此来表示这块硬盘使用GPT分区表。首要GPT头包含了众多信息,具体内容如下:分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还存储着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否有错误,如果出错了,可以使用软件从硬盘最后的备份GPT分区表恢复整个分区表,如果备份GPT也校验错误,那么磁盘将不可用,系统拒绝启动。接下来主要是128个分区表项,GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B} 。接下来的16字节是该分区的唯一的GUID(这个指的是该分区本身,而之前的GUID指的是该分区的类型)。在接下来是分区其实和末尾的64位LBA编号,以及分区的名字和属性。具体结构如下表:MBR引导接下来开始真正的引导过程了,主要说明GRUP的引导。总体上GRUB更像是一个mini os,只不过这个mini os的作用只是加载其他的操作系统,在GRUB中包括stage1、stage1.5(可选)和stage2,其中stage1和stage1.5属于boot loader,stage2属于mini os的内核部分。GRUB中stage1过程主要位于MBR的前446字节中(对于支持GPT分区的磁盘,同样有最开始的512字节作为保护MBR,保护MBR与正常的MBR区别不大,主要是分区表上的不同,在保护MBR中只要一个表示为0xEE的分区,以此来表示这块硬盘使用GPT分区表,不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作),之后的64字节为硬盘的分区表,最后两个字节为MBR结束标志位(0xAA55)。stage1部分占用了446字节,其代码文件是源码目录下stage1/stage1.S文件,汇编后生成一个512字节的boot.img,被写在硬盘的0面0道1扇区中,作为硬盘的MBR。stage1的工作很简单,就是加载0面0道2扇区上的512字节到0×8000,然后跳转到0×8000执行。在0面0道2扇区上的512字节内容为stage1/start.S文件汇编后生成。该扇区上的内容的作用是加载stage1.5或是stage2过程,并将控制权转交。Grub引导在start过程将控制权转交后,接下来就是GRUB的核心过程了。该过程之所以区分stage1.5和stage2,主要原因是GRUB和GRUB2的区别。在GRUB2中,将stage1.5过程集成到了stage2的过程中,所以stage1.5过程仅仅是针对GRUB的。下面将会分别介绍两种GRUB版本的两种过程。4.1 GRUB中stage1.5过程Stage1.5过程很无辜,它的作用很单一,但是非常关键。它的主要功用就是构造一个boot分区系统对应的文件系统,这样可以通过文件系统的路径(/boot/grub/)寻找stage2过程需要的core.img,进而加载到内存中开始执行。Stage1.5存在于0面0道3扇区开始的地方,并一直延续十几k字节的区域,具体的大小与相应的文件系统的大小有关(文中涉及到了0面0道1-3+x扇区,这部分扇区为保留扇区,BIOS不会放置任何数据。正因为如此如果转换到GPT分区形式,系统将不能被正确引导,如上文所示,MBR后面的扇区都被其他内容所占据)。Stage1.5过程被构建成多种不同类型,但是功能类似,下面简单介绍一下基本的stage1.5过程的文件系统。e2fs_stage1_5(针对ext2fs,可引导ext2和ext3文件系统)、fat_stage1_5(针对fat文件系统,可引导fat32和fat16)、ffs_stage1_5、jfs_stage1_5、minix_stage1_5、reiserfs_stage1_5、vstafs_stage1_5和xfs_stage1_5,这些文件被称为stage1.5过程,这些文件每个至少都在11k以上。除此之外还有两个比较特殊的文件,分别为nbgrub和pxegrub,这两个文件主要是在网络引导时使用,只是格式不同而已,他们很类似与stage2,只是需要建立网络来获取配置文件。由于stage1.5过程中会涉及到多个文件系统对应的文件,因此本文中主要以ext2fs为例进行说明,其他文件系统与此类似,可以同样进行分析理解。对于ext2fs文件系统,用于生成该文件系统的stage1.5过程文件(e2fs_stage1_5)的代码为stage2/fsys_ext2fs.c文件。在stage2/filesys.h文件中定义了每个文件系统对外的接口,用于上层调用,作为stage2过程寻找核心代码使用,文件系统一般被定义的接口主要就是三个函数,分别是mount、read和dir函数。对应ext2fs,其定义的函数为:12345678#ifdef   FSYS_EXT2FS#define   FSYS_EXT2FS_NUM 1int ext2fs_mount   (void);int ext2fs_read   (char *buf, int len);int ext2fs_dir   (char *dirname);#else#define   FSYS_EXT2FS_NUM 0#endif针对ext2fs有如上的函数名称,每个函数将具体在stage2/fsys_ext2fs.c文件中被定义,这里面没有包含任何的写的过程,对于bootloader而言仅仅读就可以完成任务了,没必要对其系统进行写操作。其中ext2fs_mount函数用于检查文件系统类型,并将superblock读入到内存中;ext2fs_read函数和ext2fs_dir函数用于对文件系统具体的操作。在stage2/fsys_ext2fs.c文件中除了需要对这三个函数的定义之外,还需要文件系统的属性的数据结构(superblock、inode和group结构,这些结构最初被定义在include/linux/ext2_fs.h文件中),通过这些数据结构描述一个文件系统。如果读者有兴趣可以试着创建新的文件系统的支持,可以参照目前存在的一些文件系统的模板(实例)编写。4.2 GRUB中stage2过程GRUB中的核心过程也就是stage2过程了,该过程主要是在文件系统建立以后选择合适的操作系统进行加载并转交控制权,达到最后引导操作系统的目标。由于GRUB属于multi boot loader,因此在引导的时候要进行选择,选择哪种操作系统来运行。在GRUB内部主要包括两种方式,首先是从menu.list中读取显示到屏幕让用户选择,其次是通过grub-shell中定义的命令手动进行启动。本文将在后面介绍这两种方式如何运行,接下来先介绍一下stage2的具体的执行过程。在上面一节中介绍过,stage1.5过程中将boot分区的文件系统加载了,之后又做了一件事情,就是将控制权转交给stage2,而stage2入口的地方就是stage2/asm.S文件。Stage2/asm.S文件属于汇编代码,主要作用是初始化C语言的运行环境,为下面执行C语言的函数做好准备,在准备好之后,将执行init_bios_info(stage2/common.c)函数。init_bios_info函数的作用是执行一些底层的函数,然后跳转到cmain执行,cmain函数位于stage2/stage2.c文件中。cmain函数内部进行一个死循环,在循环内部首先加载配置文件,显示给用户,在这同时循环一个内层循环,在内层循环中,获取配置文件中的命令,并解析执行。过程中如果没有可用的配置文件,那么进入命令行模式(enter_cmdline函数),如果找到可用的menu,那么开始执行menu的对应的内容(run_menu函数)。对于enter_cmdline(stage2/stage2.c)函数,将调用find_command(stage2/cmdline.c),进而执行相应命令的函数。对于run_menu(stage2/stage2.c)函数,将调用stage2/cmdline.c文件中的run_script函数,进而调用find_command,执行相应命令的函数。这两种方式虽然经过了不同的过程,对用户输入的行为进行分析和处理,最终调用的函数为find_command,在该函数中顺序循环比较“输入”的命令是否与系统内部定义的相同,如果相同转到执行该函数。在这个比较的过程中包含了一个全局的数据结构为struct builtin(stage2/shared.h),由该数据结构组成了一个table类型(stage2/builtins.c),将命令与相对应的builtin结构对应一起并进行串联。下面描述一下builtin结构的定义:1234567891011121314struct builtin {  /* 命令名称,重要,是搜索命令时的依据*/  char *name;  /* 命令函数,重要,是搜索匹配后调用的函数*/  int (*func) (char *, int);  /* 功能标示,一般未用到. */  int flags;  /* 简短帮助信息*/  char *short_doc;  /* 完整帮助信息*/  char *long_doc;}; struct builtin   *builtin_table[]struct builtin *builtin_table[];有兴趣的读者可以对上面的内容进行扩展,形成自己的命令,主要在stage2/builtins.c文件中按照预定的格式更新,并添加到builtin_table中即可。在上面打开配置文件的过程中,主要是通过一些文件操作函数(被定义在stage2/disk_io.c中)完成。这些文件操作函数主要包括:grub_open、grub_read、grub_seek和grub_close等,这些函数属于grub对外的上层接口,具体的函数内部将调用前文中提到的boot分区对应的文件系统的相应的函数完成,这个过程主要是通过回调函数来完成。该过程整体思路类似于面向对象过程,通过对象操作具体的函数。
 0    0  24天前
hupei
48
SQL效率提升之一些SQL编写建议并有效利用索引1.日期属性列,不会因为有分秒差别而减慢查询速度 2. 使用LIKE比较进行查询时,如果模式以特定字符串如“abc%”开头,使用索引则会提高效率;如果模式以通配符如“%xyz”开头,则索引不起作用 3. OR会引起全表扫描,且和IN的作用相当 4. 尽量少用NOT 5. EXISTS 和 IN的执行效率是一样的 6. 用函数charindex()和前面加通配符%的LIKE执行效率一样 7. UNION并不绝对比OR的执行效率高 8. 字段提取要按照“需多少、提多少”的原则,避免“SELECT *” 9. COUNT(*)不比COUNT (字段)慢 10. ORDER BY按聚集索引列排序效率最高 11. 多用“TOP”进行数据提取,可提高效率
 0    0  24天前
hupei
103
在计算机时代,很大一部分人有一个误解,认为Unix和Linux操作系统是一样的。 但是,情况正好相反。 让我们仔细看看。什么是Unix在IT方面,我们遇到了Unix作为AT&T于1969年在美国新泽西州创建的操作系统(在商标下)。 大多数操作系统都受Unix的启发,但Unix也受到了Multics系统的启发,该系统尚未完成。 另一个版本的Unix是贝尔实验室的Plan 9。Unix在哪里使用?作为一个操作系统,Unix特别用于服务器,工作站,现在也用于个人电脑。 它在创建互联网,创建计算机网络或客户端 - 服务器模型方面发挥了非常重要的作用。Unix系统的特点:支持多任务(多任务)与Multics相比,控制简单所有数据都以纯文本形式存储树保存单根文件访问多个用户帐户Unix操作系统组成:a)一个单一的操作系统内核,负责处理低级和用户启动的操作,整个通信通过系统调用进行。b)系统实用程序(或所谓的实用程序)c)许多其他应用程序什么是Linux这是一个基于Unix系统原理的开源操作系统。正如开源描述的名称所暗示的那样,它是一个可以自由下载的系统,可以从外部下载,但是也可能干扰系统的编辑,添加和扩展源代码。与今天的付费操作系统(Windows,Mac OS X,...)不同,这是最大的好处之一。 Unix不仅是创建新操作系统的典范,另一个重要因素是MINIX系统。与Linus不同,这个版本被其创建者(Andrew Tanenbaum)用作商业系统。LINUX于1991年开始由Linus Torvalds开发,这个系统被作为一种爱好来处理。 Linux开始处理Unix的一个主要原因是系统的简单性。 Linux的第一个官方版本(0.01)发生在1991年9月17日。尽管系统是完全不完善和完整的,但他对此感兴趣,在几天之内,Linus开始写邮件给关于扩展或源代码的其他想法。Linux的特点Linux的基石是Unix内核,它基于Unix的基本特性以及POSIX和Single UNIX Specification的标准。看起来,操作系统的正式名称取自Linus的创建者,操作系统名称“x”的末尾只是Unix系统的一个链接。主要特点:一次运行多个任务(多任务)程序可能由一个或多个进程(多用途系统)组成,每个进程可能有一个或多个线程多用户,所以它可以运行多个用户程序个人帐户受适当的授权保护所以账目已经精确定义了系统控制权Tuxe Penguin的标志的作者是1996年的Larry Ewing,他接受了他作为他的开源Linux操作系统的吉祥物。 Linux Torvalds将free操作系统的名字叫做“freax”,称为free + freak + x(Unix系统),但是它并不喜欢运行Linux版本的FTP服务器。
 0    0  69天前
hupei
146
2011-04-20说道Linux想必ubuntu的大名大家早就听说,很多都是因为知道ubuntu才知道linux的。但是要提到安装ubuntu那颗就有点犯难了,因为ubuntu的版本太多了,选择哪个安装呢?这确实是个头疼的问题,今天我们暂且放下kubuntu,edubuntu等,就说说ubuntu的桌面版和服务器版本之间的区别。让大家有个感性的认识。其实只要发 布版本号一致,这两者从核心来说也就是相同的,唯一的差别在于它们的预期用途。桌面版面向个人电脑使用者,可以进行文字处理、网页浏览、多媒体播放和玩游 戏。本质上说,这是一个为普通用户所定制的多用途操作系统。另一方面,服务器版旨在充当web服务器,可用来托管文件、网页及相似内容。个人电脑上必备的组成部分是GUI(图形用户界面)。Ubuntu的桌面版默认带有 Gnome GUI,不过,如果你有需要,也可转换为KDE或X。而服务器版是不安装GUI的。除了日常维护,服务器不打算用于本地交互,因而GUI不仅没有存在的必 要,而且还会消耗服务器多余的资源。对于其他软件,如办公软件、媒体播放软件、浏览器等等,道理也是一样。在服务器版上这些统统找不到。由于是面向服务器的,服务器版Ubuntu包含了所有你需要启动托管站点的软件。LAMP,即Linux、Apache、MySQL和PHP的缩写,列出了与web服务器相关的软件。除非你自行安装,否则这些在桌面版上是找不到的。记住,以上区别并非一成不变,通过安装和卸载软件包,你也可以将桌面版定制为服务器版,反之亦然。多数想装服务器的人仍然需要GUI的便利,那么可以从任何一个版本起步,然后只需安装GUI或LAMP即可。总结:1. 桌面版为个人电脑所配置,而服务器版适用于web服务器。2. 桌面版预装了GUI,而服务器版没有。3. 桌面版已经安装了许多服务器版没有的软件。4. 桌面版缺少Apache、MySQL和PHP,而这些在服务器版中是标准配置。OK,现在大概明白了ubuntu的桌面版本和服务器版本之间的一些差别了吧?如果你喜欢折腾黑乎乎的命令窗口可以彻底过下瘾,安装ubuntu服务器版本,其实还可以用centos,这个linux迷用的最多了,用它来作网络实验确实很爽。
 0    0  91天前
hupei
116
在安装软件过程中需要用到yum命令,百度一下有人说ubuntu是不支持yum命令的,自己就尝试了一下ubuntu yum命令的安装,安装过程如下(ubuntu版本是12.04)1:首先检测是否安装了build-essential程序包       apt-get install build-essential2.安装yum3.yum安装成功4.介绍下yum命令yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。yum的命令形式一般是如下:yum [options] [command] [package ...]
 0    0  91天前
hupei
136
“有些人生来就注定能领导几百万人,有些人生来就注定能写出天翻地覆的软件,但只有一个人两样都能做到,Linus Torvalds。”——《时代周刊》“talk is cheap,show me the code!”如果你是个程序员,对这句话肯定不陌生。Linux之父Linus的这句话,好像一副小鞭,隔空“抽打”着码农们好好写代码。而Linus本人,今年(2019)刚满50岁,可以说,他的半辈子赶得上别人几辈子!英雄出少年1969年,Linus出生在芬兰首都赫尔辛基。父亲从政,母亲是一名编辑。父母早年离婚,所以Linus更多和母亲住一起。也正因此,受在赫尔辛基大学当统计学教授的外公影响,Linus12岁就用上了外公买来的Comomdore VIC-20电脑。他总是坐在外公膝盖上,去输入后者写在纸上的程序。后来,十几岁的Linus,终于编出来了人生中第一个程序!Linus编写出的第一个程序“陷入”编程不能自拔的他,还跟外公要钱,买了计算机图书和杂志,从此在自我钻研的路上一发不可收拾。以至于,12岁开始以后的整个少年时代,都在编程、编程、编程。要是有人打扰他,迎来的可能是一顿发火。外公去世后,电脑归给Linus,他变得愈加“放肆”,这一“放肆”,研究出个操作系统Linux。那是他在赫尔辛基大学读计算机专业的第二年,一本名叫《操作系统:设计与实现》的书,让他“达到了一个全新的高度,改变了他的一生。”在这本书里,作者坦尼鲍姆“讨论了他为Unix操作系统编写的教学辅助工具——Minix操作系统。”事实上,Minix同时也是一个小型的翻版Unix系统。所以读完《操作系统:设计与实现》之后,Linus决定买一台新电脑来玩Unix系统。玩着玩着,他就想自己编写一个能替代Minix的操作系统。在那些没日没夜、不辨早晚的日子里,每天一下床就坐在电脑前。终于有一天,shell程序实现了运行!这意味着,一个可行操作系统的基础打好了!很快,Linus就开始测试它的内置程序......1991年9月17日,Linus发布了Linux 0.01版本,并且,开放了源代码!可以说,Linux从一开始就是为开源而生!很快,人们就被Linux的分页到磁盘功能吸引,很多Minix用户纷纷改用Linux。有些用户觉得Linus不赚钱太可惜,就想给他打钱。他拒绝了,还说:“如果你们想回馈我,那就给我寄明信片吧!”他一直坚信,“要使Linux发展成十全十美的系统,就必须保持免费且开源。”1993年,24岁的Linus继承外公衣钵,开始在赫尔辛基大学当《计算机科学入门》课程的助教。在课堂上,Linus遇到了一生挚爱、后来从自己学生变为妻子的朵芙。1994年,位于美国犹他州的Novell网络公司,邀请Linus造访Novell。不过,Linus说要去的话,Novell得负担他去另一个美国城市的费用。Novell答应了,而他选的另一个城市,正是日后他的工作地——旧金山。离开学校,勇闯硅谷1996年,Linus从赫尔辛基大学离职,接受了硅谷全美达公司的工作邀请。有趣的是,全美达的投资人之一正是微软的创始人之一保罗·艾伦。而日后,Linus和微软可谓交恶颇深。去全美达,很多人都觉Linus斯被招安了,但实际上,全美达允许他在上班时间“一定程度上”维护Linux。所以,Linux从未因为Linus换工作而“荒废。”和乔布斯的不愉快见面来到硅谷没多久,他就收到了乔布斯秘书的约见面邮件,当时,电脑市场上只有微软和苹果两个玩家。乔布斯想拉拢Linus,带领着参加Linux开源的程序员们,一起开发Mac OS X系统。Linus当然......没接收。因为他觉得苹果开发的操作系统中使用的内核Mach缺乏内存保护功能。尽管乔布斯说:“要是想进入台式机市场,就应该与苹果联手。”他还气哄哄地说:“为什么我就应该对苹果的事情感兴趣?我就是不感兴趣,我就是觉得苹果没意思。”1998年,Sun公司宣布加入Linux的开源运动中。很快,IBM也加入其中。同年,英孚美公司宣布对Linux开放数据库接口。而紧跟英孚美脚步的则是Oracle。这时,微软感到了威胁。交恶微软Linux因为比其他操作系统自由得多,再加上人们受够了微软系统中的各种“强迫用户”行为,一时间,很多人纷纷改用Linux。这一度让微软把Linus视为眼中钉,甚至把他的头像放在飞镖靶子上。不过比起比尔·盖茨,人们却更喜欢Linus。因为比尔住在一套高科技的湖边别墅里,而Linus却和家人挤在三居室的房子里。正是这样安贫乐道的形象,让人们很喜欢他。毕竟把Linux开源了,怎么会赚到钱呢?不过,Linus并不是不喜欢钱,而是只要让自己心安理得的钱。比如红帽公司为了感激他,曾经给了他一些期权,红帽IPO之后,这些期权价值100万美元!不过,伦敦有家公司老总说,只要Linus愿意给其公司挂名,就可以给一千万美元,却被他狠狠地拒绝。这位来自北欧寒冷国家的男子,并不是不爱钱,只是取之有道。从愤怒中诞生的Git2003年,Linus加入开放源代码开发实验室,这时他开始全身心投入Linux内核研发。同时,另一个跨时代产品,也快“发芽”了。“2002年,Linux内核开发团队开始采用BitKeeper作为代码版本管理工具。BitKeeper是一套分布式的版本管理工具,它满足了Linux内核开发的技术需求。但是BitKeeper只是暂时对Linux等开源软件团队免费,并不是自由软件。2005年,BitMover公司不再免费赞助Linux开发团队。对此Linus表示非常遗憾,但遗憾之后,他并没有自怨自艾伤心落泪,而是愤怒地与其他几个小伙伴花了几个星期完成了一套新的分布式代码管理工具,命名为Git。两个月之后,Git发布了官方版本,并在不同的项目中应用,自由软件社区给予了Git广泛的支持。”随着Git技术的日臻成熟,2008年2月,GitHub公司基于Git构建了协作式源代码托管网站GitHub,现在该网站有多流行,想必大家都知道。吊诡的是,后来GitHub被Linus的死对头微软给收购了。人生啊,真是轮回。“戎马一生”,如今竟成空巢老人!2019年5月中旬,Linux 5.1内核系列已经发布。Linus的大女儿也将于5月毕业,最小的女儿在读高三。再过半年,Linus和妻子朵芙就会成为空巢老人。Linux或将永生,而Linus却在一天天变老。不知道他的下半生,会不会比上半生更精彩呢?期待。编者按:本文来自微信公众号“CSDN”(ID:CSDNnews),作者:胡巍巍,36氪经授权发布。
 0    0  96天前
快速发帖高级模式
Powered by 虎佩中国
© 2012-2019 HuPei.net
您的IP:3.227.233.6,2019-08-25 09:08:07,Processed in 0.14328 second(s).
Powered by HuPei.net
免责声明:本站内容均来自网络,如有侵权请联系站长删除,一切后果概不负责!