linuxer2016
linuxer2016
关注数: 0
粉丝数: 34
发帖数: 135
关注贴吧数: 9
【17-05-29】 【转帖】从源码解读Mysql 5.7性能和数据安全性的提 下面我们从源码来分析mysql的事务提交以及事务在何时将binlog复制到从库的。 MYSQL_BIN_LOG::ordered_commit,这个是事务在binlog阶段提交的核心函数,通过该函数,实现了事务日志写入binlog文件,以及触发dump线程将binlog发送到slave,在最后的步骤,将事务设置为提交状态。 我们来分析MYSQL_BIN_LOG::ordered_commit这个函数的核心过程,该函数位于binlog.cc文件中。 源码解析 MYSQL_BIN_LOG::ordered_commit,这个函数,核心步骤如下: 第一步骤:flush Stage#1: flushing transactions to binary log: 步骤1 :将事务的日志写入binlog文件的buffer中,函数如下: process_flush_stage_queue(&total_bytes,&do_rotate, &wait_queue); 从5.6开始,mysql引入了group commit 的概念,这样可以避免每个事务提交都会锁定一次binlog.另外,还有一个用处,就是mysql的5.7的基于logical_clock的并行复制。在一个组里面(其实是一个队列),本文所涉及的软件工具和命令实例都可以在《Linux就该这么学》中找到详细的解释。这一组队列的头事务是相同的,因此这一组事务的last_committed(上一组的最后一个提交的事务)的事务也是同一个。我们都知道,last_committed相同的事务,是可以在从库并行relay(重演)的。该函数process_flush_stage_queue的作用,就是将commit队列中的线程一个一个的取出,然后执行子函数 flush_thread_caches(head);循环的代码如下:将各自线程中的binlog cache写入到binlog中。 /* Flush thread caches to binary log. */for (THD *head= first_seen ; head ; head = head->next_to_commit){std::pair<int,my_off_t>result= flush_thread_caches(head);total_bytes+= result.second;if(flush_error == 1)flush_error= result.first;#ifndef DBUG_OFFno_flushes++;#endif}第二步骤SYNC to disk Stage#2: Syncing binary log file to disk 第二步:将binlog file中cache的部分写入disk.但这个步骤参数sync_binlog起决定性的作用。 我们来看看源码,除了这些还有哪些细节步骤,看完源码分析之后,你应该有新的收获与理解。 在执行真正的将binlog写到磁盘之前,会进行一个等待,函数如下: stage_manager.wait_count_or_timeout(opt_binlog_group_commit_sync_no_delay_count,opt_binlog_group_commit_sync_delay,Stage_manager::SYNC_STAGE); 等待的时间由mysql参数文件中的binlog_group_commit_sync_delay,binlog_group_commit_sync_no_delay_count 这两参数共同决定,第一个表示该事务组提交之前总共等待累积到多少个事务,第二个参数则表示该事务组总共等待多长时间后进行提交,任何一个条件满足则进行后续操作。因为有这个等待,可以让更多事务的binlog通过一次写binlog文件磁盘来完成提交,从而获得更高的吞吐量。 接下来,就是执行sync_binlog_file,该函数会用到mysql参数文件中sync_binlog参数的值,如果为0,则不进行写磁盘操作,由操作系统决定什么时候刷盘,如果为1,则强制进行写磁盘操作。 再接下来,执行update_binlog_end_pos函数,用来更新binlog文件的最后的位置binlog_end_pos,该binlog_end_pos是一个全局的变量。在执行更新该位置之前,先得找到最后一个提交事务的线程(因为是group commit,多个事务排队提交的机制)。因为已经将要提交事务的线程组成了一个链表,通过从头到尾找,可以找到最后一个线程。代码如下: if(update_binlog_end_pos_after_sync){THD*tmp_thd= final_queue;while(tmp_thd->next_to_commit != NULL)tmp_thd= tmp_thd->next_to_commit;update_binlog_end_pos(tmp_thd->get_trans_pos());} 接下来,我们来看一下这个函数update_binlog_end_pos,这个函数很简单,传入一个pos,然后将其赋值给全局变量binlog_end_pos,接下来就是最核心的一行代码,signal_update(),发送binlog更新的信号,因此从主库同步binlog到从库的dump线程,会接收到这个binlog已有更新的信号,然后启动dump binlog的流程。 函数update_binlog_end_pos的完整代码如下。 semisync 通过上面的步骤介绍,我们看到,在binlog文件的最新位置更新的时候,就已经通过signal_update函数发送信号给binlog的dump线程,该线程就可以将事务的binlog同步到从库,从库接收到日志之后,就可以relay日志,实现了主从同步。因此,再次重复说明一下,按照上面的解释,在事务真正提交完成之前就开始发送了binlog已经更新的信号,dump线程收到信号,即可以进行binlog的同步。而semisync的作用是什么呢? 实际上,有没有semisync机制,上面介绍的mysql的有关事务提交中关于binlog的流程都是一样的,semisync的作用,只是主从之间的一个确认过程,主库等待从库返回相关位置的binlog已经同步到从库的确认,(而实际实现则是等待dump线程给用户会话线程一个回复),没有得到确认之前(或者等待时间达到timeout),事务提交则在该函数(步骤)上等待直至获得返回。具体执行binlog已经同步到某个位置的的确认函数为repl_semi_report_binlog_sync,函数如下: int repl_semi_report_binlog_sync(Binlog_storage_param *param,constchar *log_file,my_off_t log_pos){if(rpl_semi_sync_master_wait_point == WAIT_AFTER_SYNC)return repl_semisync.commitTrx(log_file, log_pos);return 0;} 通过观察上述函数,我们可以看到有个rpl_semi_sync_master_wait_point变量与WAIT_AFTER_SYNC比较,如果不相等,则直接返回,直接返回则表示不需要在此时此刻确认binlog是否已经同步,而这个变量的取值来自于半同步参数semi_sync_master_wait_point的初始设置,我们可以设置为after_sync与after_commit。这两个参数含义的区别是:after_sync是在将binlog sync到disk之后(具体是否真正sync由参数sync_binlog的值决定)进行日志同步确认,而after_commit是将事务完成在innodb里面提交之后再进行binlog的同步确认。两者确认的时间点不同,after_sync要早于after_commit. 接下来,我们来看repl_semisync.commitTrx 这个函数,这个函数有两个传入参数,一个是binlog文件,一个binlog文件的位移。我们来看这个函数的含义吧。算了,还是直接用源码的注释来解释吧。上面的注释说得相当清楚,就是该commiTRX函数会等待binlog-dump返回已经同步到该位置的报告,如果还没有同步到该位置,则继续等待,直到超时返回。 当会话线程收到该函数的返回时,事务的提交过程继续往下走,直至在innodb真正提交。
【17-04-04】 【分享】详解:linux下安装和配置 FTP FTP(文件传输协议)是一个较老且最常用的标准网络协议,用于在两台计算机之间通过网络上传/下载文件。然而, FTP 最初的时候并不安全,因为它仅通过用户凭证(用户名和密码)传输数据,没有进行加密。 警告:如果你打算使用 FTP, 需要考虑通过 SSL/TLS配置 FTP 连接。否则,使用安全 FTP,比如 SFTP 会更好一些。 在这个教程中,我将向你们展示如何在 Ubuntu 中安装、配置并保护 FTP 服务器(VSFTPD 的全称是 “Very Secure FTP Deamon”),从而拥有强大的安全性,能够防范 FTP 漏洞。 第一步:在 Ubuntu 中安装 VSFTPD 服务器 首先,我们需要更新系统安装包列表,然后像下面这样安装 VSFTPD 二进制包: $ sudo apt-get update$ sudo apt-get install vsftpd 一旦安装完成,初始情况下服务被禁用。因此,我们需要手动开启服务,同时,启动它使得在下次开机时能够自动开启服务: ------------- On SystemD -------------# systemctl start vsftpd# systemctl enable vsftpd------------- On SysVInit -------------# service vsftpd start# chkconfig --level 35 vsftpd on 接下来,如果你在服务器上启用了 UFW 防火墙(默认情况下不启用),那么需要打开端口 20 和 21 —— FTP 守护进程正在监听它们——从而才能允许从远程机器访问 FTP 服务,如果有什么不清楚的地方,欢迎访问原帖linuxprobe.com/ubuntu-ftp-service.html然后,像下面这样添加新的防火墙规则: $ sudo ufw allow 20/tcp$ sudo ufw allow 21/tcp$ sudo ufw status第二步:在 Ubuntu 中配置并保护 VSFTPD 服务器 让我们进行一些配置来设置和保护 FTP 服务器。首先,我们像下面这样创建一个原始配置文件 /etc/vsftpd/vsftpd.conf 的备份文件: $ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig 接下来,打开 vsftpd 配置文件。 $ sudo vi /etc/vsftpd.confOR$ sudo nano /etc/vsftpd.conf 把下面的这些选项添加/改成所展示的值: anonymous_enable=NO # 关闭匿名登录local_enable=YES # 允许本地用户登录write_enable=YES # 启用可以修改文件的 FTP 命令local_umask=022 # 本地用户创建文件的 umask 值dirmessage_enable=YES # 当用户第一次进入新目录时显示提示消息xferlog_enable=YES # 一个存有详细的上传和下载信息的日志文件connect_from_port_20=YES # 在服务器上针对 PORT 类型的连接使用端口 20(FTP 数据)xferlog_std_format=YES # 保持标准日志文件格式listen=NO # 阻止 vsftpd 在独立模式下运行listen_ipv6=YES # vsftpd 将监听 ipv6 而不是 IPv4,你可以根据你的网络情况设置pam_service_name=vsftpd # vsftpd 将使用的 PAM 验证设备的名字userlist_enable=YES # 允许 vsftpd 加载用户名字列表tcp_wrappers=YES # 打开 tcp 包装器 现在,配置 VSFTPD ,基于用户列表文件/etc/vsftpd.userlist 来允许或拒绝用户访问 FTP。 注意,在默认情况下,如果通过userlist_enable=YES 启用了用户列表,且设置userlist_deny=YES 时,那么,用户列表文件/etc/vsftpd.userlist 中的用户是不能登录访问的。 但是,选项userlist_deny=NO 则反转了默认设置,这种情况下只有用户名被明确列出在/etc/vsftpd.userlist 中的用户才允许登录到 FTP 服务器。 userlist_enable=YES # vsftpd 将会从所给的用户列表文件中加载用户名字列表userlist_file=/etc/vsftpd.userlist # 存储用户名字的列表userlist_deny=NO 重要的是,当用户登录 FTP 服务器以后,他们将进入 chrooted 环境,即当在 FTP 会话时,其 root 目录将是其 home 目录。 接下来,我们来看一看两种可能的途径来设置 chrooted(本地 root)目录,正如下面所展示的。 这时,让我们添加/修改/取消这两个选项来将 FTP 用户限制在其 home 目录 chroot_local_user=YESallow_writeable_chroot=YES 选项chroot_local_user=YES 意味着本地用户将进入 chroot 环境,当登录以后默认情况下是其 home 目录。 并且我们要知道,默认情况下,出于安全原因,VSFTPD 不允许 chroot 目录具有可写权限。然而,我们可以通过选项allow_writeable_chroot=YES 来改变这个设置 保存文件然后关闭。现在我们需要重启 VSFTPD 服务从而使上面的这些更改生效: ------------- On SystemD -------------# systemctl restart vsftpd------------- On SysVInit -------------# service vsftpd restart第三步:在 Ubuntu 上测试 VsFTP 服务器 现在,我们通过使用下面展示的 useradd 命令创建一个 FTP 用户来测试 FTP 服务器: $ sudo useradd -m -c "Aaron Kili, Contributor" -s /bin/bash aaronkilik$ sudo passwd aaronkilik 然后,我们需要像下面这样使用 echo 命令和 tee 命令来明确地列出文件/etc/vsftpd.userlist 中的用户 aaronkilik: $ echo "aaronkilik" | sudo tee -a /etc/vsftpd.userlist$ cat /etc/vsftpd.userlist 现在,是时候来测试上面的配置是否具有我们想要的功能了。我们首先测试匿名登录;我们可以从下面的输出中很清楚的看到,在这个 FTP 服务器中是不允许匿名登录的: # ftp 192.168.56.102Connected to 192.168.56.102 (192.168.56.102).220 Welcome to TecMint.com FTP service.Name (192.168.56.102:aaronkilik) : anonymous530 Permission denied.Login failed.ftp> bye221 Goodbye. 接下来,我们将测试,如果用户的名字没有在文件/etc/vsftpd.userlist 中,是否能够登录。从下面的输出中,我们看到,这是不可以的: # ftp 192.168.56.102Connected to 192.168.56.102 (192.168.56.102).220 Welcome to TecMint.com FTP service.Name (192.168.56.10:root) : user1530 Permission denied.Login failed.ftp> bye221 Goodbye. 现在,我们将进行最后一项测试,来确定列在文件/etc/vsftpd.userlist 文件中的用户登录以后,是否实际处于 home 目录。从下面的输出中可知,是这样的: # ftp 192.168.56.102Connected to 192.168.56.102 (192.168.56.102).220 Welcome to TecMint.com FTP service.Name (192.168.56.102:aaronkilik) : aaronkilik331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> ls在 Ubuntu 中确认 FTP 登录 警告:设置选项allow_writeable_chroot=YES 是很危险的,特别是如果用户具有上传权限,或者可以 shell 访问的时候,很可能会出现安全问题。只有当你确切的知道你在做什么的时候,才可以使用这个选项。 我们需要注意,这些安全问题不仅会影响到 VSFTPD,也会影响让本地用户进入 chroot 环境的 FTP daemon。 因为这些原因,在下一步中,我将阐述一个更安全的方法,来帮助用户设置一个非可写本地 root 目录。 第四步:在 Ubuntu 中配置 FTP 用户的 Home 目录 现在,再次打开 VSFTPD 配置文件。 $ sudo vi /etc/vsftpd.confOR$ sudo nano /etc/vsftpd.conf 然后像下面这样用# 把不安全选项注释了: #allow_writeable_chroot=YES 接下来,为用户创建一个替代的本地 root 目录(aaronkilik,你的可能和这不一样),然后设置目录权限,取消其他所有用户对此目录的写入权限: $ sudo mkdir /home/aaronkilik/ftp$ sudo chown nobody:nogroup /home/aaronkilik/ftp$ sudo chmod a-w /home/aaronkilik/ftp 然后,在本地 root 目录下创建一个具有合适权限的目录,用户将在这儿存储文件: $ sudo mkdir /home/aaronkilik/ftp/files$ sudo chown -R aaronkilk:aaronkilik /home/aaronkilik/ftp/files$ sudo chmod -R 0770 /home/aaronkilik/ftp/files/ 之后,将 VSFTPD 配置文件中的下面这些选项添加/修改为相应的值: user_sub_token=$USER # 在本地 root 目录中插入用户名local_root=/home/$USER/ftp # 定义各个用户的本地 root 目录 保存文件并关闭。然后重启 VSFTPD 服务来使上面的设置生效: ------------- On SystemD -------------# systemctl restart vsftpd------------- On SysVInit -------------# service vsftpd restart 现在,让我们来最后检查一下,确保用户的本地 root 目录是我们在他的 Home 目录中创建的 FTP 目录。 # ftp 192.168.56.102Connected to 192.168.56.102 (192.168.56.102).220 Welcome to TecMint.com FTP service.Name (192.168.56.10:aaronkilik) : aaronkilik331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> lsFTP 用户 Home 目录登录
Linux数据分析之九个给力的命令行工具 要对数据进行分析,大家会从哪里入手? 对于大多数熟悉了图形工作环境的朋友来说,电子表格工具无疑是第一选项。但命令行工具同样能够更快更高效地解决问题——且只须稍微学习即可上手。 大部分此类工具冻严格局限于Linux,而多数可同样运行在Unix甚至是Windows环境之下。在今天的文章中,我们将尝试几款简单的开源数据分析工具,并共同了解其如何运作。一、head与tail 首先,让我们先从文件处理开始。文件中有什么内容?其格式如何?大家可以使用cat命令在终端中显示文件,但其显然不适合处理内容较长的文件。 输入head与tail,二者能够完整显示文件中的指定行数内容。如果大家未指定行数,则默认显示其中10行。 $ tail -n 3 jan2017articles.csv 02 Jan 2017,Article,Scott Nesbitt,3 tips for effectively using wikis for documentation,1,/article/17/1/tips-using-wiki-documentation,"Documentation, Wiki",710 02 Jan 2017,Article,Jen Wike Huger,The Opensource.com preview for January,0,/article/17/1/editorial-preview-january,,358 02 Jan 2017,Poll,Jason Baker,What is your open source New Year's resolution?,1,/poll/17/1/what-your-open-source-new-years-resolution,,186 在最后三行中,我能够找到日期、作者姓名、标题以及其他一些信息。不过由于缺少列头,我不清楚各列的具体含义。下面查看各列的具体标题: $ head -n 1 jan2017articles.csv Post date,Content type,Author,Title,Comment count,Path,Tags,Word count 现在一切都非常明确,我们可以看到发布日期、内容类型、作者、标题、提交次数、相关URL、各文章标签以及字数。 二、wc 但如果需要分析数百甚至上千篇文章,又该如何处理?这里就要使用wc命令了——其为“字数”一词的缩写。wc能够对文件的字节、字符、单词或者行数进行计数。在本示例中,我们希望了解文章中的行数。 $ wc -l jan2017articles.csv 93 jan2017articles.csv 本文件共有93行,考虑到第一行中包含文件标题,因此可以推测此文件是一份包含92篇文章的列表。 三、grep 下面提出新的问题:其中有多少篇文章与安全话题有关?为了实现目标,我们假定需要的文章会在标题、标签或者其他位置提到安全这一字眼。这时,grep工具可用于通过特定字符搜索文件或者实现其他搜索模式。这是一款极为强大的工具,因为我们甚至能够利用正则表达式建立极为精确的匹配模式。欢迎访问linuxprobe.comwangye不过这里,我们只需要寻找一条简单的字符串。 $ grep -i "security" jan2017articles.csv 30 Jan 2017,Article,Tiberius Hefflin,4 ways to improve your security online right now,3,/article/17/1/4-ways-improve-your-online-security,Security and encryption,1242 28 Jan 2017,Article,Subhashish Panigrahi,How communities in India support privacy and software freedom,0,/article/17/1/how-communities-india-support-privacy-software-freedom,Security and encryption,453 27 Jan 2017,Article,Alan Smithee,Data Privacy Day 2017: Solutions for everyday privacy,5,/article/17/1/every-day-privacy,"Big data, Security and encryption",1424 04 Jan 2017,Article,Daniel J Walsh,50 ways to avoid getting hacked in 2017,14,/article/17/1/yearbook-50-ways-avoid-getting-hacked,"Yearbook, 2016 Open Source Yearbook, Security and encryption, Containers, Docker, Linux",2143 我们使用的格式为grep加-i标记(告知grep不区分大小写),再加我们希望搜索的模式,最后是我们所搜索的目标文件的位置。最后我们找到了4篇安全相关文章。如果搜索的范围更加具体,我们可以使用pipe——它能够将grep同wc命令加以结合,用以了解其中有多少行提到了安全内容。 $ grep -i "security" jan2017articles.csv | wc -l 4 这样,wc会提取grep命令的输出结果并将其作为输入内容。很明显,这种结合再加上一点shell脚本,终端将立即变成一款强大的数据分析工具。 四、tr 在多数分析场景下,我们都会面对CSV文件——但我们该如何将其转换为其他格式以实现不同应用方式?这里,我们将其转化为HTML形式以通过表格进行数据使用。tr命令可帮助大家实现这一目标,它可将一类字符转化为另一类。同样的,大家也可以配合pipe命令实现输出/输入对接。 下面,我们试试另一个多部分示例,即创建一个TSV(即制表符分隔值)文件,其中只包含发表于1月20日的文章。 $ grep "20 Jan 2017" jan2017articles.csv | tr ',' '/t' > jan20only.tsv 首先,我们利用grep进行日期查询。我们将此结果pipe至tr命令,并利用后者将全部逗号替换为tab(表示为'/t')。但结果去哪了?这里我们使用〉字符将结果输出为新文件而非屏幕结果。如此一来,我们可以dqywjan20only.tsv文件中一定包含预期的数据。 $ cat jan20only.tsv 20 Jan 2017 Article Kushal Das 5 ways to expand your project's contributor base 2 /article/17/1/expand-project-contributor-base Getting started 690 20 Jan 2017 Article D Ruth Bavousett How to write web apps in R with Shiny 2 /article/17/1/writing-new-web-apps-shiny Web development 218 20 Jan 2017 Article Jason Baker "Top 5: Shell scripting the Cinnamon Linux desktop environment and more" 0 /article/17/1/top-5-january-20 Top 5 214 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007 五、sort 如果我们先要找到包含信息最多的特定列,又该如何操作?假设我们需要了解哪篇文章包含最长的新文章列表,那么面对之前得出的1月20日文章列表,我们可以使用sort命令对列字数进行排序。在这种情况下,我们并不需要使用中间文件,而可以继续使用pipe。不过将长命令链拆分成较短的部分往往能够简化整个操作过程。 $ sort -nr -t$'/t' -k8 jan20only.tsv | head -n 1 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007 以上是一条长命令,我们尝试进行拆分。首先,我们使用sort命令对字数进行排序。-nr选项告知sort以数字排序,并将结果进行反向排序(由大到小)。此后的-t$'/t'则告知sort其中的分隔符为tab('/t')。其中的$要求此shell为一条需要处理的字符串,并将/n返回为tab。而-k8部分则告知sort命令使用第八列,即本示例中进行字数统计的目标列。 最后,输出结果被pipe至head,处理后在结果中显示此文件中包含最多字数的文章标题。 六、sed 大家可能还需要在文件中选择特定某行。这里可以使用sed。如果希望将全部包含标题的多个文件加以合并,并只为整体文件显示一组标题,即需要清除额外内容; 或者希望只提取特定行范围,同样可以使用sed。另外,sed还能够很好地完成批量查找与替换任务。 下面立足之前的文章列表创建一个不含标题的新文件,用于同其他文件合并(例如我们每月都会定期生成某个文件,现在需要将各个月份的内容进行合并)。 $ sed '1 d' jan2017articles.csv > jan17no_headers.csv 其中的“1 d”选项要求sed删除第一行。 七、cut 了解了如何删除行,那么我们该如何删除列?或者说如何只选定某一列?下面我们尝试为之前生成的列表创建一份新的作者清单。 $ cut -d',' -f3 jan17no_headers.csv > authors.txt 在这里,通过cut与-d相配合代表着我们需要第三列(-f3),并将结果发送至名为authors.txt的新文件。 八、uniq 作者清单已经完成,但我们要如何知悉其中包含多少位不同的作者?每位作者又各自编写了多少篇文章?这里使用unip。下面我们对文件进行sort排序,找到唯一值,而后计算每位作者的文章数量,并用结果替换原本内容。 sort authors.txt | uniq -c > authors.txt 现在已经可以看到每位作者的对应文章数,下面检查最后三行以确保结果正确。 $ tail -n3 authors-sorted.txt 1 Tracy Miranda 1 Veer Muchandi 3 VM (Vicky) Brasseur 九、awk 最后让我们了解最后一款工具,awk。awk是一款出色的替换性工具,当然其功能远不止如此。下面我们重新回归1月12日文章列表TSV文件,利用awk创建新列表以标明各篇文章的作者以及各作者编写的具体字数。 $ awk -F "/t" '{print $3 " " $NF}' jan20only.tsv Kushal Das 690 D Ruth Bavousett 218 Jason Baker 214 Tracy Miranda 1007 其中的-F "/t"用于告知awk目前处理的是由tab分隔的数据。在大括号内,我们为awk提供执行代码。$3代表要求其将输出第三行,而$NF则代表输出最后一行(即‘字段数’的缩写),并在两项结果间添加两个空格以进行明确划分。 虽然这里列举的例子规模较小,看似不必使用上述工具解决,但如果将范围扩大到包含93000行的文件,那么它显然很难利用电子表格程序进行处理。 利用这些简单的工具与小型脚本,大家可以避免使用数据库工具并轻松完成大量数据统计工作。无论您是专业人士还是业余爱好者,它的作用都不容忽视。
【17-03-18】 【分享】数据分析之九个给力的命令行工具 要对数据进行分析,大家会从哪里入手? 对于大多数熟悉了图形工作环境的朋友来说,电子表格工具无疑是第一选项。但命令行工具同样能够更快更高效地解决问题——且只须稍微学习即可上手。 大部分此类工具冻严格局限于Linux,而多数可同样运行在Unix甚至是Windows环境之下。在今天的文章中,我们将尝试几款简单的开源数据分析工具,并共同了解其如何运作。一、head与tail 首先,让我们先从文件处理开始。文件中有什么内容?其格式如何?大家可以使用cat命令在终端中显示文件,但其显然不适合处理内容较长的文件。 输入head与tail,二者能够完整显示文件中的指定行数内容。如果大家未指定行数,则默认显示其中10行。 $ tail -n 3 jan2017articles.csv 02 Jan 2017,Article,Scott Nesbitt,3 tips for effectively using wikis for documentation,1,/article/17/1/tips-using-wiki-documentation,"Documentation, Wiki",710 02 Jan 2017,Article,Jen Wike Huger,The Opensource.com preview for January,0,/article/17/1/editorial-preview-january,,358 02 Jan 2017,Poll,Jason Baker,What is your open source New Year's resolution?,1,/poll/17/1/what-your-open-source-new-years-resolution,,186 在最后三行中,我能够找到日期、作者姓名、标题以及其他一些信息。不过由于缺少列头,我不清楚各列的具体含义。下面查看各列的具体标题: $ head -n 1 jan2017articles.csv Post date,Content type,Author,Title,Comment count,Path,Tags,Word count 现在一切都非常明确,我们可以看到发布日期、内容类型、作者、标题、提交次数、相关URL、各文章标签以及字数。 二、wc 但如果需要分析数百甚至上千篇文章,又该如何处理?这里就要使用wc命令了——其为“字数”一词的缩写。wc能够对文件的字节、字符、单词或者行数进行计数。在本示例中,我们希望了解文章中的行数。 $ wc -l jan2017articles.csv 93 jan2017articles.csv 本文件共有93行,考虑到第一行中包含文件标题,因此可以推测此文件是一份包含92篇文章的列表。 三、grep 下面提出新的问题:其中有多少篇文章与安全话题有关?为了实现目标,我们假定需要的文章会在标题、标签或者其他位置提到安全这一字眼。这时,grep工具可用于通过特定字符搜索文件或者实现其他搜索模式。这是一款极为强大的工具,因为我们甚至能够利用正则表达式建立极为精确的匹配模式。不过这里,我们只需要寻找一条简单的字符串。 $ grep -i "security" jan2017articles.csv 30 Jan 2017,Article,Tiberius Hefflin,4 ways to improve your security online right now,3,/article/17/1/4-ways-improve-your-online-security,Security and encryption,1242 28 Jan 2017,Article,Subhashish Panigrahi,How communities in India support privacy and software freedom,0,/article/17/1/how-communities-india-support-privacy-software-freedom,Security and encryption,453 27 Jan 2017,Article,Alan Smithee,Data Privacy Day 2017: Solutions for everyday privacy,5,/article/17/1/every-day-privacy,"Big data, Security and encryption",1424 04 Jan 2017,Article,Daniel J Walsh,50 ways to avoid getting hacked in 2017,14,/article/17/1/yearbook-50-ways-avoid-getting-hacked,"Yearbook, 2016 Open Source Yearbook, Security and encryption, Containers, Docker, Linux",2143 我们使用的格式为grep加-i标记(告知grep不区分大小写),再加我们希望搜索的模式,最后是我们所搜索的目标文件的位置。最后我们找到了4篇安全相关文章。如果搜索的范围更加具体,我们可以使用pipe——它能够将grep同wc命令加以结合,用以了解其中有多少行提到了安全内容。 $ grep -i "security" jan2017articles.csv | wc -l 4 这样,wc会提取grep命令的输出结果并将其作为输入内容。很明显,这种结合再加上一点shell脚本,终端将立即变成一款强大的数据分析工具。 四、tr 在多数分析场景下,我们都会面对CSV文件——但我们该如何将其转换为其他格式以实现不同应用方式?这里,我们将其转化为HTML形式以通过表格进行数据使用。tr命令可帮助大家实现这一目标,它可将一类字符转化为另一类。同样的,大家也可以配合pipe命令实现输出/输入对接。 下面,我们试试另一个多部分示例,即创建一个TSV(即制表符分隔值)文件,其中只包含发表于1月20日的文章。 $ grep "20 Jan 2017" jan2017articles.csv | tr ',' '/t' > jan20only.tsv 首先,我们利用grep进行日期查询。我们将此结果pipe至tr命令,并利用后者将全部逗号替换为tab(表示为'/t')。但结果去哪了?这里我们使用〉字符将结果输出为新文件而非屏幕结果。如此一来,我们可以dqywjan20only.tsv文件中一定包含预期的数据。 $ cat jan20only.tsv 20 Jan 2017 Article Kushal Das 5 ways to expand your project's contributor base 2 /article/17/1/expand-project-contributor-base Getting started 690 20 Jan 2017 Article D Ruth Bavousett How to write web apps in R with Shiny 2 /article/17/1/writing-new-web-apps-shiny Web development 218 20 Jan 2017 Article Jason Baker "Top 5: Shell scripting the Cinnamon Linux desktop environment and more" 0 /article/17/1/top-5-january-20 Top 5 214 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007 五、sort 如果我们先要找到包含信息最多的特定列,又该如何操作?假设我们需要了解哪篇文章包含最长的新文章列表,那么面对之前得出的1月20日文章列表,我们可以使用sort命令对列字数进行排序。在这种情况下,我们并不需要使用中间文件,而可以继续使用pipe。不过将长命令链拆分成较短的部分往往能够简化整个操作过程。 $ sort -nr -t$'/t' -k8 jan20only.tsv | head -n 1 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007 以上是一条长命令,我们尝试进行拆分。首先,我们使用sort命令对字数进行排序。-nr选项告知sort以数字排序,并将结果进行反向排序(由大到小)。如有有什么不清楚的地方,欢迎访问linuxprobe.com此后的-t$'/t'则告知sort其中的分隔符为tab('/t')。其中的$要求此shell为一条需要处理的字符串,并将/n返回为tab。而-k8部分则告知sort命令使用第八列,即本示例中进行字数统计的目标列。 最后,输出结果被pipe至head,处理后在结果中显示此文件中包含最多字数的文章标题。 六、sed 大家可能还需要在文件中选择特定某行。这里可以使用sed。如果希望将全部包含标题的多个文件加以合并,并只为整体文件显示一组标题,即需要清除额外内容; 或者希望只提取特定行范围,同样可以使用sed。另外,sed还能够很好地完成批量查找与替换任务。 下面立足之前的文章列表创建一个不含标题的新文件,用于同其他文件合并(例如我们每月都会定期生成某个文件,现在需要将各个月份的内容进行合并)。 $ sed '1 d' jan2017articles.csv > jan17no_headers.csv 其中的“1 d”选项要求sed删除第一行。 七、cut 了解了如何删除行,那么我们该如何删除列?或者说如何只选定某一列?下面我们尝试为之前生成的列表创建一份新的作者清单。 $ cut -d',' -f3 jan17no_headers.csv > authors.txt 在这里,通过cut与-d相配合代表着我们需要第三列(-f3),并将结果发送至名为authors.txt的新文件。 八、uniq 作者清单已经完成,但我们要如何知悉其中包含多少位不同的作者?每位作者又各自编写了多少篇文章?这里使用unip。下面我们对文件进行sort排序,找到唯一值,而后计算每位作者的文章数量,并用结果替换原本内容。 sort authors.txt | uniq -c > authors.txt 现在已经可以看到每位作者的对应文章数,下面检查最后三行以确保结果正确。 $ tail -n3 authors-sorted.txt 1 Tracy Miranda 1 Veer Muchandi 3 VM (Vicky) Brasseur 九、awk 最后让我们了解最后一款工具,awk。awk是一款出色的替换性工具,当然其功能远不止如此。下面我们重新回归1月12日文章列表TSV文件,利用awk创建新列表以标明各篇文章的作者以及各作者编写的具体字数。 $ awk -F "/t" '{print $3 " " $NF}' jan20only.tsv Kushal Das 690 D Ruth Bavousett 218 Jason Baker 214 Tracy Miranda 1007 其中的-F "/t"用于告知awk目前处理的是由tab分隔的数据。在大括号内,我们为awk提供执行代码。$3代表要求其将输出第三行,而$NF则代表输出最后一行(即‘字段数’的缩写),并在两项结果间添加两个空格以进行明确划分。 虽然这里列举的例子规模较小,看似不必使用上述工具解决,但如果将范围扩大到包含93000行的文件,那么它显然很难利用电子表格程序进行处理。 利用这些简单的工具与小型脚本,大家可以避免使用数据库工具并轻松完成大量数据统计工作。无论您是专业人士还是业余爱好者,它的作用都不容忽视。
OpenStack 的 metadata 服务机制 Metadata 的概念 在创建虚拟机的时候,用户往往需要对虚拟机进行一些配置,比如:开启一些服务、安装某些包、添加 SSH 秘钥、配置 hostname 等等。在 OpenStack 中,这些配置信息被分成两类:metadata 和 user data。Metadata 主要包括虚拟机自身的一些常用属性,如 hostname、网络配置信息、SSH 登陆秘钥等,主要的形式为键值对。而 user data 主要包括一些命令、脚本等。User data 通过文件传递,并支持多种文件格式,包括 gzip 压缩文件、shell 脚本、cloud-init 配置文件等。虽然 metadata 和 user data 并不相同,但是 OpenStack 向虚拟机提供这两种信息的机制是一致的,只是虚拟机在获取到信息后,对两者的处理方式不同罢了。所以下文统一用 matadata 来描述。 本文详细阐述了 OpenStack 中 metadata 的服务机制,通过深入了解 metadata 的服务机制,用户可以在适当的应用场景中选择正确的 metadata 配置方式,从而对虚拟机进行配置。此外,了解 metadata 服务机制能够为用户在 OpenStack 的部署、排错、维护提供帮助,提高工作效率。 Metadata 的获取机制 在 OpenStack 中,虚拟机获取 Metadata 信息的方式有两种:Config drive 和 metadata RESTful 服务。下面我们分别对这两种机制进行介绍与分析 Config drive Config drive 机制是指 OpenStack 将 metadata 信息写入虚拟机的一个特殊的配置设备中,然后在虚拟机启动时,自动挂载并读取 metadata 信息,从而达到获取 metadata 的目的。在客户端操作系统中,存储 metadata 的设备需要是 ISO9660 或者 VFAT 文件系统。具体的实现会根据 Hypervisor 的不同和配置有所差异,以 libvirt 为例:OpenStack 会将 metadata 写入 libvirt 的虚拟磁盘文件中,并指示 libvirt 将其虚拟为 cdrom 设备,如图 1 和图 2 所示。另一方面,虚拟机在启动时,客户操作系统中的 cloud-init 会去挂载并读取该设备,然后根据所读取出的内容对虚拟机进行配置。图 1.虚拟机定义的 xml 文件图 2.存储 metadata 的虚拟磁盘文件 当然,要实现上述功能,需要宿主机和虚拟机镜像两者协同完成,它们需要各自满足一些条件: 宿主机(OpenStack 的计算节点) 支持 config drive 机制的 Hypervisors 有:libvirt、hyper-v 和 VMware。当使用 libvirt 和 VMware 作为 Hypervisor 时,需要确保宿主机上安装有 genisoimage 程序,并且设置 mkisofs_cmd 标志为 genisoimage 的位置。当使用 hyper-v 作为 Hypervisor 时,需要设置 mkisofs_cmd 标志为 mkisofs.exe 的全路径,此外还需要在 hyper-v 的配置文件中设置 qume_img_cmd 为 qemu-img 命令的路径。 虚拟机镜像 虚拟机镜像需要确保安装了 cloud-init。如果没有安装 cloud-init,需要自行编写脚本,实现在虚拟机启动期间挂载配置磁盘、读取数据、解析数据并且根据数据内容执行相应动作。 OpenStack 提供了命令行参数--config-drive 用于配置是否在创建虚拟机时使用 config drive 机制。比如: 清单 1 #nova boot --config-drive=true --image image-name --key-name mykey --flavor 1 --user-data ./my-user-data.txt myinstance --file /etc/network/interfaces=/home/myuser/instance-interfaces 或者也可以如清单 2 所示,在/etc/nova/nova.conf 中配置,使得 OpenStack 计算服务在创建虚拟机时默认使用 config drive 机制。 清单 2 force_config_drive=true 用户可以在虚拟机中查看写入的 metadata 信息,如果客户操作系统支持通过标签访问磁盘的话,可以使用如下命令查看: 清单 3 #mkdir -p /mnt/config#mount /dev/disk/by-label/config-2 /mnt/configMetadata RESTful 服务 OpenStack 提供了 RESTful 接口,虚拟机可以通过 REST API 来获取 metadata 信息。提供该服务的组件为:nova-api-metadata。当然,要完成从虚拟机至网络节点的请求发送和相应,只有 nova-api-metadata 服务是不够的,此外共同完成这项任务的服务还有:Neutron-metadata-agent 和 Neutron-ns-metadata-proxy。下面我们将剖析它们是如何协同工作为虚拟机提供 metadata 服务的。 Nova-api-metadata nova-api-metadata 启动了 RESTful 服务,负责处理虚拟机发送来的 REST API 请求。从请求的 HTTP 头部中取出相应的信息,获得虚拟机的 ID,继而从数据库中读取虚拟机的 metadata 信息,最后将结果返回。 Neutron-metadata-agent Neutron-metadata-agent 运行在网络节点,负责将接收到的获取 metadata 的请求转发给 nova-api-metadata。Neutron-metadata-agent 会获取虚拟机和租户的 ID,添加到请求的 HTTP 头部中。nova-api-metadata 会根据这些信息获取 metadata。 Neutron-ns-metadata-proxy Neutron-ns-metadata-proxy 也运行在网络节点。为了解决网络节点的网段和租户的虚拟网段重复的问题,OpenStack 引入了网络命名空间。Neutron 中的路由和 DHCP 服务器都在各自独立的命名空间中。由于虚拟机获取 metadata 的请求都是以路由和 DHCP 服务器作为网络出口,所以需要通过 neutron-ns-metadata-proxy 联通不同的网络命名空间,将请求在网络命名空间之间转发。Neutron-ns-metadata-proxy 利用在 unix domain socket 之上的 HTTP 技术,实现了不同网络命名空间之间的 HTTP 请求转发。并在请求头中添加’X-Neutron-Router-ID’和’X-Neutron-Network-ID’信息,以便 Neutron-metadata-agent 来辨别发送请求的虚拟机,获取虚拟机的 ID。图 3.Metadata 请求发送流程 如图 3 所示,虚拟机获取 metadata 的大致流程为:首先请求被发送至 neutron-ns-metadata-proxy,此时会在请求中添加 router-id 和 network-id,然后请求通过 unix domian socket 被转发给 neutron-metadata-agent,根据请求中的 router-id、network-id 和 IP,获取 port 信息,从而拿到 instance-id 和 tenant-id 加入请求中,最后请求被转发给 nova-api-metadata,其利用 instance-id 和 tenant-id 获取虚拟机的 metadata,返回相应。 上面我们分析了各个服务之间转发请求的流程,那么现在只存在一个问题,整个获取 metadata 的路线就通畅了:虚拟机如何将请求发送至 neutron-ns-metadata-proxy? 我们首先来分析虚拟机发送的请求。由于 metadata 最早是由亚马逊提出的,当时规定 metadata 服务的地址为 169.254.169.254:80,OpenStack 沿用了这一规定。所以虚拟机会向 169.254.169.254:80 发送 medtadata 请求。那么这一请求是如何从虚拟机中发送出来的呢?目前 Neutron 有两种方式来解决这个问题:通过 router 发送请求和通过 DHCP 发送请求。 通过 router 发送请求 如果虚拟机所在 subnet 连接在了 router 上,那么发向 169.254.169.254 的报文会被发至 router。如图 4 所示,Neutron 通过在 router 所在网络命名空间添加 iptables 规则,将该报文转发至 9697 端口,而 neutron-ns-metadata-proxy 监听着该端口,所以报文被 neutron-ns-metadata-proxy 获取,进入上述后续处理和转发流程。图 4.router 所在网络命名空间的 iptables 规则图 5.监听在 9697 端口上的 Neutron-ns-metadata-proxy 服务 通过 DHCP 发送请求 如果虚拟机所在 subnet 没有连接在任何 router 上,那么请求则无法通过 router 转发。此时 Neutron 通过 DHCP 服务器来转发 metadata 请求。DHCP 服务通过 DHCP 协议的选项 121 来为虚拟机设置静态路由。本文节选自《linux就该这么学》如图 6 所示,图中 10.0.0.3 为 DHCP 服务器的 IP 地址。通过查看虚拟机的静态路由表,我们可以发现发送至 169.254.169.254 的报文被发送到了 10.0.0.3,即 DHCP 服务器。图 6.虚拟机中的静态路由表 另外再查看 DHCP 服务器的 IP 配置信息,发现 DHCP 服务器配置了两个 IP,其中一个就是 169.254.169.254。与 router 类似的,Neutron 在 DHCP 网络命名空间中启动了监听 80 端口的 neutron-ns-metadata-proxy 服务,从而进入处理和转发请求的流程。图 7.DHCP 服务器的 IP 配置 总结 Metadata 服务为用户自定义配置虚拟机提供了有效的解决方案。本文剖析了 OpenStack 提供 metadata 服务的两种机制:config drive 和 RESTful 服务。Config drive 机制主要用于配置虚拟机的网络信息,包括 IP、子网掩码、网关等。当虚拟机无法通过 DHCP 正确获取网络信息时,config drive 是获取 metadata 信息的必要方式。如果虚拟机能够自动正确配置网络,那么可以通过 RESTful 服务的方式获取 metadata 信息。
【17-03-17】 【分享】CentOS系统启动流程 当我们按下开机键后,系统背后的秘密我们是否了解呢?这里,我带大家探索一下linux系统开机背后的秘密。加电自检 主板在接通电源后,系统首先由POST程序来对内部各个设备进行检查,自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。 BIOS启动引导阶段 自检通过之后,按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备。一般电脑是按"F2"或"Del"键等等进入BIOS,在里面我们可以调整硬盘的启动顺序。找到第一个有引导程序的设备后,BIOS会找到设备中的MBR,读取其中的Bootloader。 GRUP引导阶段 这时候就可以看到我们的Centos系统了,但是一般都不需要操作,会自动启动系统。其实我们也可以自己手动启动系统的。 手动在grub命令行接口启动系统:grub> root (hd#,#)grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICEgrub> initrd /initramfs-VERSION-RELEASE.imggrub> bootgrub的命令行接口:e: 编辑模式,用于编辑菜单;c: 命令模式,交互式接口;help: 获取帮助列表;help KEYWORD: 详细帮助信息;find (hd#,#)/PATH/TO/SOMEFILE:root (hd#,#) 设定grup的根设备;kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用cmdline参数;例如:init=/path/to/init, selinux=0;initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;boot: 引导启动选定的内核;配置文件参数详解:/boot/grub/grub.confdefault=#: 设定默认启动的菜单项;落单项(title)编号从0开始;timeout=#:指定菜单项等待选项选择的时长;splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;hiddenmenu:隐藏菜单;password [--md5] STRING: 菜单编辑认证;title TITLE:定义菜单项“标题”, 可出现多次;用来引导多个内核或者操作系统;root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核;initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;password [--md5] STRING: 启动选定的内核或操作系统时进行认证。加载内核阶段内核会自身初始化:探测可识别到的所有硬件设备;加载硬件驱动程序;(有可能会借助于ramdisk加载驱动);以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init。init初始化阶段 内核加载完毕,会运行init程序,init进程起来后,系统启动的控制权移交给init进程;/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作: 1.执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;2.确定启动后进入的运行级别;3.执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件;4.有关key sequence的设置;5.有关UPS的脚本定义;6.启动虚拟终端/sbin/mingetty ;7.在运行级别5上运行X。 配置文件:/etc/inittab;每行定义一种action以及与之对应的process id:runlevels:action:process;id:一个任务的标识符;runlevels:在哪些级别启动此任务;#,###,可以为空,表示所有级别;action:在什么条件下启动此任务;process:任务;(脚本或程序); 如果有什么不清楚的地方,欢迎访问linuxprobe.com的页面。action:wait:等待切换至此任务所在的级别时执行一次;respawn:一旦此任务终止,就自动重新启动之;initdefault:设定默认运行级别;此时,process省略;sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动; chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态; 查看:chkconfig --list [name]添加:chkconfig --add name删除:chkconfig --del name 修改指定的链接类型: chkconfig [--level LEVELS] name <on|off|reset>--level LEVELS:指定要控制的级别;默认为2345。 init命令: 级别切换:init #;级别查看:who -r。 注:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
【17-03-06】 【求助】sudo的10个小技巧 sudo允许用户以root用户身份(或另一个用户)执行安全策略指定的命令:它读取并解析/etc sudoers,查找调用的用户及其权限,然后提示调用用户输入密码(通常是用户的密码,但也可以是目标用户的密码,也可以使用NOPASSWD取消密码验证),之后,sudo创建一个子进程,在其中调用setuid()切换到目标用户next,它执行一个shell或在上面的子进程中作为参数给出的命令。 以下是十个/etc/sudoers文件配置,以使用Defaults条目修改sudo命令的行为。 sudo cat /etc/sudoers | less1.设置安全路径 这是用于每个使用sudo运行的命令的路径,它有两个重要性: 在系统管理员不信任sudo用户具有安全的PATH环境变量时使用 要分离“根路径”和“用户路径”,只有由exempt_group定义的用户不受此设置的影响。 要设置它,请添加行: Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"2.在TTY用户登录会话上启用sudo 要启用从真实tty调用sudo,而不是通过cron或cgi-bin脚本等方法调用,请添加以下行: Defaults requiretty3.运行Sudo命令使用pty 有些时候,攻击者可以使用sudo运行恶意程序(例如病毒或恶意软件),这将再次分叉保留在用户的终端设备上的后台进程,即使在主程序已经完成执行时。 为了避免这种情况,您可以将sudo配置为仅使用use_pty参数从psuedo-pty运行其他命令,无论I /O日志是否已打开,如下所示: Defaults use_pty14.创建Sudo日志文件 默认情况下,sudo日志通过syslog(3)。但是,要指定自定义日志文件,请使用logfile参数,如: Defaults logfile="/var/log/sudo.log" 要在自定义日志文件中记录主机名和四位数年份,请分别使用log_host和log_year参数,如下所示: Defaults log_host, log_year, logfile="/var/log/sudo.log"5.记录Sudo命令输入/输出 log_input和log_output参数允许sudo在伪tty中运行命令,并记录所有用户输入和所有输出发送到屏幕。 默认I / O日志目录为/var/log/sudo-io,如果有会话序列号,则存储在此目录中。您可以通过iolog_dir参数指定自定义目录。 Defaults log_input, log_output1 支持一些转义序列,例如%{seq},其扩展为单调递增的基础36序列号,例如000001,其中每两个数字用于形成新的目录,例如。00/00/01,如下例所示: [root@linuxprobe ~]# cd /var/log/sudo-io/[root@linuxprobe sudo-io]# lltotal 8drwx------ 3 root root 4096 Jan 12 18:58 00-rw------- 1 root root 7 Jan 12 19:08 seq[root@linuxprobe sudo-io]# cd 00/00/06/[root@linuxprobe 06]# lslog stderr stdin stdout timing ttyin ttyout[root@linuxprobe 06]# cat log1484219333:root:root::/dev/pts/0/root/bin/bash6.讲解Sudo用户 要讲授sudo用户关于系统上的密码使用,请使用如下所示的lecture参数。 它有3个可能的值: always - 总是讲一个用户。 once - 只在用户第一次执行sudo命令时使用(当没有指定值时使用) never - 从不讲授用户。 Defaults lecture="always" 此外,您可以使用lecture_file参数设置自定义讲义文件,在文件中键入相应的消息: Defaults lecture_file="/path/to/file"7.输入错误的sudo密码时显示自定义消息 当用户输入错误的密码时,命令行上将显示特定的消息。默认消息是“sorry,try again”,您可以使用badpass_message参数修改消息,如下所示: Defaults badpass_message="Password is wrong, please try again,thank you!" 8.增加sudo密码尝试限制 参数passwd_tries用于指定用户尝试输入密码的次数。如果有什么不明白的地方,请移步《linux就该么学》 默认值为3: Defaults passwd_tries=59.让Sudo输入错误的密码时输入提示Defaults insults10.了解更多Sudo配置
备份 Linux 系统神器:rsync 所有公司,无论大小,都运营在数据之上。考虑到丢失业务数据造成的经济和业务损失,从最小的个人公司到最大的跨国企业,没有一个公司能在丢失大部分数据以后得以幸存。你的办公室可以通过保险赔偿重建,但是你的数据就不可能再恢复了。 这里提到的丢失是指数据的完全损坏。而不是指数据被偷走,那是另一种灾难。我这里说的是数据被完全摧毁。 即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我有二十年来的个人财务数据和我现在已经关闭的企业的数据,以及大量的电子发票。也包括近年来我创作的大量不同类型的文档、报告和数据报表。我不想失去任何这些数据。 所以备份是我数据长期安全的必要保障。 备份软件选择 有许多软件可以执行备份。大多数 Linux 发行版提供至少一种开源的备份软件。同时也有许多商业备份软件,但是这些都不符合我的需求,所以我决定使用基础的 Linux 工具来进行备份。 在我为 Open Source Yearbook 写的文章, 《最佳搭档之 2015:tar 和 ssh》 中,我说明了昂贵的商业备份软件在设计实施可行的备份计划中并不是必要的。 从去年开始我尝试了另一种选择, rsync 命令,如果有什么不清楚的,欢迎搜索《linux就该这么学》它有许多我已经从中受益的有趣特性。我的主要需求是所创建的备份,用户不需要解压备份压缩包就能定位和恢复文件,以便节约创建备份的时间。 这篇文章的目的只是为了说明 rsync 在我的备份方案中的作用。并不是 rsync 的全部能力或者它的各种适用场景的概览。 rsync 命令 Andrew Tridgell 和 Paul Mackerras 编写了 rsync ,首次发布于 1996 年。它的目标是向另一台电脑同步文件。你注意到了他们为什么取这个名字了吗(remotely synchronize)?它是大多数发行版都提供的开源软件。 rsync 能够用于同步两个目录或目录树,无论它们是在同一个计算机上还是不同的计算机上,而且不仅如此,它还能做到更多。它创建或者更新的目录与源目录完全一样。新的目录不是以 tar 或 zip 等打包存储,而是普通的目录和文件,常见的 Linux 工具都能轻松访问,而这正是我所需要的。 rsync 的最重要的特性之一是它处理源目录被修改的已有文件的方式。它使用分块校验来比较源文件和目标文件,而不是从源把整个文件复制过去。如果两个文件所有块的校验和都相同,那么就不用传输数据。否则只有被改变的块被传输。这样节约了远程同步消耗的大量时间和带宽。比如,我第一次使用 rsync 脚本来把我所有的主机备份到一个外接的大型 usb 硬盘上需要三个小时,因为所有的数据都需要传输过去。而接下来的备份需要的时间就只是 3 到 8 分钟,这取决于上次备份以来创建和改变了多少文件。我使用 time命令来记录实际花费的时间。昨天晚上,我只花了三分钟来从六个远程系统和本地工作站备份大概 750 Gb 数据。实际上只有在白天改变的几百 Mb 数据需要备份。 下面的命令可以用来同步两个目录及其任意子目录的内容。也就是说,在新目录的内容和源目录同步完之后,它们的内容完全一样。 rsync -aH sourcedir targetdir -a 选项表示归档模式,它会保持权限、所有关系和符号(软)链接。-H 选项用来保持硬链接。注意源目录和目标目录都可以在远程主机上。 假设昨天我们使用 rsync 同步了两个目录。今天我们想再同步一次,但是我们从源目录删除了一些文件。rsync 默认只复制新的和改变过的文件到新目录里,而不去改变新目录里被我们删除的文件,但是如果你想让那些在源目录里被删除的文件在新目录里也被删除,那么你可以加上 --delete 选项来删除。 另一个有趣的选项,也是我个人最喜欢的选项是 --link-dest,因为它极大地增加了 rsync 的能力和灵活性。--link-dest 使每日备份只花费很少的额外空间和很短的时间。 用这个选项指定前一天的备份目录,以及今天的备份目录,然后 rsync 会创建今天的新备份目录,并将昨天备份目录里的每一个文件在今天的备份目录中创建硬链接。现在我们在今天的备份目录中有一大堆指向昨天备份的硬链接。文件没有被重复创建,而是创建了一些硬链接。对于硬链接,在 Wikipedia 中有非常详细的描述。而在用昨天的备份目录文件的硬链接创建了今天的备份之后,rsync 和平常一样进行备份,如果在文件中检测到了变化,就不会做硬链接,而是从昨天的备份目录里做一个文件的复制,再把源文件中变化的部分复制过去。(LCTT 译注:此处疑似原文表述不清,参见 generator.c 的 try_dests_reg 函数先根据 match_level 选择复制或者硬链接,而不是创建硬链接后再判断 match_level) 现在我们的命令类似于下面这样。 rsync -aH --delete --link-dest=yesterdaystargetdir sourcedir todaystargetdir 你也可能想要排除一些不想要备份的目录或者文件。那么就可以使用 --exclude 选项。用这个选项加上你想排除文件或目录的模式。你可以用下面的新命令来排除浏览器的缓存。 rsync -aH --delete --exclude Cache --link-dest=yesterdaystargetdir sourcedir todaystargetdir 注意:你想排除的每一个文件的模式前面都分别需要加上 --exclude 选项。 rsync 可以同步远程主机,无论是作为同步源头还是目标。再举一个例子,我们假设想要把名为 remote1 的远程主机的目录同步到本地。因为 ssh 作为与远程主机交换数据的默认协议,我一直使用 ssh 选项。现在命令类似于下面这样。 rsync -aH -e ssh --delete --exclude Cache --link-dest=yesterdaystargetdir remote1:sourcedir todaystargetdir 这就是我的 rsync 备份命令的最终版本。 你可以依靠 rsync 的大量选项来定制你的同步过程。大多数情况而言,我刚刚描述的简单命令就足以胜任我的个人需要。你可以阅读 rsync 丰富的文档来了解它的其他能力。 部署备份 我的备份自动运行因为—“万物皆可自动化”。我写了一个 BASH 脚本使用 rsync 创建每天的备份。包括确保备份介质被挂载,生成每天的备份目录的名字,以及在备份介质中创建合适的目录结构,最后执行真正的备份再卸载备份介质。 我用 cron 每天早晨执行脚本确保我永远不会忘记备份。 我的脚本 rsbu 和配置文件 rsbu.conf 可以在http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fgithub.com%2Fopensourceway%2Frsync-backup-script+&urlrefer=ff6c48d5e8426eceeeae8c0653f64259上获取。 恢复测试 所有没有经过测试的备份计划都不完整的。你可以通过测试恢复某个文件或者整个目录,以确保备份在照常工作并且可以通过它来在数据全部丢失后恢复。我见过太多备份由于种种理由失败,以及由于缺乏测试忽略的问题导致宝贵的数据被丢失。 选择一个文件恢复到比如 /tmp 的测试目录,这样你就不会覆盖任何备份后被更新的文件。验证文件的内容是否是你预期的。恢复用 rsync 备份的文件仅仅只是找到你的备份文件然后把它复制到你想恢复的地方去那样简单。 我有几次不得不恢复我的个人文件,偶尔是整个目录。大多数是自己意外删除了文件或者目录。有几次是因为硬盘崩溃。这些备份迟早会派上用场。 最后一步 但仅仅创建备份并不能拯救你的业务,你需要定期的地创建备份,使最近的一次备份储存在另一台远程机器上,如果有可能,放在另外一个建筑物中或几英里之外。这样可以确保大规模的灾难不会摧毁你的所有备份。 对于小型企业的一个合理选择是在可移动介质上做每日备份,晚上把最新的备份带回家里,第二天早上把更早的备份带到办公室。你就会有几个轮流的拷贝。甚至可以把最新的备份带到银行并放到你的保管箱里,然后带回之前的备份。
linux入门必学文件处理命令 Linux系统信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其它一些管理信息,如文件的用户、文件的大小等。文件可以是一封信、一个通讯录,或者是程序的源语句、程序的数据,甚至可以包括可执行的程序和其它非正文内容。Linux文件系统具有良好的结构,系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。file1.作用file通过探测文件内容判断文件类型,使用权限是所有用户。2.格式file [options] 文件名3.[options]主要参数 -v:在标准输出后显示版本信息,并且退出。 -z:探测压缩过的文件类型。 -L:允许符合连接。 4.简单说明使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件,还是Shell Script文件,或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。5.应用实例 如果我们看到一个没有后缀的文件grap,可以使用下面命令: $file grapgrap:English text 此时系统显示这是一个英文文本文件。需要说明的是,file命令不能探测包括图形、音频、视频等多媒体文件类型。 mkdir1.作用mkdir命令的作用是建立名称为dirname的子目录,与MS DOS下的md命令类似,它的使用权限是所有用户2.格式mkdir [options] 目录名3.[options]主要参数 -m,--mode=模式:设定权限<模式>;,与chmod类似。 -p,--parents:需要时创建上层目录;如果目录早已存在,则不当作错误。 -v,--verbose:每次创建新目录都显示信息。 --version:显示版本信息后离开。 4.应用实例 在进行目录创建时可以设置目录的权限,此时使用的参数是“-m”。假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么可以使用以下命令: $mkdir -m 777 tskgrep1.作用grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。2.格式grep [options]3.[options]主要参数 -c:只输出匹配行的计数。 -I:不区分大小写(只适用于单字符)。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -n:显示匹配行及行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 pattern正则表达式主要参数: \:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $:匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始。 \>;:到匹配正则表达式的行结束。 []:单个字符,如[A]即A符合要求 。 [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 *:有字符,长度可以为0。 正则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一类字符串的模式(Pattern)。如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS中用户可以使用通配符“*”代表任意字符类似。如果有什么不清楚的地方,欢迎百度搜索《linux就该这么学》在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能。 4.应用实例 查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了第二部分中的其余部分,只知到有两个句点,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]\{3 \}\.[0-0\{3\}\。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。 $grep '[0-9 ]\{3 \}\.[0-0\{3\}\' ipfile 补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。 dd1.作用dd命令用来复制文件,并根据参数将数据转换和格式化。2.格式dd [options]3.[options]主要参数 bs=字节:强迫ibs=<字节>;及obs=<字节>;。 cbs=字节:每次转换指定的<字节>;。 conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件。 count=块数目:只复制指定<块数目>;的输入数据。 ibs=字节:每次读取指定的<字节>;。 if=文件:读取<文件>;内容,而非标准输入的数据。 obs=字节:每次写入指定的<字节>;。 of=文件:将数据写入<文件>;,而不在标准输出显示。 seek=块数目:先略过以obs为单位的指定<块数目>;的输出数据。 skip=块数目:先略过以ibs为单位的指定<块数目>;的输入数据。 4.应用实例 dd命令常常用来制作Linux启动盘。先找一个可引导内核,令它的根设备指向正确的根分区,然后使用dd命令将其写入软盘: $rdev vmlinuz /dev/hda$dd if=vmlinuz of=/dev/fd0 上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。 find1.作用find命令的作用是在目录中搜索文件,它的使用权限是所有用户。2.格式find [path][options][expression] path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。 3.[options]主要参数 -depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。 -maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负数,如果level是0的话表示仅在当前目录中查找。 -mindepth levels:表示至少查找到开始目录的第level层子目录。 -mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件中查找。 -version:打印版本。 [expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。它的参数非常多,这里只介绍一些常用的参数。 -name:支持统配符*和?。 -atime n:搜索在过去n天读取过的文件。 -ctime n:搜索在过去n天修改过的文件。 -group grpoupname:搜索所有组为grpoupname的文件。 -user用户名:搜索所有文件属主为用户名(ID或名称)的文件。 -size n:搜索文件大小是n个block的文件。 -print:输出搜索结果,并且打印。 4.应用实例 find命令查找文件的几种方法: (1)根据文件名查找 例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令: find / -name lilo.conf find命令后的“/”表示搜索整个硬盘。 (2)快速查找文件 根据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录中时。如果我们知道了这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件,从它的文件后缀“.conf”可以判断这是一个配置文件,那么它应该在/etc目录内,此时可以使用下面命令: find /etc -name smb.conf 这样,使用“快速查找文件”方式可以缩短时间。 (3)根据部分文件名查找方法 有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件可以输入下面命令: find / -name '*abvd*' 输入这个命令以后,Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。 (4)使用混合查找方式查找文件 find命令可以使用混合查找的方法,例如,我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。 find /etc -size +500000c -and -mtime +1mv1.作用mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。该命令如同DOS命令中的ren和move的组合。2.格式mv [options] 源文件或目录 目标文件或目录3.[options]主要参数 -i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。 -f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。 4.应用实例 (1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中: $mv /usr/cbu/ * . (2)将文件cjh.txt重命名为wjz.txt: $mv cjh.txt wjz.txt
【17-02-27】 【分享】Redhat7对于ifconfig命令问题的解决方法 这是我们首先会想到是不是环境变量里没有ifconfig命令的路径,因为ifconfig是在/sbin路径下的,以root用户登录才可以运行,可是我们上边是以root用户登录的啊,不急,我们来看看root用户的环境变量可以看到,我们的环境变量里有/sbin这个路径,也就是说如果ifconfig命令存在并且就是位于/sbin目录下的话我们肯定就是可以运行的,那么我们就看看/sbin目录下有没有ifconfig命令吧结果表明我们的/sbin目录下并没有ifconfig命令,所以我们的结论是:我们的Redhat7里边是没有安装ifconfig 我们的解决办法是:yum安装ifconfig这个命令包 当然这不是在重点,如果有什么不清楚的地方,欢迎百度搜索《linux就该这么学》重点是通过yum search,这个命令我们发现ifconfig这个命令是在net-tools.x86_64这个包里,接下来我们安装这个包就行了。这是我们已经安装好ifconfig这个命令了,我们试一下。 操作命令:rpm -ivh net-tools-2.0-0.17.20131004git.el7.x86_64.rpm或者:yum install net-tools 即可。
MySQL 中你应该使用什么数据类型表示时间? 在这篇文章中,我将解释 MySQL 原生的方案,并给出一个最常用数据类型的对比表。我们也将对一些典型的查询做基准测试,然后得出在给定场景下应该使用什么数据类型的结论。 如果你想直接看结论,请翻到文章最下方。 原生的 MySQL Datetime 数据类型 Datetime 数据表示一个时间点。这可以用作日志记录、物联网时间戳、日历事件数据,等等。MySQL 有两种原生的类型可以将这种信息保存在单个字段中:Datetime 和 Timestamp。MySQL 文档中是这么介绍这些数据类型的: DATETIME 类型用于保存同时包含日期和时间两部分的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 形式接收和显示 DATETIME 类型的值。 TIMESTAMP 类型用于保存同时包含日期和时间两部分的值。 DATETIME 或 TIMESTAMP 类型的值可以在尾部包含一个毫秒部分,精确度最高到微秒(6 位数)。 TIMESTAMP 和 DATETIME 数据类型提供自动初始化和更新到当前的日期和时间的功能,只需在列的定义中设置 DEFAULT CURRENTTIMESTAMP 和 ON UPDATE CURRENTTIMESTAMP。 作为一个例子: CREATE TABLE `datetime_example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `measured_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `measured_on` (`measured_on`)) ENGINE=InnoDB;CREATE TABLE `timestamp_example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `measured_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `measured_on` (`measured_on`)) ENGINE=InnoDB; 除了原生的日期时间表示方法,还有另一种常用的存储日期和时间信息的方法。即使用 INT 字段保存 Unix 时间(从1970 年 1 月 1 日协调世界时(UTC)建立所经过的秒数)。如果有不清楚的地方欢迎百度搜索《linux就该这么学》 MySQL 也提供了只保存时间信息中的一部分的方式,通过使用 Date、Year 或 Time 类型。由于这篇文章是关于保存准确时间点的最佳方式的,我们没有讨论这些不那么精确的局部类型。 使用 INT 类型保存 Unix 时间 使用一个简单的 INT 列保存 Unix 时间是最普通的方法。使用 INT,你可以确保你要保存的数字可以快速、可靠地插入到表中,就像这样: INSERT INTO `vertabelo`.`sampletable`( `id`, `measured_on` ### INT 类型的列)VALUES( 1, 946684801 ### 至 01/01/2000 @ 12:00am (UTC) 的 UNIX 时间戳 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Funixtimestamp.com&urlrefer=782a72a074e77fb6f70e91f79bea19d9); 这就是关于它的所有内容了。它仅仅是个简单的 INT 列,MySQL 的处理方式是这样的:在内部使用 4 个字节保存那些数据。所以如果你在这个列上使用 SELECT 你将会得到一个数字。如果你想把这个列用作日期进行比较,下面的查询并不能正确工作: SELECT id, measured_on, FROM_UNIXTIME(measured_on)FROM vertabelo.inttimestampmeasuresWHERE measured_on > '2016-01-01' ### measured_on 会被作为字符串比较以进行查询LIMIT 5; 这是因为 MySQL 把 INT 视为数字,而非日期。为了进行日期比较,你必须要么获取( LCTT 译注:从 1970-01-01 00:00:00)到 2016-01-01 经过的秒数,要么使用 MySQL 的 FROM_UNIXTIME() 函数把 INT 列转为 Date 类型。下面的查询展示了 FROM_UNIXTIME() 函数的用法: SELECT id, measured_on, FROM_UNIXTIME(measured_on)FROM vertabelo.inttimestampmeasuresWHERE FROM_UNIXTIME(measured_on) > '2016-01-01'LIMIT 5; 这会正确地获取到日期在 2016-01-01 之后的记录。你也可以直接比较数字和 2016-01-01 的 Unix 时间戳表示形式,即 1451606400。这样做意味着不用使用任何特殊的函数,因为你是在直接比较数字。查询如下: SELECT id, measured_on, FROM_UNIXTIME(measured_on)FROM vertabelo.inttimestampmeasuresWHERE measured_on > 1451606400LIMIT 5; 假如这种方式不够高效甚至提前做这种转换是不可行的话,那该怎么办?例如,你想获取 2016 年所有星期三的记录。要做到这样而不使用任何 MySQL 日期函数,你就不得不查出 2016 年每个星期三的开始和结束时间的 Unix 时间戳。然后你不得不写很大的查询,至少要在 WHERE 中包含 104 个比较。(2016 年有 52 个星期三,你不得不考虑一天的开始(0:00 am)和结束(11:59:59 pm)...) 结果是你很可能最终会使用 FROM_UNIXTIME() 转换函数。既然如此,为什么不试下真正的日期类型呢? 使用 Datetime 和 Timestamp Datetime 和 Timestamp 几乎以同样的方式工作。两种都保存日期和时间信息,毫秒部分最高精确度都是 6 位数。同时,使用人类可读的日期形式如 "2016-01-01" (为了便于比较)都能工作。查询时两种类型都支持“宽松格式”。宽松的语法允许任何标点符号作为分隔符。例如,"YYYY-MM-DD HH:MM:SS" 和 "YY-MM-DD HH:MM:SS" 两种形式都可以。在宽松格式情况下以下任何一种形式都能工作: 2012-12-31 11:30:452012^12^31 11+30+452012/12/31 11*30*452012@12@31 11^30^45 其它宽松格式也是允许的;你可以在 MySQL 参考手册 找到所有的格式。 默认情况下,Datetime 和 Timestamp 两种类型查询结果都以标准输出格式显示 —— 年-月-日 时:分:秒 (如 2016-01-01 23:59:59)。如果使用了毫秒部分,它们应该以小数值出现在秒后面 (如 2016-01-01 23:59:59.5)。 Timestamp 和 Datetime 的核心不同点主要在于 MySQL 在内部如何表示这些信息:两种都以二进制而非字符串形式存储,但在表示日期/时间部分时 Timestamp (4 字节) 比 Datetime (5 字节) 少使用 1 字节。当保存毫秒部分时两种都使用额外的空间 (1-3 字节)。如果你存储 150 万条记录,这种 1 字节的差异是微不足道的: 150 万条记录 * 每条记录 1 字节 / (1048576 字节/MB) = 1.43 MB Timestamp 节省的 1 字节是有代价的:你只能存储从 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 之间的时间。而 Datetime 允许你存储从 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999' 之间的任何时间。 另一个重要的差别 —— 很多 MySQL 开发者没意识到的 —— 是 MySQL 使用服务器的时区转换 Timestamp 值到它的 UTC 等价值再保存。当获取值是它会再次进行时区转换,所以你得回了你“原始的”日期/时间值。有可能,下面这些情况会发生。 理想情况下,如果你一直使用同一个时区,MySQL 会获取到和你存储的同样的值。以我的经验,如果你的数据库涉及时区变换,你可能会遇到问题。例如,服务器变化(比如,你把数据库从都柏林的一台服务器迁移到加利福尼亚的一台服务器上,或者你只是修改了一下服务器的时区)时可能会发生这种情况。不管哪种方式,如果你获取数据时的时区是不同的,数据就会受影响。 Datetime 列不会被数据库改变。无论时区怎样配置,每次都会保存和获取到同样的值。就我而言,我认为这是一个更可靠的选择。 MySQL 文档: MySQL 把 TIMESTAMP 值从当前的时区转换到 UTC 再存储,获取时再从 UTC 转回当前的时区。(其它类型如 DATETIME 不会这样,它们会“原样”保存。) 默认情况下,每个连接的当前时区都是服务器的时区。时区可以基于连接设置。只要时区设置保持一致,你就能得到和保存的相同的值。如果你保存了一个 TIMESTAMP 值,然后改变了时区再获取这个值,获取到的值和你存储的是不同的。这是因为在写入和查询的会话上没有使用同一个时区。当前时区可以通过系统变量 time_zone 的值得到。更多信息,请查看 MySQL Server Time Zone Support。 对比总结 在深入探讨使用各数据类型的性能差异之前,让我们先看一个总结表格以给你更多了解。每种类型的弱点以红色显示。 特性 Datetime Timestamp Int (保存 Unix 时间) 原生时间表示 是 是 否,所以大多数操作需要先使用转换函数,如 FROM_UNIXTIME() 能保存毫秒 是,最高 6 位精度 是,最高 6 位精度 否 合法范围 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 若使用 unsigned, '1970-01-01 00:00:01.000000; 理论上最大到 '2106-2-07 06:28:15' 自动初始化(MySQL 5.6.5+) 是 是 否 宽松解释 (MySQL docs) 是 是 否,必须使用正确的格式 值被转换到 UTC 存储 否 是 否 可转换到其它类型 是,如果值在合法的 Timestamp 范围中 是,总是 是,如果值在合法的范围中并使用转换函数 存储需求(MySQL 5.6.4+) 5 字节(如果使用了毫秒部分,再加最多 3 字节) 4 字节 (如果使用了毫秒部分,再加最多 3 字节) 4 字节 (不允许毫秒部分) 无需使用函数即可作为真实日期可读 是 是 否,你必须格式化输出 数据分区 是 是,使用 UNIX_TIMESTAMP();在 MySQL 5.7 中其它表达式是不允许包含 TIMESTAMP 值的。同时,注意分区裁剪时的这些考虑 是,使用 INT 上的任何合法操作 基准测试 INT、Timestamp 和 Datetime 的性能 为了比较这些类型的性能,我会使用我创建的一个天气预报网络的 150 万记录(准确说是 1,497,421)。这个网络每分钟都收集数据。为了让这些测试可复现,我已经删除了一些私有列,所以你可以使用这些数据运行你自己的测试。 基于我原始的表格,我创建了三个版本: datetimemeasures表在 measured_on 列使用 Datetime 类型,表示天气预报记录的测量时间 timestampmeasures表在 measured_on 列使用 Timestamp 类型 inttimestampmeasures表在 measured_on 列使用 INT (unsigned) 类型 这三个表拥有完全相同的数据;唯一的差别就是 measured_on 字段的类型。所有表都在 measured_on 列上设置了一个索引。 基准测试工具 为了评估这些数据类型的性能,我使用了两种方法。一种基于 Sysbench,它的官网是这么描述的: “... 一个模块化、跨平台和多线程的基准测试工具,用以评估那些对运行高负载数据库的系统非常重要的系统参数。” 这个工具是 MySQL 文档中推荐的。 如果你使用 Windows (就像我),你可以下载一个包含可执行文件和我使用的测试查询的 zip 文件。它们基于 一种推荐的基准测试方法。 为了执行一个给定的测试,你可以使用下面的命令(插入你自己的连接参数): sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=sysbench_test_file.lua --num-threads=8 --max-requests=100 run 这会正常工作,这里 sysbench_test_file.lua 是测试文件,并包含了各个测试中指向各个表的 SQL 查询。 为了进一步验证结果,我也运行了 mysqlslap。它的官网是这么描述的: “mysqlslap 是一个诊断程序,为模拟 MySQL 服务器的客户端负载并报告各个阶段的用时而设计。它工作起来就像是很多客户端在同时访问服务器。” 记得这些测试中最重要的不是所需的绝对时间。而是在不同数据类型上执行相同查询时的相对时间。这两个基准测试工具的测试时间不一定相同,因为不同工具的工作方式不同。重要的是数据类型的比较,随着我们深入到测试中,这将会变得清楚。 基准测试 我将使用三种可以评估几个性能方面的查询: 时间范围选择 在 Datetime 和 Timestamp 数据类型上这允许我们直接比较而不需要使用任何特殊的日期函数。 同时,我们可以评估在 INT 类型的列上使用日期函数相对于使用简单的数值比较的影响。为了做到这些我们需要把范围转换为 Unix 时间戳数值。 日期函数选择 与前个测试中比较操作针对一个简单的 DATE 值相反,这个测试使得我们可以评估使用日期函数作为 “WHERE” 子句的一部分的性能。 我们还可以测试一个场景,即我们必须使用一个函数将 INT 列转换为一个合法的 DATE 类型然后执行查询。 count() 查询 作为对前面测试的补充,这将评估在三种不同的表示类型上进行典型的统计查询的性能。 我们将在这些测试中覆盖一些常见的场景,并看到三种类型上的性能表现。 关于 SQL_NO_CACHE 当在查询中使用 SQL_NO_CACHE 时,服务器不使用查询缓存。它既不检查查询缓存以确认结果是不是已经在那儿了,也不会保存查询结果。因此,每个查询将反映真实的性能影响,就像每次查询都是第一次被调用。 测试 1:选择一个日期范围中的值 这个查询返回总计 1,497,421 行记录中的 75,706 行。 查询 1 和 Datetime: SELECT SQL_NO_CACHE measured_onFROM vertabelo.datetimemeasures mWHERE m.measured_on > '2016-01-01 00:00:00.0' AND m.measured_on < '2016-02-01 00:00:00.0'; 性能 响应时间 (ms) Sysbench mysqlslap 最小 152 296 最大 1261 3203 平均 362 809 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=datetime.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.datetimemeasures m WHERE m.measured_on > '2016-01-01 00:00:00.0' AND m.measured_on < '2016-02-01 00:00:00.0'" --host=localhost --user=root --concurrency=8 --iterations=100 --no-drop --create-schema=vertabelo 查询 1 和 Timestamp: SELECT SQL_NO_CACHE measured_onFROM vertabelo.timestampmeasures mWHERE m.measured_on > '2016-01-01 00:00:00.0' AND m.measured_on < '2016-02-01 00:00:00.0'; 性能 响应时间 (ms) Sysbench mysqlslap 最小 214 359 最大 1389 3313 平均 431 1004 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=timestamp.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.timestampmeasures m WHERE m.measured_on > '2016-01-01 00:00:00.0' AND m.measured_on < '2016-02-01 00:00:00.0'" --host=localhost --user=root --concurrency=8 --iterations=100 --no-drop --create-schema=vertabelo 查询 1 和 INT: SELECT SQL_NO_CACHE measured_onFROM vertabelo.inttimestampmeasures mWHERE FROM_UNIXTIME(m.measured_on) > '2016-01-01 00:00:00.0' AND FROM_UNIXTIME(m.measured_on) < '2016-02-01 00:00:00.0'; 性能 响应时间 (ms) Sysbench mysqlslap 最小 2472 7968 最大 6554 10312 平均 4107 8527 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=int.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.inttimestampmeasures m WHERE FROM_UNIXTIME(m.measured_on) > '2016-01-01 00:00:00.0' AND FROM_UNIXTIME(m.measured_on) < '2016-02-01 00:00:00.0'" --host=localhost --user=root --concurrency=8 --iterations=100 --no-drop --create-schema=vertabelo 另一种 INT 上的查询 1: 由于这是个相当直接的范围搜索,而且查询中的日期可以轻易地转为简单的数值比较,我将它包含在了这个测试中。结果证明这是最快的方法 (你大概已经预料到了),因为它仅仅是比较数字而没有使用任何日期转换函数: SELECT SQL_NO_CACHE measured_onFROM vertabelo.inttimestampmeasures mWHERE m.measured_on > 1451617200 AND m.measured_on < 1454295600; 性能 响应时间 (ms) Sysbench mysqlslap 最小 88 171 最大 275 2157 平均 165 514 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=basic_int.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.inttimestampmeasures m WHERE m.measured_on > 1451617200 AND m.measured_on < 1454295600" --host=localhost --user=root --concurrency=8 --iterations=100 --no-drop --create-schema=vertabelo 测试 1 总结 平均响应时间 (ms) Sysbench 相对于 Datetime 的速度 mysqlslap 相对于 Datetime 的速度 Datetime 362 - 809 - Timestamp 431 慢 19% 1004 慢 24% INT 4107 慢 1134% 8527 慢 1054% 另一种 INT 查询 165 快 55% 514 快 36% 两种基准测试工具都显示 Datetime 比 Timestamp 和 INT 更快。但 Datetime 没有我们在另一种 INT 查询中使用的简单数值比较快。 测试 2:选择星期一产生的记录 这个查询返回总计 1,497,421 行记录中的 221,850 行。 查询 2 和 Datetime: SELECT SQL_NO_CACHE measured_onFROM vertabelo.datetimemeasures mWHERE WEEKDAY(m.measured_on) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 1874 4343 最大 6168 7797 平均 3127 6103 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=datetime_1.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.datetimemeasures m WHERE WEEKDAY(m.measured_on) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 查询 2 和 Timestamp: SELECT SQL_NO_CACHE measured_onFROM vertabelo.timestampmeasures mWHERE WEEKDAY(m.measured_on) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 2688 5953 最大 6666 13531 平均 3653 8412 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=timestamp_1.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.timestampmeasures m WHERE WEEKDAY(m.measured_on) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 查询 2 和 INT: SELECT SQL_NO_CACHE measured_onFROM vertabelo.inttimestampmeasures mWHERE WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 2051 5844 最大 7007 10469 平均 3486 8088 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=int_1.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE measured_on FROM vertabelo.inttimestampmeasures m WHERE WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 测试 2 总结 平均响应时间 (ms) Sysbench 相对于 Datetime 的速度 mysqlslap 相对于 Datetime 的速度 Datetime 3127 - 6103 - Timestamp 3653 慢 17% 8412 慢 38% INT 3486 慢 11% 8088 慢 32% 再次,在两个基准测试工具中 Datetime 比 Timestamp 和 INT 快。但在这个测试中,INT 查询 —— 即使它使用了一个函数以转换日期 —— 比 Timestamp 查询更快得到结果。 测试 3:选择星期一产生的记录总数 这个查询返回一行,包含产生于星期一的所有记录的总数(从总共 1,497,421 行可用记录中)。 查询 3 和 Datetime: SELECT SQL_NO_CACHE COUNT(measured_on)FROM vertabelo.datetimemeasures mWHERE WEEKDAY(m.measured_on) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 1720 4063 最大 4594 7812 平均 2797 5540 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=datetime_1_count.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE COUNT(measured_on) FROM vertabelo.datetimemeasures m WHERE WEEKDAY(m.measured_on) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 查询 3 和 Timestamp: SELECT SQL_NO_CACHE COUNT(measured_on)FROM vertabelo.timestampmeasures mWHERE WEEKDAY(m.measured_on) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 1907 4578 最大 5437 10235 平均 3408 7102 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=timestamp_1_count.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE COUNT(measured_on) FROM vertabelo.timestampmeasures m WHERE WEEKDAY(m.measured_on) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 查询 3 和 INT: SELECT SQL_NO_CACHE COUNT(measured_on)FROM vertabelo.inttimestampmeasures mWHERE WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0; # MONDAY 性能 响应时间 (ms) Sysbench mysqlslap 最小 2108 5609 最大 4764 9735 平均 3307 7416 Sysbench cmd> sysbench --MySQL-table-engine=innodb --MySQL-db=vertabelo --MySQL-user=root --MySQL-host=localhost --MySQL-password= --test=int_1_count.lua --num-threads=8 --max-requests=100 runmysqlslap cmd> mysqlslap --query="SELECT SQL_NO_CACHE COUNT(measured_on) FROM vertabelo.inttimestampmeasures m WHERE WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0" --host=localhost --user=root --concurrency=8 --iterations=25 --no-drop --create-schema=vertabelo 测试 3 总结 平均响应时间 (ms) Sysbench 相对于 Datetime 的速度 mysqlslap 相对于 Datetime 的速度 Datetime 2797 - 5540 - Timestamp 3408 慢 22% 7102 慢 28% INT 3307 慢 18% 7416 慢 33% 再一次,两个基准测试工具都显示 Datetime 比 Timestamp 和 INT 快。不能判断 INT 是否比 Timestamp 快,因为 mysqlslap 显示 INT 比 Timestamp 略快而 Sysbench 却相反。 注意: 所有测试都是在一台 Windows 10 机器上本地运行的,这台机器拥有一个双核 i7 CPU,16GB 内存,运行 MariaDB v10.1.9,使用 innoDB 引擎。 结论 基于这些数据,我确信 Datetime 是大多数场景下的最佳选择。原因是: 更快(根据我们的三个基准测试)。无需任何转换即是人类可读的。不会因为时区变换产生问题。只比它的对手们多用 1 字节支持更大的日期范围(从 1000 年到 9999 年) 如果你只是存储 Unix 时间戳(并且在它的合法日期范围内),而且你真的不打算在它上面使用任何基于日期的查询,我觉得使用 INT 是可以的。我们已经看到,它执行简单数值比较查询时非常快,因为只是在处理简单的数字。 Timestamp 怎么样呢?如果 Datetime 相对于 Timestamp 的优势不适用于你特殊的场景,你最好使用时间戳。阅读这篇文章后,你对三种类型间的区别应该有了更好的理解,可以根据你的需要做出最佳的选择。
帮助Linux管理员简化任务并实现自动化的七大工具 1. PuppetPuppet是一款开源工具,旨在为系统管理员大大简化自动化和报告工作。它基本上是款配置管理软件,有助于配置和维护企业网络中的服务器及其他系统。系统管理员通常每天要花大量时间重复做同样的任务。他们总是想要使这些任务实现自动化,以便有更多的时间来处理其他项目或学习新的概念和脚本语言。管理员可以通过编写脚本使任务实现自动化,但是在拥有大型网络的公司,脚本不是很方便。这时候,Puppet就大有用场,因为借助Puppet,你可以: 为网络上的每个主机定义独特的配置设置; 不断监测网络,查找任何变动; 帮助高效地创建和管理用户; 帮助管理每个开源工具的配置设置。 2. CHEFChef是另一款可供Linux系统管理员使用的流行的自动化工具。它用Ruby和Erlang编写,对于配置和维护公司的服务器大有帮助,无论贵公司拥有十台服务器还是上百台。它还可以帮助你将云端服务器与亚马逊EC2、OpenStack、RackSpace或谷歌云整合起来。如果有不清楚的地方,欢迎百度搜索《linux就这么学》Chef可以将你的基础设施转变成代码,那样借助代码,你只要更改几行代码,就能轻松撤下一台服务器,从而让你轻松管理服务器。物理节点还意味着:将变更内容部署到生产环境之前,可以对它轻松进行测试,你还可以轻松控制针对代码的每次更新的版本。Chef DK为你提供了测试和管理配置的所有工具,Chef Server充当你所有“菜谱”(recipe)的存储库,可以管理与服务器连接的每个节点。Chef客户软件在每个客户端上运行,时不时收到服务器方面的信息,从而更新其配置设置。 3. CFEngine面向Linux系统管理员的下一款自动化工具是CFEngine,这是另一个领先的自动化系统,可帮助你轻松管理整套基础设施,并使之实现自动化。一旦你使用CFEngine为网络中的系统定义了配置,那么CF Engine就会自动确保配置符合规范。不用说,如果你的网络中有10个或100个节点,可以在短短几秒内更新或改动任何一个节点或所有节点。CFEngine之所以受到许多Linux系统管理员的青睐,是由于它运行成本低、响应速度快、具有自愈合功能。 4. AnsibleAnsible是Red Hat提供的一款开源配置管理和IT企业自动化软件,随带一种简单的编程语言,让系统管理员能够高效地处理自动化和配置过程。Ansible由控制机器和控制机器控制的节点组成。节点是通过SSH来加以控制的。Ansible的主要特点之一是代理并不是部署到节点 ,但是完全借助SSH来进行通信。易学易用、具有一致性、高可靠性和安全性是让Ansible脱颖而出的其他特性。Ansible的唯一局限就是无法配置裸机和虚拟机。 5. ForemanForeman是另一种用于取证分析的开源配置管理工具。Foreman提供了仪表板,我们可以通过仪表板来配置裸机服务器和虚拟机。默认情况下,无论我们何时安装Foreman,它都使用Puppet作为配置工具。不过借助插件,Foreman还支持与其他配置管理工具整合起来,比如Chef、Puppet、Ansible、Salt及其他众多工具。Foreman自动化工具还随带各种各样的接口,包括命令行接口、Web前端以及REST API。Foreman的其他一些显著功能包括如下: 通过仪表板,管理Puppet模块和puppet类方面的改动; 很容易从Foreman仪表板来管理Puppet环境; 由于仪表板,创建主机群(Hosts Group)以及为主机群添加puppet模块变得很轻松; 可以从Foreman仪表板,轻松添加Puppet模块或推送到节点。 6. KatelloKatello是另一种开源自动化工具。换而言之,我们可以说Katello是一种开源版的Red Hat satellite Server;如果我们不想花钱在企业产品及其支持上,就可以用它来代替Red Hat satellite Server。Katello已被Foreman收购,Foreman中的大部分功能在Katello中也得到了支持。Katello Server的主要功能如下: 给基于Linux的服务器(RHEL和CentOS )打补丁; 使用Pulp Service来同步代码库; 使用Foreman进行各种配置; 它还可以处理订阅内容管理,并审计所有已部署的软件包; 借助Katello,你可以为所有主机创建主机群,另外还可以在单一主机或一群主机上批量执行操作。 7. NagiosNagios现在名为Nagios Core,它是一种开源自动化和监控工具,可以管理基础设施中的所有系统。它还提供警报服务,一旦察觉到你的网络中哪里有问题,就会提醒系统管理员。借助SNMP以及Nagios,系统管理员还可以控制并管理打印机、路由器和交换机。Nagios让我们得以创建事件处理工具,一旦某个应用程序及其服务停运,就可以自动重启出现故障的那个应用程序及其服务。
5 个最常见的 Linux故障问题 1、 Wifi 驱动程序(特别是 Broadcom 芯片) 一般来说,Wifi 驱动程序,特别是 Broadcom 无线网卡,仍然是 Linux 面临的最大的问题技术问题之一。在 LQ 上,2016 年有数以百计的帖子在讨论这个话题,而且还有其他无数的地方也是。市场上有数十种 Broadcom 无线网卡可供使用,但为每一个发行版描述具体的排错细节来已经超出了一篇文章的范畴,但是基本的故障排除步骤是相同的: 通过使用 lspci 命令确定具体使用的 Broadcom 卡,以找出 PCI ID, 确定使用发行版是否支持该卡, 如果支持,找到正确的方法来使网卡工作。 例如,如果有一个14e4:4315 PCI ID 的卡,并且系统为 Ubuntu,则应该知道 BCM4312 卡可以通过安装 内联代码块firmware-b43-installer 包来驱动。另一个选择是在购买之前,研究好可用的 WiFi 卡,以确保您的发行版完全支持它。 2.打印机驱动程序(特别是佳能和 Lexmark) 打印机也是常有问题的,佳能和 Lexmark 被反复提及遇到这种问题。如果您要购买一台新打印机,请在购买之前研究兼容性。但是,如果您从其他操作系统迁移,这可能没得选择。如果你正在做调研,OpenPrinting 数据库和您的发行版的官方支持渠道是两个最好的起点。请注意,您应确保设备的所有功能完全兼容,特别是如果它是个多功能产品。对佳能打印机的一个常见的抱怨是,驱动程序通常只能在非英语,甚至是很难找的网站上才有。如果您购买的是新打印机,请在购买之前研究兼容性。 3.显卡 显卡是一个微妙的话题,因为在 Linux 上显卡可以非常好的简单直观的开箱即用。出现的问题是:显卡加速器/3D 加速;最新的显卡和最新显示技术,如 NVIDIA Optimus 和 ATI 动态 GPU 切换;专有驱动程序的安装和稳定性;能效管理;以及可靠的挂起和恢复。如果你不是一个游戏玩家,也没有别的需要高端图形功能的需求,并且不是使用笔记本电脑,那么你可能不必担心这个。如果您正在寻找一台新的笔记本电脑,一定要在购买前研究好兼容性。如果你是一个游戏玩家或需要最高端的图形功能,你需要明确知道你的需求是什么,然后开始你的研究。幸运的是,这种情况正在改善,Wayland 开始解决问题,2017 年情况应该会变得好一些。 4.声卡 再次,对于简单配置,声卡非常容易设置并可以很可靠地在 Linux 上运行。一旦你买的是专业级产品,例如回声消除、音频路由,统一混合和其他复杂的配置,它可能就很快地每况愈下。我的建议是,如果你需要高端的实时音频,请使用专用的音频相关的发行版。 5.安装 有了这个包罗万象的分类,本文几乎保证是高质量的。也就是说,公平的说,我不知道 Linux 有普遍的安装问题。绝大多数的安装都按预期进行。如果有不清楚的地方或者百度搜索《linux就该这么学》Linux 支持多种硬件,安装 Linux 机器上可能有近乎无限的硬件组合,不可避免会导致了某种情况下的例外情况。最终用户其实也很少安装类似 Mac OS 或 Windows 这样的其它系统,因为它们都是随同新设备预安装的。绝大多数的安装都按预期进行。 前景光明 其他提到的问题经常包括蓝牙、挂起/恢复,HiDPI 和触摸屏。您可能会看到这里形成一个模式,本文中提到的大多数问题集中在桌面用户。如果你已经意识到了这点,这其实是有意义的。Linux 桌面使用率相对较低,导致结果是,用于发现和解决相关问题的测试和资源很少。随着桌面使用量的增加,可以预期这些部分会改善。 在这方面,我认为最好提及的一个例子,曾经常常作为 Linux 的问题提出,但是反而最近很罕见:字体。几年前,获得高品质的抗锯齿字体常常是个问题。但是,随着现代发行版本的更新,它已成为常规。
在Linux中加入cron任务 cron是Linux中默认的计划任务。使用cron,你可以安排一个计划(比如:命令或者shell脚本)周期性地运行或者在指定的分钟、小时、天、周、月等特定时间运行。cron在你安排不同的常规维护任务时是很有用的,比如周期性地备份、日志循环、检查文件系统、监测磁盘空间等等 本文节选自《linux就该这么学》,感兴趣的同学可以自行搜索 从命令行中添加cron任务 要添加cron任务,你可以使用称为crontab的命令行工具。 输入下面的命令会创建一个以当前用户运行的新cron任务。 1.$ crontab -e 如果你想要以其他用户运行cron任务,输入下面的命令。 1.$ sudo crontab -u -e 你将会看见一个文本编辑窗口,这里你可以添加或者编辑cron任务。默认使用nono编辑器。每个cron任务的格式如下。 1.< 分钟> < 小时> < 日> < 月> < 星期> < 命令> 前5个元素定义了任务的计划,最后一个元素是命令或者脚本的完整路径。下面是一些cron任务示例。 •* * * * * /home/dan/bin/script.sh: 每分钟运行。 •0 * * * * /home/dan/bin/script.sh: 每小时运行。 •0 0 * * * /home/dan/bin/script.sh: 每天零点运行。 •0 9,18 * * * /home/dan/bin/script.sh: 在每天的9AM和6PM运行。 •0 9-18 * * * /home/dan/bin/script.sh: 在9AM到6PM的每个小时运行。 •0 9-18 * * 1-5 /home/dan/bin/script.sh: 周一到周五的9AM到6PM每小时运行。 •*/10 * * * * /home/dan/bin/script.sh: 每10分钟运行。 一旦完成上面的设置步骤后,按下Ctrl+X来保存并退出编辑器。此时,新增的计划任务应该已经激活了。 要查看存在的计划任务,使用下面的命令: 1.$ crontab -l从GUI添加计划任务 如果你在Linux桌面环境中,你可以使用crontab的更加友好的GUI前端来添加或者添加一个cron任务。 在Gnome桌面中,有一个Gnome Schedule(gnome-schedule包)。在KDE桌面中,有一个Task Scheduler(kcron包)。
快速找到最近修改的文件! 1、 使用 ls 命令,只列出你的 home 文件夹中今天的文件# ls -al --time-style=+%D | grep 'date +%D' 其中: -a- 列出所有文件,包括隐藏文件 -l- 启用长列表格式 >--time-style=FORMAT- 显示指定 FORMAT 的时间 +%D- 以 >%m/%d/%y(月/日/年)格式显示或使用日期在Linux中找出最近的文件 本文选自《linux就该这么学》,感兴趣的同学可以自行搜索 此外,你使用可以 -X 标志来按字母顺序对结果排序: # ls -alX --time-style=+%D | grep 'date +%D' 你也可以使用 -S标志来基于大小(由大到小)来排序: # ls -alS --time-style=+%D | grep 'date +%D'2、 另外,使用 find 命令会更灵活,并且提供比ls更多的选项,可以实现相同的目的 -maxdepth级别用于指定在搜索操作的起点下(在这个情况下为当前目录)的搜索层级(子目录层级数)。 newerXY用于所寻找的文件的时间戳 X 比参照文件的时间戳Y更新一些的文件。X 和 Y 表示以下任何字母: -a- 参照文件的访问时间 -B- 参照文件的创建时间 -c- 参照文件的 inode 状态改变时间 -m- 参照文件的修改时间 -t- 直接指定一个绝对时间 下面的命令意思是只找出 2016-12-06 这一天修改的文件: # find . -maxdepth 1 -newermt "2016-12-06"在 Linux 中找出今天的文件 重要:在上面的 find 命令中使用正确的日期格式作为参照时间,一旦你使用了错误的格式,你会得到如下错误: # find . -maxdepth 1 -newermt "12-06-2016"#find: I cannot figure out how to interpret '12-06-2016' as a date or time 或者,使用下面的正确格式: # find . -maxdepth 1 -newermt "12/06/2016"或者# find . -maxdepth 1 -newermt "12/06/16"在本文中,我们解释了如何使用 ls 和 find 命令帮助只列出今天的文件。 请使用以下反馈栏向我们发送有关该主题的任何问题或意见。 你也可以提醒我们其他可以用于这个目的的命令。
ReactOS 新手指南 安装系统 在开始安装这个系统之前,我需要说明一下,ReactOS 的最低硬件要求是 500MB 硬盘以及仅仅 96MB 内存。我会在一个 32 位的虚拟机里面演示安装过程。一下内容节选自《linux就该这么学》 感兴趣的可以自行搜索 现在,你需要使用箭头键来选择你想要语言,而后通过回车键来确认。之后,再次敲击回车键来继续安装。你也可以选择按“R”键来修复现有的系统。在第三屏中,你将看到一个警告说这个系统还是早期开发版本。再次敲击回车键,你将看到一个需要你最后确认的配置概览。如果你认为没问题,就按回车。然后,我们就到了分区这一步,在这里,你可以使用“D”键删除高亮分区,分别使用“P”键、“E”键以及“L”键来添加一个主分区、拓展分区或逻辑分区。如果你想要自己添加一个分区,你需要输入这个分区的大小(以 MB 为单位),然后通过回车来确认。但是,如果你有未使用的硬盘空间,在分区过程直接敲击回车键可以自动在你选中的分区上安装 ReactOS。下一步是选择分区的格式,不过现在我们只能选择 FAT32。再下一步是选择安装文件夹。我就使用默认的“/ReactOS”了,应该没有问题。然后就是等待...最后,我们要选择启动程序的安装位置。如果你是在实机上操作的话,第一个选项应该是最安全的。总地来说,我认为 ReactOS 的安装向导很直接。尽管安装程序的界面可能看起来一点也不现代、不友好,但是大多数情况下作为用户的我们只需要狂敲回车就能安个差不多。这就是说,ReactOS 的开发版安装起来也是相对简单方便的。 设置 ReactOS 在我们重启进入新系统之后,“设置向导”会帮助你设置系统。目前,这个向导仅支持设置语言和键盘格式。我在这里选择了第二个键盘格式。我还可以设置一个改变键盘布局的快捷键。之后我添加了用户名……以及管理员密码…在设置好时间之后,我们就算完成了系统设置。ReactOS 之内 当我们历经千辛万苦,终于首次进入 ReactOS 的界面时,系统会检测硬件并自动帮助我们安装驱动。这是我这里被自动检测出来的三个硬件:在上一张图片里你看到的是 ReactOS 的“应用管理器”,这东西是 Linux 的标配。不过你不会在这里找到任何与 Linux 有关系的东西。只有在这个系统里工作良好的开源软件才会在这个管理器中出现。这就导致了管理器中有的分类下挤得满满当当,有的却冷清异常。我试着通过软件中心安装了 Firefox 以及通过直接下载 exe 文件双击安装 Notepad++。这两个应用都能完美运行:它们的图标出现在了桌面上,在菜单中也出现了它们的名字,Notepad++ 也出现在了软件中心右侧的分类栏里。我没有尝试运行任何现代的 Windows 游戏,如果你想配置 Direct 3D 的话,你可以转到 “我的电脑/控制选项/WineD3D 配置”。在那里,你能看到很多 Direct3D 选项,大致与 dx 8 的选项类似。ReactOS 还有一个好的地方,就是我们可以通过“我的电脑”来操作注册表。如果你需要一个简单点的工具,你可以在应用菜单里打开注册表编辑器。最后,如果你认为 ReactOS 看起来有点过时了的话,你可以在桌面右击选择“属性”,之后在“外观”那里选择你喜欢的主题和颜色。结论 老实说,我对 ReactOS 的工作方式印象深刻。它相当稳定、连贯、快速,并且真正人性化。抛开 Windows 的阴影(过时的应用菜单,不合理的菜单结构)不谈的话,ReactOS 几乎做到了尽善尽美。它可能不会有太多应用可供选择,现有的功能也可能不够强大,但是我确信它将会繁荣壮大。关于它的数据显示出了它的人气,我确定将要围绕它建立起来的社区将会很快就壮大到能把这个项目带往成功之路的地步。如今,ReactOS 的最新版本是 0.4.1。如果想要以开源的方式运行 Windows 的应用,那么它就是你的菜!
【17-01-23】 【分享】HTTPS 2017强势普及 力推HTTPS 苹果谷歌祭大招 一下内容来自《Linux就该这么学》,感兴趣的可以自行搜索 苹果公司于2016年6月宣布,2016年底前登陆App Store的所有iOS应用将强制采用ATS(App Transport Security)安全标准,也就是App的网络传输必须通过HTTPS协议传输而不是HTTP协议。在苹果公司强制要求App在年底前使用HTTPS后不久,谷歌公司紧随其后,于同年九月宣布,谷歌计划从2017年1月推出的Chrome 56开始,对未进行HTTPS加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”。2017年起,未经HTTPS加密的网页将遭到Chrome的安全警告 不仅是苹果和谷歌,其他互联网巨头也在竭力推进HTTPS的普及:在非HTTPS页面使用密码输入框时,火狐浏览器将会给出一个红色的阻止图标来指示隐私和安全方面的风险;腾讯微信小程序的官方需求文档要求后台使用HTTPS请求进行网络通信,不满足条件的域名和协议无法请求。没有HTTPS,开发者的APP就无法在应用商店上架;没有HTTPS,用户很可能因为安全警告而远离你的网站。简言之,如果您或您的企业正在从事应用开发、互联网服务等业务确没有使用HTTPS,苹果谷歌等巨头的安全政策将让您不太好过。那么,HTTPS为何得到互联网巨头们的推崇呢? 苹果谷歌为何力推HTTPS? HTTPS是由SSL证书+HTTP协议构建的可进行加密传输、身份认证的一种网络通信协议。HTTPS起到两个作用,一是将传输中的数据进行记录、封装、加密,二是在数据传输开始前,通讯双方进行身份真实性认证并协商加密算法、交换加密密钥等。网络通信信息加密和服务器身份真实性验证是网络安全的重要基础,因为完美解决了这两个基础性问题,HTTPS已经成为互联网安全的行业标准。苹果官网安装EV SSL证书实现HTTPS加密并显示公司认证信息及绿色安全地址栏 谷歌曾表示:谷歌希望网页能够触及更深层的计算机资源,与移动应用一样可以获取敏感信息,比如地理位置和离线数据。但若网页触角想要进一步扩展进我们的个人生活,首先,必须是安全的,“没人希望有中间人(一种攻击方式,可拦截窃听HTTP数据)可以获取到这些信息。”可见,巨头们力推HTTPS不仅是希望更好的保护用户安全,也出于自身的利益,这就让他们更加不遗余力的进行推广。所以,对苹果谷歌们而言,谁让用户的安全“过不去”,谁让其网络安全战略“过不去”,他们就让谁“过不去”。有些霸道?也许是的,苹果和谷歌公司也收到了指责他们在HTTPS推进问题上动作过快、打击站点的电子邮件,开发者论坛上也传出抨击的声音,但这却无法撼动他们要让全球操作系统上HTTPS加密链接覆盖率达到100%的目标。 虽然巨头们夹带着一点私心,但作为互联网大生态中的一员,让网络更安全是所有网站管理者、应用开发者等相关人员和企业的责任。不论是从保护用户还是自身的发展出发,我们都应该更积极的落实苹果谷歌的安全标准。但2016年底已近在咫尺,如果您的网站或应用仍在使用HTTP,该如何尽快升级为HTTPS呢? 专业CA支招 快速升级HTTPS 如果要加载HTTPS协议,就需要在服务器上部署SSL证书。SSL证书是由CA(证书签发机构)颁发的数字证书,如果需要在网站、APP中配置HTTPS,就需要向CA申请一张SSL证书。作为唯一一家可签发支持苹果、谷歌旗下所有操作系统和浏览器SSL证书的中国CA,中国金融认证中心(CFCA)给希望将HTTP升级为HTTPS的网站管理员和应用开发者们提供了以下建议: · 针对网站服务器配置HTTPS 1. 向可信第三方CA申请SSL证书,且必须选择已经加入微软、火狐、谷歌、苹果根证书信任库的证书,同时证书使用符合最新的SHA256标准算法。 2. 根据网站服务器配置状况选择SSL证书: ① 单一域名/固定公网IP,且域名以及IP变动几率较小的,采用标准OV单域名证书; ② 多域名/多公网IP,且域名以及IP动几率较小的,采用标准OV多域名证书; ③ 多域名/多公网IP,且可能会后续增加子域名的,采用标准OV通配符证书; ④ 需要给网站使用并显示公司名称和绿色地址栏的,采用EV单域名/多域名证书。 3. 完成服务器Https配置,启用TLS v1.2版本协议。 4. 为服务器配置符合正向加密(Forward secrecy)的加密套件。 · 针对苹果app配置HTTPS 1. 完成客户端Https配置(与服务器建立链接时使用https协议以及相关接口),采用TLS v1.2版本协议。 2. 请勿通过设置禁用ATS协议(Info.plist)。注:CFCA EV SSL证书在苹果IOS系统safari浏览器中的展示效果 另外,考虑到年底马上就要到来,为防止国内网站管理者、开发者因不符合苹果谷歌等公司的HTTPS标准而流失客户或市场机会,CFCA将提供OV证书的免费试用和更为高效的证书审批及本土化服务支持,使SSL证书申请者获得专业安全、成本低廉的证书配置服务,及时升级HTTPS。
详解shell语法检查模式 启用 verbose 调试模式 在进入本指导的重点之前,让我们简要地探索下 verbose 模式。它可以用 -v 调试选项来启用,它会告诉 shell 在读取时显示每行。要展示这个如何工作,下面是一个示例脚本来批量将 PNG 图片转换成 JPG 格式。 将下面内容输入(或者复制粘贴)到一个文件中。 #!/bin/bash#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"doneexit 0 接着保存文件,并用下面的命令使脚本可执行: $ chmod +x script.sh 我们可以执行脚本并显示它被 Shell 读取到的每一行: $ bash -v script.sh在 Shell 脚本中启用语法检查调试模式使用 -n 激活语法检查模式 它会让 shell 读取所有的命令,但是不会执行它们,它(shell)只会检查语法。一旦 shell 脚本中发现有错误,shell 会在终端中输出错误,不然就不会显示任何东西。 激活语法检查的命令如下: $ bash -n script.sh 因为脚本中的语法是正确的,上面的命令不会显示任何东西。所以,让我们尝试删除结束 for 循环的 done 来看下是否会显示错误: 下面是修改过的含有 bug 的批量将 png 图片转换成 jpg 格式的脚本。 #!/bin/bash#script with a bug#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"exit 0 保存文件,接着运行该脚本并执行语法检查: $ bash -n script.sh从上面的输出中,我们看到我们的脚本中有一个错误,for 循环缺少了一个结束的 done 关键字。shell 脚本从头到尾检查文件,一旦没有找到它(done),shell 会打印出一个语法错误: script.sh: line 11: syntax error: unexpected end of file 我们可以同时结合 verbose 模式和语法检查模式: $ bash -vn script.sh我们还可以通过修改脚本的首行来启用脚本检查 如下面的例子: #!/bin/bash -n#altering the first line of a script to enable syntax checking#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"exit 0 如上所示,保存文件并在运行中检查语法: $ ./script.shscript.sh: line 12: syntax error: unexpected end of file 此外,我们可以用内置的 set 命令来在脚本中启用调试模式。 下面的例子中,我们只检查脚本中的 for 循环语法。 #!/bin/bash#using set shell built-in command to enable debugging#convert#enable debuggingset -nfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"#disable debuggingset +nexit 0 再一次保存并执行脚本: $ ./script.sh 总的来说,我们应该保证在执行 Shell 脚本之前先检查脚本语法以捕捉错误。以上内容节选自《linux就该这么学》,感兴趣的童鞋可以自行搜索!
【17-01-22】 【分享】CentOS 7.3 安装指南 基于 Red Hat 企业版的源代码的最新版本的 CentOS 7 在今年的 12月发布了 CentOS Linux 7 (1611) ,包含了许多 bug 修复、新的包更新,比如 Samba、Squid、libreoffice、SELinux、systemd 及其它软件,并支持第七代 Intel 酷睿 i3、i5、i7 处理器。本指南会向你展示如何在 UEFI 的机器上使用 DVD ISO 镜像来安装 CentOS 7.3。以下内容截选自《linux就该这么学》,感兴趣的童鞋可以自行搜索!提示要在 UEFI 的机器上正确安装 CentOS 7.3,首先按下键(F2 F11 或 F12,取决与你的主板类型)进入主板的 UEFI 设置,并且确保 QuickBoot/FastBoot 以及 Secure Boot 已被禁用。1、 在你从上面的链接下载完成镜像之后,使用 Rufus将它烧录到 DVD 或者创建一个可启动的 UEFI 兼容 USB 盘。 将 USB/DVD 放入主板上连接的驱动器中,重启电脑并用特定的功能键(F12 ,F10取决于主板类型)让 BIOS/UEFI 从 DVD/USB 启动。 ISO 镜像启动完成后,你机器上会显示如下首屏。在菜单中选择 “Install CentOS 7”并按下回车继续。CentOS 7.3 启动菜单 2、 在安装镜像加载到内存完成后,会显示一个欢迎页面。选择你在安装中使用的语言并按下“继续Continue”按钮。选择 CentOS 7.3 安装语言 3、 在下一个页面点击“日期和时间Date and Time”,从地图中选择你的地理位置。确认日期和时间正确配置了并点击“完成Done”按钮来回到主安装界面。CentOS 7.3 安装总结选择日期和时间 4、 点击“键盘Keyboard”菜单进入键盘布局页面。选择或者添加一个键盘布局并点击“完成Done”按钮继续。选择键盘布局 5、 接下来,为你的系统添加或者配置一个语言并点击“完成Done”按钮进入下一步。选择语言支持 6、 在这步中,你可以通过选择列表中安全配置来设置你的系统“安全策略Security Policy”。 点击选择配置按钮来选择你想要的安全配置并点击“应用安全策略Apply security policy”按钮到 On。点击“完成Done”按钮后继续安装流程。启用 CentOS 7.3 安全策略 7、 下一步中你可以点击“软件选择Software Selection”按钮来配置你的基础机器环境。 左边的列表是你可以选择安装桌面环境(Gnome、KDE Plasma 或者创意工作站)或者安装一个服务器环境(Web 服务器、计算节点、虚拟化主机、基础设施服务器、带图形界面的服务器或者文件及打印服务器)或者执行一个最小化的安装。 为了随后能自定义你的系统,选择最小化安装并附加兼容库,点击“完成Done”按钮继续。CentOS 7.3 软件选择 对于完整的 Gnome 或者 KDE 桌面环境,使用下面的截图作为指引。Gnome 桌面软件选择KDE 桌面软件选择 8、 假设你要在服务器上安装一个图形界面,选择左边那栏“带 GUI 的服务器Server with GUI”那项,并在右边那栏中根据你需要提供给客户端的服务选择合适的附加软件。 你可以选择的服务是非常多样化的,从备份、DNS 或者 e-mail 服务到文件存储服务、FTP、HA 或者监控工具。只选择对你网络设置最重要的服务。选择带 GUI 的服务器 9、 如果你不使用特定的网络协议比如 HTTP、HTTPS、FTP 或者 NFS 的额外仓库,安装源保持默认,并点击“安装位置Installation Destination”来创建一个磁盘分区。 在“设备选择Device selection”页面,确保你已经选择了本地磁盘。同样,在“其他存储选项Other Storage Options”中确保选择了“自动配置分区Automatically configure partitioning”。 这个选项可以确保你的磁盘会恰当地根据磁盘空间和 Linux 文件系统层次结构进行分区。它会为你自动创建 /(root)、/home和 swap 分区。点击“完成Done”来应用磁盘分区方案并回到主安装界面。 重要提醒:如果你想要创建自定义分区及自定义分区大小,你可以选择“我要配置分区I will configure partitioning”选项来创建自定义分区。安装 CentOS 7.3 安装位置 10、 接下来,如果你想要释放系统内存,点击 KDUMP 选项并禁用它。点击“完成Done”并回到主安装界面。Kdump 选择 11、 在下一步中设置你的主机名并启用网络服务。点击“网络和主机名Network & Hostname”,在主机名中输入你的 FQDN(完整限定网域名称),如果你在局域网中有一个 DHCP 服务器,将以太网按钮从 OFF 切换到 ON 来激活网络接口。设置网络及主机名 12、 为了静态配置你的网络接口,点击“配置Configure”按钮,手动如截图所示添加 IP 设置,并点击“保存Save”按钮来应用更改。完成后,点击“完成Done”按钮来回到主安装菜单。配置网络和 IP 地址 13、 最后检查下所有到目前为止的配置,如果一切没问题,点击“开始安装Begin Installation”按钮开始安装。开始 CentOS 7.3 安装向导 14、 开始安装后,一个新的设置用户界面会显示出来。首先点击 “root 密码ROOT PASSWORD”并添加一个强密码。 root 账户是每个 Linux 系统的最高管理账户密码,它拥有所有的权限。设置完成后点击完成按回到用户设置界面。选择 root 密码设置 root 密码 15、 用 root 账户运行系统是非常不安全和危险的,因此建议你点击“创建用户User Creation”按钮创建一个新的系统账户来执行每日的系统任务。 添加新的用户,并同时选择下面的两个选项来授予用户 root 权限以及每次在登录系统时手动输入密码。 当你完成最后一项点击“完成Done”按钮并等待安装完成。创建用户账户 16、 几分钟后安装程序会报告 CentOS 已经成功安装在你机器中。要使用系统,你只需要移除安装媒介并重启机器。CentOS 7.3 安装完成 17、 重启之后,使用安装中创建的用户登录系统,并且用 root 权限执行下面的命令来执行系统更新。$ sudo yum update Update CentOS 7.3更新 CentOS 7.3 所有 yum 管理器的问题都选择yes,最后再次重启电脑(使用sudo init 6)来应用新的内核升级。 $ sudo init 6 就是这样!在你的机器中享受最新的 CentOS 7.3 吧。
详解 RHEL7.1 yum源配置与软件安装 Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。以下内容节选自《linux就该这么学》,感兴趣的可以自行搜索 1.yum源的工作原理 YUM是“Yellow dog Update, Modified”的缩写,是一个软件包管理器,因为Linux系统存在特有的依赖关系,YUM就是为了解决依赖关系而存在,YUM源相当一个目录,当我们需要安装依赖软件时,YUM从指定的地方自动下载RPM包并安装,能够很好的解决依赖关系问题。 YUM的基本工作机制:在服务器上存放了所有RPM软件包,然后以相关的功能去分析每个RPM文件的依赖性关系,将这些数据记录成文件存放在服务器的某特定目录内,如果客户端需要安装某个软件时,先下载服务器上记录的依赖性关系文件(可以通过www过FTP方式),通过对服务器端下载的记录数据进行分析,然后取得所有相关的软件,一次全部下载下来进行安装。 2.如何安装软件yum list all ##列出所有安转包yum list installed ###列出已经安装的yum list available ###列出没有安装的yum remove software ###卸载软件yum install software ###安装软件yum search 关键字 ###搜索与关键字相关的软件yum whatprovides 文件 ###搜索包含此文件的包yum reinstall software ###从新安装软件yum localinstall 第三方软件 ##安装该软件并解决依赖关系yum info software ###查询软件信息yum groups list ###列出软件组yum groups install ###安装组yum groups remove ###卸载组yum groups info ###查看组信息3.RHEL官方软件仓库的建立3.1下载镜像 建立官方软件仓库需要一个与本机匹配的镜像,实验的主机是 rhel7.1,所以镜像也是此版本的。3.2挂载镜像 将镜像挂在在一个目录中,df 可以查看是否挂载成功。3.3编辑配置文件 路径:/etc/yum.repos.d/rhel-dvd.repo 文件,系统只会读取以.repo结尾文件,名字无所谓,gpgcheck=0 就是不进行gpg检测,gpg检测是使用yum安装软件对软件输入公钥进行验证,看来源是否安全,Baseurl是指定查找解决依赖关系软件的路径,因为这是本地yum配置,所以使用“file://”, /yum就是刚才镜像的挂载点3.4刷新缓存yum clean all 使配置生效。4.网络yum源的配置 配置网络yum源,使我们建立的yum仓库可以共享到网络上,可以是基于httpd服务,也可以基于ftp服务。这里使用httpd服务,httpd是Apache超文本传输协议。 4.1安装软件yum install httpd -y 先安装提供http服务的httpd软件,也可以验证刚才本地yum源配置是否成功。安装成功,本地yum源配置正确。4.2配置服务环境 打开httpd服务,开机自东启动服务,关闭防火墙。4.3建立目录并挂载镜像 Httpd默认发布目录是/var/www/html/,相当于根目录,所有共享的文件都要放在这个目录里。在/etc/httpd/conf/httpd.conf文件可以查看到第119行。在这个“根”目录建立一个目录,并将刚才的/yum/卸载,然后把镜像挂载到这个建立的目录里。4.4编辑配置文件vim /etc/yum.repos.d/rhel-dvd.repoyum clean all 然后清理缓存,使配置生效。 4.5开机自动挂载镜像 开机自动挂载镜像,我们就可以每次开机直接安装更新软件,并且自动共享yum仓库,在/etc/fstab 文件最后添加一行命令。以后当我们重启时,系统开机会读取/etc/fstab文件,帮我们挂载上镜像,我们就可以一劳永逸了。 4.6验证配置 打开浏览器,输入172.25.98.250/yumsource,就可以看到我们配置的网络yum源。5.yum软件控制vim /etc/yum.conf 添加如下命令,让search软件时,就会自动过滤。 exclude=*.x86_64 ###忽略64位安装包exclude=*.i686 ###忽略32位安装包6.rpm命令 当我们要安装的软件官方镜像中没有时,我们就需要在网上下载一个rpm包。rpm ###底层软件管理工具 -i ###install -v ###显示信息 -h ###指定包的解密方式为hash -q ###查询 -p ###指定软件包本身 -l ###列出软件中文件的名字 --scripts ###查看软件安装和卸载过程中所执行的动作 -f ###查询某个文件属于那个安装包 -a ###所有 -e ###卸载 --force ###强制 --nodeps ###忽略依赖性 -c ###配置文件 rpm2cpio 软件名 | cpio -id ###将软件包按目录拆开 安装wps: rpm -ihp wps-office-10.1.0.5672-1.a21.x86_64.rpm 如果出现一些依赖项,就一个一个找到提供这些依赖关系 的软件安装就可以了,或者搭建第三方软件仓库,就会会自动帮我们安装依赖项。 7.搭建第三方软件仓库把所有rpm包放到指定目录中,比如放到/software中7.2生成repodate目录createrepo /software ##在建立的仓库目录中执行,就会生成repodate目录7.3编辑配置文件 在/etc/yum.repos.d/xxx.repo编写指定/software的yum源。7.4使配置生效 清理缓存,使配置生效。 yum repolist all ##列出仓库列表 可以看到两个“仓库”,一个是用镜像建立的官方仓库,一个是建立的第三方仓库。搭建好第三方软件仓库后,用yum安装该仓库软件时会自动帮助我们解决依赖项问题。
【17-01-22】 【分享】详解Centos 分割卷组 LVM 可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。本篇Centos 7 将 lvm 的分割成两个卷组,将 Centos 卷组的大小由49G减少到40G,然后新建一个10G的 cinder-volumes 卷组。一下内容截选自《linux就该这么学》,该兴趣的可以自行搜索。 1、首先查看卷组:vgdisplay2、将 Centos lvm 减少10G空间:lvreduce -L -10G -n centos /dev/mapper/centos-root现在已经有10G空间剩余了,查看centos 卷组详情:从上图获取到LV Path:/dev/centos/root。 3、新建一个Cinder-volumes卷组:lvcreate -L 10G --name cinder-volumes /dev/centos/root报错。。 lvcreate -L +10G -n cinder-volumes centos其中最后面的centos为上述vgdisplay想要分割分区的卷组名。 lvdisplaydf -h没有找见刚刚创建的cinder-volumes卷组,而且/dev/mapper/centos-root大小没有改变。4、格式化挂在使用逻辑卷:mkfs.ext4 /dev/centos/cinder-volumes5、新建一个挂载目录:mkdir /mymount6、挂载mount /dev/centos/cinder-volumes /mymount/df -h7、测试使用下逻辑卷组:一切正常!
用 Docker 创建 serverless 应用 当今世界会时不时地出现一波波科技浪潮,将以前的技术拍死在海滩上。针对 serverless 应用的概念我们已经谈了很多,它是指将你的应用程序按功能来部署,这些功能在被用到时才会启动。你不用费心去管理服务器和程序规模,因为它们会在需要的时候在一个集群中启动并运行。 但是 serverless 并不意味着没有 Docker 什么事儿,事实上 Docker 就是 serverless 的。你可以使用 Docker 来容器化这些功能,然后在 Swarm 中按需求来运行它们。serverless 是一项构建分布式应用的技术,而 Docker 是它们完美的构建平台。 从 servers 到 serverless 那如何才能写一个 serverless 应用呢?来看一下我们的例子,"http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fgithub.com%2Fdocker%2Fexample-voting-app&urlrefer=f76cba4985c60d81df99fa538ec373e0"5个服务组成的投票系统投票系统由下面5个服务组成: 两个 web 前端 一个后台处理投票的进程 一个计票的消息队列 一个数据库 后台处理投票的进程很容易转换成 serverless 构架,我们可以使用以下代码来实现: import dockerrunclient = dockerrun.from_env()client.run("bfirsh/serverless-record-vote-task", [voter_id, vote], detach=True) 这个投票处理进程和消息队列可以用运行在 Swarm 上的 Docker 容器来代替,并实现按需自动部署。 我们也可以用容器替换 web 前端,使用一个轻量级 HTTP 服务器来触发容器响应一个 HTTP 请求。Docker 容器代替长期运行的 HTTP 服务器来挑起响应请求的重担,这些容器可以自动扩容来支撑更大访问量。 新的架构就像这样:红色框内是持续运行的服务,绿色框内是按需启动的容器。这个架构里需要你来管理的长期运行服务更少,并且可以自动扩容(最大容量由你的 Swarm 决定)。 我们可以做点什么? 你可以在你的应用中使用3种技术: 在 Docker 容器中按需运行代码。 使用 Swarm 来部署集群。 通过使用 Docker API 套接字在容器中运行容器。 结合这3种技术,你可以有很多方法搭建你的应用架构。用这种方法来部署后台环境真是非常有效,而在另一些场景,也可以这么玩,比如说: 由于存在延时,使用容器实现面向用户的 HTTP 请求可能不是很合适,但你可以写一个负载均衡器,使用 Swarm 来对自己的 web 前端进行自动扩容。 实现一个 MongoDB 容器,可以自检 Swarm 并且启动正确的分片和副本(LCTT 译注:分片技术为大规模并行检索提供支持,副本技术则是为数据提供冗余)。 下一步怎么做 我们提供了这些前卫的工具和概念来构建应用,并没有深入发掘它们的功能。我们的架构里还是存在长期运行的服务,将来我们需要使用 Swarm 来把所有服务都用按需扩容的方式实现。 希望本文能在你搭建架构时给你一些启发。 玩得愉快。
Hadoop创始人寄语2017 在过去的一年中,我们已经看到开源技术强势的发展成了企业的技术主流。谁会想到十年前Doug在Hadoop所做的工作会影响到那么多的行业,从制造到电信,再到金融等等。它们都掌握了开源生态系统的力量,不仅改善了客户的体验,变得有创新性并获得了利润增长,而且支持对社会有更大利益的工作,比如通过基因组研究、精密医学等项目来阻止人口贩卖,这仅仅是一小部分例子。 有人会很好奇如何开始着手进行开源工作,以及从不断变化的生态系统里期望能得到什么,下面Doug列出5个小贴士: 1. 拥抱开源的不断改变和演进 不断地变化,这是每一个刚接触开源技术的人需要学习的第一课,也是开源有别于传统软件的最大不同之处。开源的本质是易变、灵活,它的新项目常常起源于一些特别的用例。这种动态的循环促使产品变得更好、更快。因此,公司如果想从开源获得完全的好处,他们必须对技术转变保持开放的心态。Spark和MapReduce的辩论就完美的体现了这点的重要性:事实上,人们在构建新的应用时,MapReduce用得越来越少,而Spark成为他们默认的数据处理引擎。MapReduce正逐渐成为Hive、Pig的底层引擎,这并不意味着它过时了。它还会为现存应用很好地工作很多年,而且对某些大规模批量加载来说仍然是卓越的工具。这一趋势遵循开源技术的自然演进:MapReduce是开源数据生态系统的1.0引擎,Spark是2.0,而某一天会出现3.0让Spark成为历史。 2. 当引入一个新技术栈时,从小开始、由上而下 先不去考虑要构建、部署什么样的解决方案,我们现在有了很多通用数据平台和很多工具,它们能灵活地组合在一起去做搜索、流处理、机器学习还有更多事情。这些工作需要的不仅仅是一套不同的技能,而且还需要管理方式、组织结构等在文化上的转变。为此,重要的是要获得组织内高层的支持,并让数据管理列入董事会层面的一项重点议题。同时,建议拿一些新的应用来逐步建立一个新文化,而不是要取代所有的一切,这样可以让大家通过一个个具体的用例来适应这个变化。 3. 仔细挑选开源软件以避免云供应商捆绑 随着使用云计算的企业组织和产业越来越多,应该考虑到开源软件不仅会带来越来越好的健壮性、可扩展性和安全性,而且也可以帮助他们避免被云供应商捆绑。通过开源平台的构建,组织可以采用云供应商套利以降低成本,可以使用不同地域的不同云,或者基于云和内部部署的混合方式。事实上,开源平台已经证明了自己的技术优越性,2017年也许会取得更多的落地。大量的机构通过开源项目进行合作,单一的供应商要去竞争是很困难的。例如,现在那些开源数据系统在性能和灵活性上就处于领先地位,并且改进得更加迅速。 4. 对求职者来说,开源生态环境里要关注森林,而不是树木IT领域的求职者,不管是编程还是数据科学,不应该仅仅专注于掌握个别技术,而应该关注理解开源数据生态系统各个组成部分的最佳利用,以及如何把它们连接起来解决问题。这种上层建筑的理解是企业在技术创新中最有价值的技能。随着新技术的到来,至关重要的是了解它们的适应力如何、它们能取代什么、它们能做到什么。 5. 在技能缺口中寻找机会 大数据的技能缺口将在明年保持相对稳定,但这不应该成为人们采用Hadoop以及其它开源技术的阻碍。大多数人都知道,当新的技术被创造出来并争夺用户时,它们对外界而言是很陌生的。只有当一个特定类型的软件成为某个规范的成熟而标准的一部分,才会开始出现大量熟练使用它的人,而即使如此仍然会存在技能缺口。只有当我们不再对技术栈做大的改进时,才会消除这种缺口,不过Doug不认为我们会希望这样做。简而言之,技能缺口是影响平台变革速度的主要因素之一,也是即将来临的创新的标志。在未来的几年内,开源生态系统将继续扩大,也会不断地在有实际意义的项目里实施。它汇聚了今天最聪明的头脑,在通力合作下,以十年前不可能的速度推进软件开发。如果你想改善现有技术,或者想支持打破传统的观念,可以加入这里。Doug鼓励每个人都有兴趣参与进来,也鼓励经验丰富的人因为这个原因继续坚持下去。
使用 APT-mirror 四步配置 Ubuntu 本地软件仓库 介绍APT-Mirror 你可以使用多种工具在你的本地个人电脑或服务器中配置一个 Ubuntu 的本地软件仓库,但在本教程中,我们将为你介绍 APT-Mirror。这里,我们将把默认的镜像包镜像到我们本地的服务器或个人电脑中,并且在你的本地或外置硬盘中,我们至少需要 120 GB 或更多的可用空间才行。 我们可以通过配置一个 HTTP 或 FTP 服务器来与本地系统客户端共享这个软件仓库。我们需要安装 Apache 网络服务器和 APT-Mirror 来使得我们的工作得以开始。下面是配置一个可工作的本地软件仓库的步骤: 1. 安装需要的软件包 我们需要从 Ubuntu 的公共软件包仓库中取得所有的软件包,然后在我们本地的 Ubuntu 服务器硬盘中保存它们。 首先我们安装一个Web 服务器来承载我们的本地软件仓库。这里我们将安装 Apache Web 服务器,但你可以安装任何你中意的 Web 服务器。对于 http 协议,Web 服务器是必须的。假如你需要配置 ftp 协议 及 rsync 协议,你还可以再分别额外安装 FTP 服务器,如 proftpd, vsftpd 等等 和 Rsync 。 1.$ sudo apt-get install apache2 然后我们需要安装 apt-mirror: 1.$ sudo apt-get install apt-mirror2. 配置 APT-Mirror 现在,在你的硬盘上创建一个目录来保存所有的软件包。例如,我们创建一个名为 /linoxide的目录,我们将在这个目录中保存所有的软件包: 1. $ sudo mkdir /linoxide 现在,打开文件 /etc/apt/mirror.list : 1. $ sudo nano /etc/apt/mirror.list 复制下面的命令行配置到 mirror.list文件中并按照你的需求进行修改: 1.############# config ##################2.#3.set base_path /linoxide4.#5.# set mirror_path $base_path/mirror6.# set skel_path $base_path/skel7.# set var_path $base_path/var8.# set cleanscript $var_path/clean.sh9.# set defaultarch10.# set postmirror_script $var_path/postmirror.sh11.# set run_postmirror 012.set nthreads 2013.set _tilde 014.#15.############# end config ##############16. 17.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty main restricted universe multiverse18.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-security main restricted universe multiverse19.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-updates main restricted universe multiverse20.#deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-proposed main restricted universe multiverse21.#deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-backports main restricted universe multiverse22. 23.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty main restricted universe multiverse24.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-security main restricted universe multiverse25.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-updates main restricted universe multiverse26.#deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-proposed main restricted universe multiverse27.#deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-backports main restricted universe multiverse28. 29.clean http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2F&urlrefer=b4ab0bdb7f8ab972bfb04ded58e516b6 这里,我们将要镜像最新和最大的 Ubuntu LTS 发行版 --- 即 Ubuntu 14.04 LTS (Trusty Tahr) --- 的软件包仓库,所以在上面的配置中发行版本号为 trusty 。假如我们需要镜像 Saucy 或其他的 Ubuntu 发行版本,请修改上面的 trusy 为相应的代号。 现在,我们必须运行 apt-mirror 来下载或镜像官方仓库中的所有软件包。如果有看不懂的地方,欢迎访问原贴www地址linuxprobe.com。每天更新大量开源新闻! 1.sudo apt-mirror 从 Ubuntu 服务器中下载所有的软件包所花费的时间取决于你和镜像服务器之间的网络连接速率和性能。这里我中断了下载,因为我已经下载好了 ...3.配置网络服务器 为了使得其他的电脑能够访问这个软件仓库,你需要一个Web服务器。你也可以通过 ftp 来完成这件事,但我选择使用一个Web服务器因为在上面的步骤 1 中我提及到使用Web服务器。因此,我们现在要对 Apache 服务器进行配置: 我们将为我们本地的软件仓库目录 建立一个到 Apache 托管目录 --- 即 /var/www/ubuntu --- 的符号链接。 1.$ sudo ln -s /linoxide /var/www/ubuntu2.$ sudo service apache2 start 上面的命令将允许我们从本地主机(localhost) --- 即 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F127.0.0.1&urlrefer=1a077a0f8e53746bb29f9f47308f5ac7(默认情况下) --- 浏览我们的镜像软件仓库。 4. 配置客户端 最后,我们需要在其他的电脑中添加软件源,来使得它们可以从我们的电脑中取得软件包或软件仓库。为达到此目的,我们需要编辑 /etc/apt/sources.list 文件并添加下面的命令: 1.$ sudo nano /etc/apt/sources.list 添加下面的一行到/etc/apt/sources.list中并保存。 1.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F192.168.0.100%2Fubuntu%2F&urlrefer=8b6d13c94f80cc347a3702f660166e0b trusty main restricted universe 注: 这里的 192.168.0.100 是我们的服务器电脑的局域网 IP 地址,你需要替换为你的服务器电脑的局域网 IP 地址 1.$ sudo apt-get update 最终,我们完成了任务。现在,你可以使用sudo apt-get install packagename 命令来从你的本地 Ubuntu 软件仓库中安装所需的软件包,这将会是高速的且消耗很少的带宽。
关于Fedora 24 的 `dnf update`这个小故障 之前,Fedora项目组的Adam Williamson发布一则服务公(PSA),提醒 Fedora 社区在内部更新过程中出现了严重问题! 许多 Fedora 24 的用户报告称,从 4 日起,当他们在桌面中运行dnf update命令,通过官方软件仓库更新软件时会遇到 “duplicated packages” 和 “kernel updates not working” 等错误。 经过一些调查,Williamson 得出结论在dnf update过程中存在一个 bug,会导致图形界面,比如 GNOME 或 KDE,甚至整个 X Window 系统(X11)崩溃,但是这与用户的硬件配置和安装的软件有关。“当崩溃发生时,更新进程会被杀死以至于不能完整结束,这就是为什么会得到 ‘duplicated packages’ 或其它的奇怪错误的原因”,Adam Williamson 说,“我在努力和报告者配合调查原因,希望能够解决它,但是,此刻,不要在桌面里面运行 dnf update!” 如果有不懂的地方,欢迎访问原贴www地址linuxprobe.com 每天更新大量开源新闻 所以,如果你正在使用 Fedora 24 操作系统,当你在使用 KDE、GNOME、Xfce 等桌面环境时,千万不要执行 dnf update 命令。你可以通过按下 Ctrl+Alt+F3 切换到文本模式来执行它,或者使用离线更新系统。 截止到现在,该 bug 仍无修复完成的通知。
使用 APT-mirror 四步配置 Ubuntu 本地软件仓库 介绍APT-Mirror 你可以使用多种工具在你的本地个人电脑或服务器中配置一个 Ubuntu 的本地软件仓库,但在本教程中,我们将为你介绍 APT-Mirror。这里,我们将把默认的镜像包镜像到我们本地的服务器或个人电脑中,并且在你的本地或外置硬盘中,我们至少需要 120 GB 或更多的可用空间才行。 我们可以通过配置一个 HTTP 或 FTP 服务器来与本地系统客户端共享这个软件仓库。我们需要安装 Apache 网络服务器和 APT-Mirror 来使得我们的工作得以开始。下面是配置一个可工作的本地软件仓库的步骤: 1. 安装需要的软件包 我们需要从 Ubuntu 的公共软件包仓库中取得所有的软件包,然后在我们本地的 Ubuntu 服务器硬盘中保存它们。 首先我们安装一个Web 服务器来承载我们的本地软件仓库。这里我们将安装 Apache Web 服务器,但你可以安装任何你中意的 Web 服务器。对于 http 协议,Web 服务器是必须的。假如你需要配置 ftp 协议 及 rsync 协议,你还可以再分别额外安装 FTP 服务器,如 proftpd, vsftpd 等等 和 Rsync 。 1.$ sudo apt-get install apache2 然后我们需要安装 apt-mirror: 1.$ sudo apt-get install apt-mirror2. 配置 APT-Mirror 现在,在你的硬盘上创建一个目录来保存所有的软件包。例如,我们创建一个名为 /linoxide的目录,我们将在这个目录中保存所有的软件包: 1. $ sudo mkdir /linoxide 现在,打开文件 /etc/apt/mirror.list : 1. $ sudo nano /etc/apt/mirror.list 复制下面的命令行配置到 mirror.list文件中并按照你的需求进行修改: 1.############# config ##################2.#3.set base_path /linoxide4.#5.# set mirror_path $base_path/mirror6.# set skel_path $base_path/skel7.# set var_path $base_path/var8.# set cleanscript $var_path/clean.sh9.# set defaultarch10.# set postmirror_script $var_path/postmirror.sh11.# set run_postmirror 012.set nthreads 2013.set _tilde 014.#15.############# end config ##############16. 17.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty main restricted universe multiverse18.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-security main restricted universe multiverse19.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-updates main restricted universe multiverse20.#deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-proposed main restricted universe multiverse21.#deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-backports main restricted universe multiverse22. 23.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty main restricted universe multiverse24.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-security main restricted universe multiverse25.deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-updates main restricted universe multiverse26.#deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-proposed main restricted universe multiverse27.#deb-src http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu&urlrefer=5294f5c5e87d524162c6f318a004a0c0 trusty-backports main restricted universe multiverse28. 29.clean http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Farchive.ubuntu.com%2F&urlrefer=b4ab0bdb7f8ab972bfb04ded58e516b6 这里,我们将要镜像最新和最大的 Ubuntu LTS 发行版 --- 即 Ubuntu 14.04 LTS (Trusty Tahr) --- 的软件包仓库,所以在上面的配置中发行版本号为 trusty 。假如我们需要镜像 Saucy 或其他的 Ubuntu 发行版本,请修改上面的 trusy 为相应的代号。 现在,我们必须运行 apt-mirror 来下载或镜像官方仓库中的所有软件包。 1.sudo apt-mirror 从 Ubuntu 服务器中下载所有的软件包所花费的时间取决于你和镜像服务器之间的网络连接速率和性能。这里我中断了下载,因为我已经下载好了 ...3.配置网络服务器 如果有看不懂或者看不清楚的地方,欢迎访问原贴www地址linuxprobe.com,每天更新大量开源新闻! 为了使得其他的电脑能够访问这个软件仓库,你需要一个Web服务器。你也可以通过 ftp 来完成这件事,但我选择使用一个Web服务器因为在上面的步骤 1 中我提及到使用Web服务器。因此,我们现在要对 Apache 服务器进行配置: 我们将为我们本地的软件仓库目录 建立一个到 Apache 托管目录 --- 即 /var/www/ubuntu --- 的符号链接。 1.$ sudo ln -s /linoxide /var/www/ubuntu2.$ sudo service apache2 start 上面的命令将允许我们从本地主机(localhost) --- 即 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F127.0.0.1&urlrefer=1a077a0f8e53746bb29f9f47308f5ac7(默认情况下) --- 浏览我们的镜像软件仓库。 4. 配置客户端 最后,我们需要在其他的电脑中添加软件源,来使得它们可以从我们的电脑中取得软件包或软件仓库。为达到此目的,我们需要编辑 /etc/apt/sources.list 文件并添加下面的命令: 1.$ sudo nano /etc/apt/sources.list 添加下面的一行到/etc/apt/sources.list中并保存。 1.deb http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F192.168.0.100%2Fubuntu%2F&urlrefer=8b6d13c94f80cc347a3702f660166e0b trusty main restricted universe 注: 这里的 192.168.0.100 是我们的服务器电脑的局域网 IP 地址,你需要替换为你的服务器电脑的局域网 IP 地址 1.$ sudo apt-get update 最终,我们完成了任务。现在,你可以使用sudo apt-get install packagename 命令来从你的本地 Ubuntu 软件仓库中安装所需的软件包,这将会是高速的且消耗很少的带宽。
Redhat 7使用CentOS 7的Yum网络源 在学习“第1章 部署虚拟环境安装linux系统—Yum软件仓库”有介绍yum网络源,所以决定尝试一下CentOS的网络源,这样在安装依赖包时就会方便很多,由于redhat 的更新包只对注册的用户生效,所以需要自己手动更改成CentOS 的更新包,CentOS几乎和redhat是一样的,所以无需担心软件包是否可安装,安装之后是否有问题,另外CentOS公司去年已经被Redhat 收购了,下面是安装步骤。 1、首先查看redhat 7.0系统本身所安装的那些yum 软件包: [root@linuxprobe ~]# rpm -qa | grep yumyum-utils-1.1.31-24.el7.noarchyum-langpacks-0.4.2-3.el7.noarchyum-metadata-parser-1.1.4-10.el7.x86_64yum-rhn-plugin-2.0.1-4.el7.noarchPackageKit-yum-0.8.9-11.el7.x86_64yum-3.4.3-118.el7.noarch 2、卸载这些软件包; [root@linuxprobe ~]# rpm -e yum-3.4.3-118.el7.noarch --nodeps[root@linuxprobe ~]# rpm -e yum-utils-1.1.31-24.el7.noarch --nodeps[root@linuxprobe ~]# rpm -e yum-rhn-plugin-2.0.1-4.el7.noarch --nodeps[root@linuxprobe ~]# rpm -e yum-metadata-parser-1.1.4-10.el7.x86_64 --nodeps[root@linuxprobe ~]# rpm -e yum-langpacks-0.4.2-3.el7.noarch --nodeps[root@linuxprobe ~]# rpm -e PackageKit-yum-0.8.9-11.el7.x86_64 --nodeps 3、保证本机电脑能上网; [root@linuxprobe ~]# ping http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com&urlrefer=d04a537000146ae20785a6d0d3533551PING http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.a.shifen.com&urlrefer=9708cf925917492fd8a1ec7f8b90b2a6 (61.135.169.121) 56(84) bytes of data.64 bytes from 61.135.169.121: icmp_seq=1 ttl=53 time=31.8 ms64 bytes from 61.135.169.121: icmp_seq=2 ttl=53 time=31.9 ms64 bytes from 61.135.169.121: icmp_seq=3 ttl=53 time=32.0 ms 4、进入以下网站上面查看软件包的版本是否升级或者找到自己系统所对应的文件包版本更新; 网易163网络源地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2F&urlrefer=e51a121d5018265fb755185a09eb7077CentOS网络源地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fcentos.ustc.edu.cn%2Fcentos%2F&urlrefer=10308d8e91fb8199210b23dbd1678e2f 5、找到自己所需要的版本下载: [root@Linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-3.4.3-118.el7.centos.noarch.rpm&urlrefer=124768944121a123bf04659307902ad8--2016-01-17 20:43:15-- http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-3.4.3-118.el7.centos.noarch.rpm&urlrefer=124768944121a123bf04659307902ad8Resolving mirrors.163.com (mirrors.163.com)... 123.58.173.185, 123.58.173.186Connecting to mirrors.163.com (mirrors.163.com)|123.58.173.185|:80... connected.HTTP request sent, awaiting response... 404 Not Found2016-01-17 20:43:15 ERROR 404: Not Found. //如果找不到,是安装包更新了,你可以到这个网站http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2F&urlrefer=6da81c2ae86ef482baeade2a090b99f8复制下载链接,然后再下载下来;[root@linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-3.4.3-132.el7.centos.0.1.noarch.rpm&urlrefer=b23eaabc541996558b1e4ac003b88587[root@linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-metadata-parser-1.1.4-10.el7.x86_64.rpm&urlrefer=31633b83b79e1a6e33758ec57a11d87c[root@linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-utils-1.1.31-34.el7.noarch.rpm&urlrefer=19cd8f8240ca4559f120ce183c06b442 [root@linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-updateonboot-1.1.31-34.el7.noarch.rpm&urlrefer=04a5eed7df7687a6abf0c41ae77e4591[root@linuxprobe ~]# wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2Fx86_64%2FPackages%2Fyum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm&urlrefer=2fe741898e00c48bc0f9d2d18c1fb0376、查看下载完成结果; 如果有看不懂或者看不清楚的地方,欢迎访问原贴www地址linuxprobe.com.每天更新大量开源新闻 [root@linuxprobe ~]# lsyum-3.4.3-132.el7.centos.0.1.noarch.rpmyum-metadata-parser-1.1.4-10.el7.x86_64.rpmyum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpmyum-updateonboot-1.1.31-34.el7.noarch.rpmyum-utils-1.1.31-34.el7.noarch.rpm 7、安装软件包: [root@Linuxprobe ~]# rpm -ivh yum-*warning: yum-3.4.3-132.el7.centos.0.1.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYPreparing... ################################# [100%]Updating / installing...1:yum-metadata-parser-1.1.4-10.el7 ################################# [ 20%]2:yum-plugin-fastestmirror-1.1.31-3 ################################# [ 40%]3:yum-3.4.3-132.el7.centos.0.1 ################################# [ 60%]4:yum-updateonboot-1.1.31-34.el7 ################################# [ 80%]5:yum-utils-1.1.31-34.el7 ################################# [100%] 8、新建repo 配置文件; [root@linuxprobe ~]# vim /etc/yum.repos.d/CentOS-Base.repo#CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update status of each mirror to pick mirrors that are updated to and# geographically close to the client. You should use this for CentOS updates# unless you are manually picking other mirrors.## If the mirrorlist= does not work for you, as a fall back you can try the# remarked out baseurl= line instead.##[base]name=CentOS-$7 - Base - 163.com#mirrorlist=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrorlist.centos.org%2F%3Frelease%3D%247%26arch%3D%24basearch%26repo%3Dos&urlrefer=ad8eb60db4b8d721597b21cdc31a17afbaseurl=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fos%2F%24basearch%2F&urlrefer=711d99d2a1af2bbbdee33039fbf4a425gpgcheck=1gpgkey=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2FRPM-GPG-KEY-CentOS-7&urlrefer=5dd9815b2e87ffc238815c4a0bf176cc#released updates[updates]name=CentOS-$7 - Updates - 163.com#mirrorlist=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrorlist.centos.org%2F%3Frelease%3D%247%26arch%3D%24basearch%26repo%3Dupdates&urlrefer=e8f9963c3afdf675099e1b4cd994b0a8baseurl=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fupdates%2F%24basearch%2F&urlrefer=54cc0beb7493acc1b40476c91e2f83d4gpgcheck=1gpgkey=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2FRPM-GPG-KEY-CentOS-7&urlrefer=5dd9815b2e87ffc238815c4a0bf176cc#additional packages that may be useful[extras]name=CentOS-$7 - Extras - 163.com#mirrorlist=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrorlist.centos.org%2F%3Frelease%3D%247%26arch%3D%24basearch%26repo%3Dextras&urlrefer=470c5a7e8df37d0d68db820e9c9112cbbaseurl=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fextras%2F%24basearch%2F&urlrefer=2d991f7e5b2deeaa091b83d624c40bf0gpgcheck=1gpgkey=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2FRPM-GPG-KEY-CentOS-7&urlrefer=5dd9815b2e87ffc238815c4a0bf176cc#additional packages that extend functionality of existing packages[centosplus]name=CentOS-$7 - Plus - 163.combaseurl=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2F7%2Fcentosplus%2F%24basearch%2F&urlrefer=3670863c618f3f2b5e7728363789356fgpgcheck=1enabled=0gpgkey=http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.163.com%2Fcentos%2FRPM-GPG-KEY-CentOS-7&urlrefer=5dd9815b2e87ffc238815c4a0bf176cc 9、至此YUM 网络源已经安装完成; [root@linuxprobe ~]# yum clean all 10、测试安装是否正常; [root@Linuxprobe ~]# yum -y install lftpLoaded plugins: fastestmirror, product-id, subscription-managerThis system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.Loading mirror speeds from cached hostfileResolving Dependencies--> Running transaction check---> Package lftp.x86_64 0:4.4.8-7.el7 will be installed--> Finished Dependency ResolutionDependencies Resolved================================================================================================Package Arch Version Repository Size================================================================================================Installing:lftp x86_64 4.4.8-7.el7 base 750 kTransaction Summary================================================================================================Install 1 Package………………省略部分安装过程………………Installed:lftp.x86_64 0:4.4.8-7.el7Complete! 到这里安装完成,以后安装所需包,可以不用本地yum源了,直接使用网络yum源。
【17-01-21】 【分享】怎样在 CentOS 里下载 RPM 包及其所有依赖 你必须去花一些时间而且手动的去寻找和下载被安装的软件所依赖的软件包。然而,我们并不是必须这样。在这个简短的教程中,我将会带领你以两种方式下载软件包及其所有依赖包。我已经在 CentOS 7 下进行了测试,不过这些相同的步骤或许在其他基于 RPM 管理系统的发行版上也可以工作,例如 RHEL,Fedora 和 Scientific Linux。 方法1 利用 Downloadonly 插件下载 RPM 软件包及其所有依赖包 我们可以通过 yum 命令的 Downloadonly 插件下载 RPM 软件包及其所有依赖包。 为了安装 Downloadonly 插件,以 root 身份运行以下命令。 yum install yum-plugin-downloadonly 现在,运行以下命令去下载一个 RPM 软件包。 yum install --downloadonly <package-name> 默认情况下,这个命令将会下载并把软件包保存到 /var/cache/yum/ 的 rhel-{arch}-channel/packageslocation 目录,不过,你也可以下载和保存软件包到任何位置,你可以通过 –downloaddir 选项来指定。 yum install --downloadonly --downloaddir=<directory> <package-name> 例子: yum install --downloadonly --downloaddir=/root/mypackages/ httpd 终端输出: Loaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: centos.excellmedia.net * epel: epel.mirror.angkasa.id * extras: centos.excellmedia.net * updates: centos.excellmedia.netResolving Dependencies--> Running transaction check---> Package httpd.x86_64 0:2.4.6-40.el7.centos.4 will be installed--> Processing Dependency: httpd-tools = 2.4.6-40.el7.centos.4 for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Running transaction check---> Package apr.x86_64 0:1.4.8-3.el7 will be installed---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.4 will be installed---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed--> Finished Dependency ResolutionDependencies Resolved======================================================================================================================================= Package Arch Version Repository Size=======================================================================================================================================Installing: httpd x86_64 2.4.6-40.el7.centos.4 updates 2.7 MInstalling for dependencies: apr x86_64 1.4.8-3.el7 base 103 k apr-util x86_64 1.5.2-6.el7 base 92 k httpd-tools x86_64 2.4.6-40.el7.centos.4 updates 83 k mailcap noarch 2.1.41-2.el7 base 31 kTransaction Summary=======================================================================================================================================Install 1 Package (+4 Dependent packages)Total download size: 3.0 MInstalled size: 10 MBackground downloading packages, then exiting:(1/5): apr-1.4.8-3.el7.x86_64.rpm | 103 kB 00:00:01 (2/5): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00:01 (3/5): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00:01 (4/5): httpd-tools-2.4.6-40.el7.centos.4.x86_64.rpm | 83 kB 00:00:01 (5/5): httpd-2.4.6-40.el7.centos.4.x86_64.rpm | 2.7 MB 00:00:09 ---------------------------------------------------------------------------------------------------------------------------------------Total 331 kB/s | 3.0 MB 00:00:09 exiting because "Download Only" specified现在去你指定的目录位置下,你将会看到那里有下载好的软件包和依赖的软件。在我这种情况下,我已经把软件包下载到 /root/mypackages/ 目录下。让我们来查看一下内容: ls /root/mypackages/ 样本输出: apr-1.4.8-3.el7.x86_64.rpmapr-util-1.5.2-6.el7.x86_64.rpmhttpd-2.4.6-40.el7.centos.4.x86_64.rpmhttpd-tools-2.4.6-40.el7.centos.4.x86_64.rpmmailcap-2.1.41-2.el7.noarch.rpm正如你在上面输出所看到的, httpd软件包已经被依据所有依赖性下载完成了 。 请注意,这个插件适用于 yum install/yum update, 但是并不适用于 yum groupinstall 。默认情况下,这个插件将会下载仓库中最新可用的软件包。然而你可以通过指定版本号来下载某个特定的软件版本。 例子: yum install --downloadonly --downloaddir=/root/mypackages/ httpd-2.2.6-40.el7 此外,你也可以如下一次性下载多个包: yum install --downloadonly --downloaddir=/root/mypackages/ httpd vsftpd方法 2使用 Yumdownloader 工具来下载 RPM 软件包及其所有依赖包 如果有看不明白的地方可以访问原贴http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.&urlrefer=19c3f00dedb8a97ed1b747095f9eafed地址linuxprobe.com. Yumdownloader是一款简单,但是却十分有用的命令行工具,它可以一次性下载任何 RPM 软件包及其所有依赖包。 以 root 身份运行如下命令安装 Yumdownloader 工具。 yum install yum-utils 一旦安装完成,运行如下命令去下载一个软件包,例如 httpd。 yumdownloader httpd 为了根据所有依赖性下载软件包,我们使用 --resolve参数: yumdownloader --resolve httpd 默认情况下,Yumdownloader 将会下载软件包到当前工作目录下。 为了将软件下载到一个特定的目录下,我们使用 --destdir 参数: yumdownloader --resolve --destdir=/root/mypackages/ httpd 或者, yumdownloader --resolve --destdir /root/mypackages/ httpd 终端输出: Loaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: centos.excellmedia.net * epel: epel.mirror.angkasa.id * extras: centos.excellmedia.net * updates: centos.excellmedia.net--> Running transaction check---> Package httpd.x86_64 0:2.4.6-40.el7.centos.4 will be installed--> Processing Dependency: httpd-tools = 2.4.6-40.el7.centos.4 for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64--> Running transaction check---> Package apr.x86_64 0:1.4.8-3.el7 will be installed---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.4 will be installed---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed--> Finished Dependency Resolution(1/5): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00:01 (2/5): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00:02 (3/5): apr-1.4.8-3.el7.x86_64.rpm | 103 kB 00:00:02 (4/5): httpd-tools-2.4.6-40.el7.centos.4.x86_64.rpm | 83 kB 00:00:03 (5/5): httpd-2.4.6-40.el7.centos.4.x86_64.rpm | 2.7 MB 00:00:19让我们确认一下软件包是否被下载到我们指定的目录下。 ls /root/mypackages/ 终端输出: apr-1.4.8-3.el7.x86_64.rpmapr-util-1.5.2-6.el7.x86_64.rpmhttpd-2.4.6-40.el7.centos.4.x86_64.rpmhttpd-tools-2.4.6-40.el7.centos.4.x86_64.rpmmailcap-2.1.41-2.el7.noarch.rpm不像 Downloadonly 插件,Yumdownload 可以下载一组相关的软件包。 yumdownloader "@Development Tools" --resolve --destdir /root/mypackages/ 在我看来,我喜欢 Yumdownloader 更胜于 Yum 的 Downloadonly 插件。但是,两者都是十分简单易懂而且可以完成相同的工作。
Centos7上使用官方YUM源安装Mysql 1. 下载mysql的repo源 $ wget http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Frepo.mysql.com%2Fmysql-community-release-el7-5.noarch.rpm&urlrefer=36f27763c775f5898c58d141bc696fcd 2. 安装mysql-community-release-el7-5.noarch.rpm包 $ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm安装这个包后,会获得两个mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo/etc/yum.repos.d/mysql-community-source.repo 3. 安装mysql $ sudo yum install mysql-server 根据步骤安装就可以了,不过安装完成后,没有密码,需要重置密码。在《linux就该这么学》这本书里有详细的步骤。 4. 重置密码 重置密码前,首先要登录 $ mysql -u root登录时有可能报这样的错:ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2),原因是/var/lib/mysql的访问权限问题。下面的命令把/var/lib/mysql的拥有者改为当前用户:$ sudo chown -R openscanner:openscanner /var/lib/mysql然后,重启服务:$ service mysqld restart接下来登录重置密码:$ mysql -u rootmysql > use mysql;mysql > update user set password=password(‘123456‘) where user=‘root‘;mysql > exit; 5. 开放3306端口 $ sudo vim /etc/sysconfig/iptables添加以下内容:-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT保存后重启防火墙:$ sudo service iptables restart 这样从其它客户机也可以连接上mysql服务了。
1
下一页