Monthly Archives: 五月 2017

五月 30th, 2017

为什么要写这个教程呢?

主要是为了解决把网站部署在虚拟主机上的人,因为你根本不能去配置虚拟主机 所以,用下面的方法,可以实现不配置IIS而使老版本IIS运行MVC。

 

 

首先,给大家推荐2个MVC的学习好去处:

1、重典MVC视频教程:http://www.youku.com/playlist_show/id_2416830.html

2、微软官方MVC教程:http://www.asp.net/mvc/learn(英文,但是…我这样没过4级的都可以轻易看懂了…)

看本文的人必须要有MVC基础,所以很多名词我就不解释了

在老版本的IIS中架设MVC有1个条件:必须安装 Framwork 3.5,SP1不是必须的。所以如果你的虚拟主机是2.0的,那就免谈了。现在市面上一般都升级到3.5了

如果你不具备这个最简单的条件,那你的服务器也就根本不能使用MVC架构的网站了

好了,接下来介绍下我们要做的几个步骤

1、复制几个缺失的运行库到bin文件夹

老版本不能运行主要原因当然是因为缺失dll文件啦,其中最重要的是mvc核心库

前三个在C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 2中

System.Web.Mvc.dll

System.Web.Mvc.xml

Microsoft.Web.Mvc.Build.dll

下面2个是 3.5 sp1的动态链接库,去有sp1的电脑上复制下就可以了

System.Web.Routing.dll

System.Web.Abstractions.dll

2、在根目录新建Default.aspx页面,并在后台写入代码

老版本IIS会验证文件是否存在,所以必须新建一个页面,然后在写上代码就可以了

 

复制代码
1 public partial class _Default : Page
2 {
3 public void Page_Load(object sender, System.EventArgs e)
4 {
5 HttpContext.Current.RewritePath(Request.ApplicationPath);
6 IHttpHandler httpHandler = new MvcHttpHandler();
7 httpHandler.ProcessRequest(HttpContext.Current);
8 }
9 }
10
复制代码

 

3、设置Route路由表

为了充分利用mvc的新特性,强烈建议你在建设网站的时候全部采用 controller[/action][/id].aspx 这样的形式

有方括号代表可省略,但是不能只省略action而不省略id(其实可以实现,但是有限制和注意点,我这里先介绍基本的)

主参数就是id,如果有多个 http参数,就需要用显示GET传送了

controller/action/id.aspx?page=1

下面就是Global.asax文件里的Route设置

 

//默认匹配
routes.MapRoute(“NoAction”, “{controller}.aspx”, new { controller = “home”, action = “index”, id = “” });//无Action的匹配
routes.MapRoute(“NoID”, “{controller}/{action}.aspx”, new { controller = “home”, action = “index”, id = “” });//无ID的匹配
routes.MapRoute(“Default”, “{controller}/{action}/{id}.aspx”, new { controller = “home”, action = “index”, id = “” });//默认匹配
routes.MapRoute(“Root”, “”, new { controller = “home”, action = “index”, id = “” });//根目录匹配

 

这样配置后,别人访问你的网站还是想以前的asp.net一样,全部是以aspx为后缀名。

这样配置后你的虚拟主机也就不会出问题了

OK,3个步骤完成后把你的网站发布到虚拟空间吧!一般不会有问题

本网站就是用MVC架构的,下面给个下载地址,是Default文件和那5个库文件

注意一下,自己更改下Default.aspx和Default.aspx.cs文件里的命名空间,其实不改也不会出问题

TAGS:
五月 29th, 2017

Win10是现在十分热门的系统,因此很多用户都会装上它,但是不少用户装上它之后想要进行更新却失败了,那么当你遇到Win10更新失败怎么办?不知道的朋友赶紧看看小编整理的Win10更新失败的解决方法吧!

去微软反馈似乎没能得到解决,请看图:

解决方法:

1、点击Cortana(或叫做搜索)。

2、输入“控制面板”,并点击【疑难解答】。

【备注:如果没有疑难解答这一项目,你可以点击控制面板,在弹出的页面找到疑难解答就可以了。】

3、在弹出的页面中点击【使用“Windows更新”解决问题】。

4、弹出疑难解答后,请以管理员身份运行。(操作方法:弹出疑难解答时,点击【高级】,再点击【以管理员身份运行】即可。)

5、又弹出疑难解答(这时就是以管理员身份运行的)点击【下一步】,显示正在检测问题。

6、发现错误!竟然是WU损坏,需要重新下载,但如果您是2G/3G/4G移动网络,建议不要下载,请连接WIFI或宽带在进行下载。

7、点击【应用此修复程序】,再等待一会儿。

8、成功解决问题!回到Windows更新点击【检测更新】(或者叫做【重试】)。我的已经重新开始下载安装了!

Win10更新失败的解决方法就讲到这里了,方法很简单,我们只需要以管理员的身份运行疑难解答,之后让其检测系统问题,最后进行修复即可。

TAGS: ,
五月 29th, 2017

公有云带来的优势正在不断吸引企业的注意力,近几年公有云的采用也在不断增长。但是在公有云的大趋势之内,企业还有一个可供选择的部署模式:虚拟私有云(VPC)。

除了私有云,企业还可以试试虚拟私有云(VPC)

Gartner副总裁兼分析师Neil MacDonald表示,私有云的愿景是为企业提供内部的云服务。虚拟私有云也是类似的情况,虚拟私有云计算(VPC)之于公有云计算有如虚拟私有网络(Virtual Private Network, VPN)之于公共网络。他说:“虚拟私有月并不是一个真正的私有云,而是公有资源仅供个人使用。”

以AWS、Google和Azure为代表的云计算巨头已经获得了公有云中的利润和主导地位,同时也提供了虚拟私有云和虚拟专用网络的产品选择。但是在选择部署虚拟私有云之前,了解并权衡虚拟私有云与本地私有云之间的差异性非常重要。

虚拟私有云的优势

除了更独立的性质之外,虚拟私有云可以将公有云定位为数据中心的扩展。企业可以利用其现有的网络和安全工具来支持部署虚拟私有云,这意味着他们在享受公有云的优势的同事,而不会发生任何根本的变化。

Forrester Research的首席分析师兼私人基础设施即服务云主管Lauren E. Nelson表示,其他一些虚拟私有云的利益和用例如下:

扩展灾难恢复策略,以更好地缩短恢复时间和恢复效果

  • 符合合规性的要求
  • 消除老旧的外包基础设施
  • 谨慎地实现云迁移,可以把虚拟私有云视为公有云的一半
  • 消除构建本地私有云的复杂性

虚拟私有云 VS 本地私有云

企业选择虚拟私有云而不是构建本地私有云的原因是从头开始构建私有云将会非常困难。Nelson表示:“我们最新的调查数据显示,82%的企业拥有1000名甚至更多的员工,他们试图建立一个私有云,在自助服务、自动化配置和跟踪和监控等领域缩短差距。”

本地私有云的成本和有效性也不尽相同,一些构建私有云的工具和标准虚拟机管理程序基本上都是廉价的云,花费数百万美元构建私有云价值并不高。

混合云的角色

其他用户将虚拟私有云视为云计算和本地计算相结合的一种方式,StorageIO在Stillwater的高级顾问分析师格Greg Schulz表示:“混合云逐渐普及,逐渐覆盖到计算、存储和网络领域。大多数云服务提供商都愿意与公有云共同实现混合云模式,而AWS则更倾向于实现虚拟私有云。”

虚拟私有云可以完全在AWS内,或者组织也可以将私有的本地资源与公有云连接,以实现混合部署。另一个变化是混合云和虚拟私有云,用于跨云或跨不同提供商实现连接

五月 29th, 2017

网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。
mysql> show global status;
可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:
mysql> show variables;
一、慢查询
  mysql> show variables like ‘%slow%’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| log_slow_queries | ON |
| slow_launch_time | 2 |
+——————+——-+
mysql> show global status like ‘%slow%’;
+———————+——-+
| Variable_name | Value |
+———————+——-+
| Slow_launch_threads | 0 |
| Slow_queries | 4148 |
+———————+——-+

配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间不宜设置过长,否则意义不大,最好在5秒以内,如果你需要微秒级别的慢查询,可以考虑给MySQL打补丁:http://www.percona.com/docs/wiki/release:start,记得找对应的版本。
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。
二、连接数
经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配 置文件中max_connections值过小:
mysql> show variables like ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 256 |
+—————–+——-+

这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:
mysql> show global status like ‘Max_used_connections’;
MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。
三、Key_buffer_size
  key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:
mysql> show variables like ‘key_buffer_size’;
+—————–+————+
| Variable_name | Value |
+—————–+————+
| key_buffer_size | 536870912 |
+—————–+————+

分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql> show global status like ‘key_read%’;
+————————+————-+
| Variable_name | Value | mysql
+————————+————-+
| Key_read_requests | 27813678764 |
| Key_reads | 6798830 |
+————————+————-+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT 了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在 0.01%以下的话,key_buffer_size分配的过多,可以适当减少。
MySQL服务器还提供了key_blocks_*参数:
mysql> show global status like ‘key_blocks_u%’;
+————————+————-+
| Variable_name | Value |
+————————+————-+
| Key_blocks_unused | 0 |
| Key_blocks_used | 413543 |
+————————+————-+

Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这 台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
四、临时表
  mysql> show global status like ‘created_tmp%’;
+————————-+———+
| Variable_name | Value |
+————————-+———+
| Created_tmp_disk_tables | 21197 |
| Created_tmp_files | 58 |
| Created_tmp_tables | 1771587 |
+————————-+———+

每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%,应该相当好了。我们再看一下MySQL服务器对临时表的配置:
mysql> show variables where Variable_name in (‘tmp_table_size’, ‘max_heap_table_size’);
+———————+———–+
| Variable_name | Value |
+———————+———–+
| max_heap_table_size | 268435456 |
| tmp_table_size | 536870912 |
+———————+———–+

只有256MB以下的临时表才能全部放内存,超过的就会用到硬盘临时表。
五、Open Table情况
mysql> show global status like ‘open%tables%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 919 |
| Opened_tables | 1951 |
+—————+——-+

Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:
mysql> show variables like ‘table_cache’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| table_cache | 2048 |
+—————+——-+
比较合适的值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95%
 六、进程使用情况
  mysql> show global status like ‘Thread%’;
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Threads_cached | 46 |
| Threads_connected | 2 |
| Threads_created | 570 |
| Threads_running | 1 |
+——————-+——-+

如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客 户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明 MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器 thread_cache_size配置:
mysql> show variables like ‘thread_cache_size’;
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| thread_cache_size | 64 |
+——————-+——-+

示例中的服务器还是挺健康的。
七、查询缓存(query cache)
  mysql> show global status like ‘qcache%’;
+————————-+———–+
| Variable_name | Value |
+————————-+———–+
| Qcache_free_blocks | 22756 |
| Qcache_free_memory | 76764704 |
| Qcache_hits | 213028692 |
| Qcache_inserts | 208894227 |
| Qcache_lowmem_prunes | 4010916 |
| Qcache_not_cached | 13385031 |
| Qcache_queries_in_cache | 43560 |
| Qcache_total_blocks | 111212 |
+————————-+———–+

MySQL查询缓存变量解释:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数 字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
我们再查询一下服务器关于query_cache的配置:
mysql> show variables like ‘query_cache%’;
+——————————+———–+
| Variable_name | Value |
+——————————+———–+
| query_cache_limit | 2097152 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 203423744 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |

+——————————+———–+
各字段的解释:
query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。
八、排序使用情况
  mysql> show global status like ‘sort%’;
+——————-+————+
| Variable_name | Value |
+——————-+————+
| Sort_merge_passes | 29 |
| Sort_range | 37432840 |
| Sort_rows | 9178691532 |
| Sort_scan | 1860569 |
+——————-+————+

Sort_merge_passes 包括两步。MySQL 首先会尝试在内存中做排序,使用的内存大小由系统变量 Sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,MySQL 就会把每次在内存中排序的结果存到临时文件中,等 MySQL 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 Sort_merge_passes。实际上,MySQL 会用另一个临时文件来存再次排序的结果,所以通常会看到 Sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size 会减少 Sort_merge_passes 和 创建临时文件的次数。但盲目的增加 Sort_buffer_size 并不一定能提高速度,
另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值对排序的操作也有一点的好处,
九、文件打开数(open_files)
  mysql> show global status like ‘open_files’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_files | 1410 |
+—————+——-+
mysql> show variables like ‘open_files_limit’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| open_files_limit | 4590 |
+——————+——-+

比较合适的设置:Open_files / open_files_limit * 100% <= 75%
十、表锁情况
  mysql> show global status like ‘table_locks%’;
+———————–+———–+
| Variable_name | Value |
+———————–+———–+
| Table_locks_immediate | 490206328 |
| Table_locks_waited | 2084912 |
+———————–+———–+

Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器 Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。
十一、表扫描情况
  mysql> show global status like ‘handler_read%’;
+———————–+————-+
| Variable_name | Value |
+———————–+————-+
| Handler_read_first | 5803750 |
| Handler_read_key | 6049319850 |
| Handler_read_next | 94440908210 |
| Handler_read_prev | 34822001724 |
| Handler_read_rnd | 405482605 |
| Handler_read_rnd_next | 18912877839 |
+———————–+————-+
mysql> show global status like ‘com_select’;
+—————+———–+
| Variable_name | Value |
+—————+———–+
| Com_select | 222693559 |
+—————+———–+

计算表扫描率:
表扫描率 = Handler_read_rnd_next / Com_select
如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。

TAGS:
五月 27th, 2017
yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y
1
2
3
[root@localhost ~]# grep -E '(vmx|svm)' /proc/cpuinfo 
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep
#如果没有内容则不支持
1
2
[root@localhost ~]# qemu-img create -f raw /opt/Centos-7.3-x86_64.raw 10G
Formatting '/opt/Centos-7.3-x86_64.raw'fmt=raw size=10737418240
1
2
systemctl enable libvirtd.service
service libvirtd start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# service libvirtd status
Redirecting to /bin/systemctl status  libvirtd.service
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2017-05-26 14:41:33 CST; 7min ago
     Docs: man:libvirtd(8)
           http://libvirt.org
 Main PID: 912 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           ├─ 912 /usr/sbin/libvirtd
           ├─2441 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr...
           └─2449 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr...
5月 26 14:41:24 localhost.localdomain systemd[1]: Starting Virtualization daemon...
5月 26 14:41:33 localhost.localdomain systemd[1]: Started Virtualization daemon.
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: started, version 2.66 cachesize 150
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DH...auth
5月 26 14:41:38 localhost.localdomain dnsmasq-dhcp[2441]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, leas... 1h
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: reading /etc/resolv.conf
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: using nameserver 192.168.106.2#53
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: read /etc/hosts - 2 addresses
5月 26 14:41:38 localhost.localdomain dnsmasq[2441]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
5月 26 14:41:38 localhost.localdomain dnsmasq-dhcp[2441]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
1
2
3
4
[root@localhost ~]# dd if=/dev/cdrom of=/opt/CentOs-7.3.iso
记录了8554496+0 的读入
记录了8554496+0 的写出
4379901952字节(4.4 GB)已复制,137.034 秒,32.0 MB/秒
1
2
3
4
5
6
7
[root@localhost ~]# virt-install --name CentOS-7.3-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOs-7.3.iso --disk path=/opt/Centos-7.3-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
创建域......                                                                                |    0 B  00:00:01     
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
[root@localhost ~]#

VNC连接:

wKioL1kn1_ejEcrDAACjz7KmkVw405.png

image

CentOS-7安装的时候让网卡名称默认变成eth0的方法:

按TAB键,后面加入:

net.ifnames=0 biosdevname=0

wKiom1kn3eXCycxhAAESBP0MgkM249.png

1
2
3
4
5
[root@localhost qemu]# virsh list --all                   
 Id    名称                         状态
----------------------------------------------------
 -     CentOS-7.3-x86_64              关闭
 -     CentOS-7.3-x86_64_1            关闭
1
2
[root@localhost qemu]# virsh start CentOS-7.3-x86_64_1
域 CentOS-7.3-x86_64_1 已开始
1
2
3
4
5
6
7
8
9
10
11
改CPU:
[root@localhost qemu]# pwd
/etc/libvirt/qemu
[root@localhost qemu]# virsh edit CentOS-7.3-x86_64_1 
<vcpu placement='auto' current="1">4</vcpu>
重启:
[root@localhost qemu]# virsh shutdown CentOS-7.3-x86_64_1
[root@localhost qemu]# virsh start CentOS-7.3-x86_64_1
[root@localhost qemu]# virsh setvcpus CentOS-7.3-x86_64_1 2 --live  #热添加或热减少
1
2
3
4
5
6
7
8
9
改内存:
virsh edit CentOS-7.3-x86_64_1 
<memory unit='KiB'>4048576</memory>
重启:
[root@localhost qemu]# virsh shutdown CentOS-7.3-x86_64_1
[root@localhost qemu]# virsh start CentOS-7.3-x86_64_1
virsh qemu-monitor-command  CentOS-7.3-x86_64_1 --hmp --cmd balloon 500  #热添加或热减少
TAGS: ,
五月 27th, 2017

Linux 用户可能经常遇到的一个问题是,机器有 16GB 内存之多,运行的进程也不多,但是剩下的 free 内存并不多,大部分都被 buff 和 cache 占用了(比如下面我的 PC)。

  1. $ free -h
  2. total used free shared buff/cache available
  3. Mem: 15G 6.4G 2.3G 1.1G 6.9G 7.7G
  4. Swap: 975M 268K 975M

虽然对于 Linux 的内存分配机制来说,这种被 buff 和 cache 占用的内存在系统需要时会及时释放出来,但是有时候我们想知道到底 cache 了些什么却没有一个好的办法。

前几天看到有个人用 go 写了个 pcstat,可以查看某个文件是否被缓存(作者的目的是数据库调优),也可以根据进程的 PID 来查看都缓存了哪些文件,不过该工具不能查看整个操作系统都 cache 了哪些文件。

因此,我基于 pcstat 写了个 hcache,增加了查看当前操作系统所 cache 的前若干个文件的特性,

使用方法比较简单:

  1. $ sudo hcache --top 10
  2. [sudo] password for silenceshell:
  3. +----------------------------------------------------------------------------------+----------------+------------+-----------+---------+
  4. | Name | Size (bytes) | Pages | Cached | Percent |
  5. |----------------------------------------------------------------------------------+----------------+------------+-----------+---------|
  6. | /opt/google/chrome/chrome | 114911208 | 28055 | 25457 | 090.740 |
  7. | /usr/share/code/code | 67688720 | 16526 | 12274 | 074.271 |
  8. | /home/silenceshell/Software/pycharm-community-2016.2/lib/pycharm.jar | 95177431 | 23237 | 11325 | 048.737 |
  9. | /opt/atom/atom | 62641344 | 15294 | 10578 | 069.164 |
  10. | /usr/bin/dockerd | 39121168 | 9552 | 7103 | 074.361 |
  11. | /home/silenceshell/Software/pycharm-community-2016.2/jre/jre/lib/amd64/libjfxwebkit.so | 57455824 | 14028 | 6625 | 047.227 |
  12. | /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2 | 36462184 | 8902 | 6316 | 070.950 |
  13. | /usr/lib/beyondcompare/BCompare | 30640160 | 7481 | 5505 | 073.586 |
  14. | /usr/bin/SecureCRT | 29524560 | 7209 | 4806 | 066.667 |
  15. | /usr/share/code/libnode.so | 21135976 | 5161 | 4588 | 088.898 |
  16. +---------------------------------------------------------------------

让我们来查看一下其中列出的一个文件:

  1. $ lsof /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. quiterss 20630 silenceshell mem REG 8,5 36462184 3936610 /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2

默认情况下会显示 cache 的文件的全路径,会比较长,也可以使用 --bname 选项来仅显示文件名:

  1. -------------+----------------+------------+-----------+---------+
  2. $ sudo ./hcache --top 3 --bname
  3. +-------------+----------------+------------+-----------+---------+
  4. | Name | Size (bytes) | Pages | Cached | Percent |
  5. |-------------+----------------+------------+-----------+---------|
  6. | chrome | 114911208 | 28055 | 25476 | 090.807 |
  7. | pycharm.jar | 95177431 | 23237 | 11479 | 049.400 |
  8. | atom | 62641344 | 15294 | 10578 | 069.164 |
  9. +-------------+----------------+------------+-----------+---------+
TAGS: ,
五月 27th, 2017

通常,要在 Linux 终端删除一个文件,我们使用 rm 命令(删除文件)、shred 命令(安全删除文件)、wipe 命令(安全擦除文件)或者 secure-deletion 工具包(一个安全文件删除工具集合)。

我们可以使用上述任意的工具来处理相对较小的文件。如果我们想要删除超大的文件/文件夹,比如大概 100-200GB,在删除文件(I/O 调度)所花费的时间以及 RAM 占用量方面,就没有你想的那么简单。

在本教程中,我们会解释如何在 Linux 中有效率并可靠地删除大文件/文件夹。

 

我们的主要目标是使用一种不会在删除大文件时拖慢系统的技术,合理地占用 I/O。我们可以用 ionice 命令实现这个目标。

在 Linux 中使用 ionice 命令删除超大(200GB)文件

ionice 是一个可以对另一个程序设置或获取 I/O 调度级别和优先级的有用程序。如果没有给出参数或者只有 -p 参数,那么 ionice 将会查询该进程的当前的 I/O 调度级别以及优先级。

如果我们给出命令名称,如 rm 命令,它将使用给定的参数运行此命令。要获取或设置调度参数,请指定[进程的 PID],如下:

  1. # ionice -p PID

要指定名字或者调度的数字,使用(0 表示无、1 表示实时、2 表示尽力、3 表示空闲)下面的命令。

以下命令表示 rm 会属于空闲 I/O 级别,并且只在其他进程不使用的时候使用 I/O:

  1. ---- Deleting Huge Files in Linux -----
  2. # ionice -c 3 rm /var/logs/syslog
  3. # ionice -c 3 rm -rf /var/log/apache

如果系统中没有很多空闲时间,那么我们希望使用尽力调度级别,并且使用低优先级:

  1. # ionice -c 2 -n 6 rm /var/logs/syslog
  2. # ionice -c 2 -n 6 rm -rf /var/log/apache

注意:要使用安全的方法删除大文件,我们可以使用先前提到的 shredwipe 以及 secure-deletion 工具包中的不同工具,而不是 rm 命令。

五月 27th, 2017

想像一下:你打开了一个程序(可能来自于你的桌面菜单或者命令行),然后开始使用这个程序,没想到程序会锁死、停止运行、或者意外死机。你尝试再次运行该程序,但是它反馈说原来的进程没有完全关闭。

你该怎么办?你要结束进程。但该如何做?不管你信与不信,最好的解决方法大都在命令行里。值得庆幸的是, Linux 有供用户杀死错误的进程的每个必要的工具,然而,你在执行杀死进程的命令之前,你首先需要知道进程是什么。该如何处理这一类的任务。一旦你能够掌握这种工具,它实际是十分简单的……

让我来介绍给你这些工具。

我来概述的步骤是每个 Linux 发行版都能用的,不论是桌面版还是服务器版。我将限定只使用命令行,请打开你的终端开始输入命令吧。

定位进程

杀死一个没有响应的进程的第一个步骤是定位这个进程。我用来定位进程的命令有两个:topps 命令。top 是每个系统管理员都知道的工具,用 top 命令,你能够知道到所有当前正在运行的进程有哪些。在命令行里,输入 top 命令能够就看到你正在运行的程序进程(图1)

图 1: top 命令给出你许多的信息。

图 1: top 命令给出你许多的信息。

从显示的列表中你能够看到相当重要的信息,举个例子,Chrome 浏览器反映迟钝,依据我们的 top 命令显示,我们能够辨别的有四个 Chrome 浏览器的进程在运行,进程的 pid 号分别是 3827、3919、10764 和 11679。这个信息是重要的,可以用一个特殊的方法来结束进程。

尽管 top 命令很是方便,但也不是得到你所要信息最有效的方法。 你知道你要杀死的 Chrome 进程是那个,并且你也不想看 top 命令所显示的实时信息。 鉴于此,你能够使用 ps 命令然后用 grep 命令来过滤出输出结果。这个 ps 命令能够显示出当前进程列表的快照,然后用 grep 命令输出匹配的样式。我们通过 grep 命令过滤 ps 命令的输出的理由很简单:如果你只输入 ps 命令,你将会得到当前所有进程的列表快照,而我们需要的是列出 Chrome 浏览器进程相关的。所以这个命令是这个样子:

  1. ps aux | grep chrome

这里 aux 选项如下所示:

  • a = 显示所有用户的进程
  • u = 显示进程的用户和拥有者
  • x = 也显示不依附于终端的进程

当你搜索图形化程序的信息时,这个 x 参数是很重要的。

当你输入以上命令的时候,你将会得到比图 2 更多的信息,而且它有时用起来比 top 命令更有效。

图 2:用 ps 命令来定位所需的内容信息。

图 2:用 ps 命令来定位所需的内容信息。

结束进程

现在我们开始结束进程的任务。我们有两种可以帮我们杀死错误的进程的信息。

  • 进程的名字
  • 进程的 ID (PID)

你用哪一个将会决定终端命令如何使用,通常有两个命令来结束进程:

  • kill – 通过进程 ID 来结束进程
  • killall – 通过进程名字来结束进程

有两个不同的信号能够发送给这两个结束进程的命令。你发送的信号决定着你想要从结束进程命令中得到的结果。举个例子,你可以发送 HUP(挂起)信号给结束进程的命令,命令实际上将会重启这个进程。当你需要立即重启一个进程(比如就守护进程来说),这是一个明智的选择。你通过输入 kill -l 可以得到所有信号的列表,你将会发现大量的信号。

图 3: 可用的结束进程信号。

图 3: 可用的结束进程信号。

最经常使用的结束进程的信号是:

Signal Name Single Value Effect
SIGHUP 1 挂起
SIGINT 2 键盘的中断信号
SIGKILL 9 发出杀死信号
SIGTERM 15 发出终止信号
SIGSTOP 17, 19, 23 停止进程

好的是,你能用信号值来代替信号名字。所以你没有必要来记住所有各种各样的信号名字。

所以,让我们现在用 kill 命令来杀死 Chrome 浏览器的进程。这个命令的结构是:

  1. kill SIGNAL PID

这里 SIGNAL 是要发送的信号,PID 是被杀死的进程的 ID。我们已经知道,来自我们的 ps 命令显示我们想要结束的进程 ID 号是 3827、3919、10764 和 11679。所以要发送结束进程信号,我们输入以下命令:

  1. kill -9 3827
  2. kill -9 3919
  3. kill -9 10764
  4. kill -9 11679

一旦我们输入了以上命令,Chrome 浏览器的所有进程将会成功被杀死。

我们有更简单的方法!如果我们已经知道我们想要杀死的那个进程的名字,我们能够利用 killall 命令发送同样的信号,像这样:

  1. killall -9 chrome

附带说明的是,上边这个命令可能不能捕捉到所有正在运行的 Chrome 进程。如果,运行了上边这个命令之后,你输入 ps aux | grep chrome 命令过滤一下,看到剩下正在运行的 Chrome 进程有那些,最好的办法还是回到 kIll 命令通过进程 ID 来发送信号值 9 来结束这个进程。

结束进程很容易

正如你看到的,杀死错误的进程并没有你原本想的那样有挑战性。当我让一个顽固的进程结束的时候,我趋向于用 killall命令来作为有效的方法来终止,然而,当我让一个真正的活跃的进程结束的时候,kill命令是一个好的方法。

TAGS: ,
五月 27th, 2017

Python-mode 是一个 Vim 插件,它使你能够在 Vim 编辑器中更快的利用包括 pylint、rope、pydoc、pyflakes、pep8、autopep8、pep257 和 mccable 在内的各种库来写 Python 代码,这些库提供了一些编码功能,比如静态分析、特征重构、折叠、补全和文档等。

 

这个插件包含了所有你在 Vim 编辑器中可以用来开发 Python 应用的特性。

Python-mode 的特性

它包含下面这些值得一提的特性:

  • 支持 Python 2.6+ 至 Python 3.2 版本
  • 语法高亮
  • 提供 virtualenv 支持
  • 支持 Python 式折叠
  • 提供增强的 Python 缩进
  • 能够在 Vim 中运行 Python 代码
  • 能够添加/删除断点
  • 支持 Python 代码的快捷移动和操作
  • 能够在运行的同时检查代码(pylint、pyflakes、pylama ……)
  • 支持自动修复 PEP8 错误
  • 允许在 Python 文档中进行搜索
  • 支持代码重构
  • 支持强代码补全
  • 支持定义跳转

在这篇教程中,我将阐述如何在 Linux 中为 Vim 安装设置 Python-mode,从而在 Vim 编辑器中开发 Python 应用。

如何在 Linux 系统中为 Vim 安装 Python-mode

首先安装 Pathogen (它使得安装插件超级简单,并且运行文件位于私有目录中),从而更加容易的安装 Python-mode

运行下面的命令来获取 pathogen.vim 文件和它需要的目录:

  1. # mkdir -p ~/.vim/autoload ~/.vim/bundle && \
  2. # curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

然后把下面这些内容加入 ~/.vimrc 文件中:

  1. execute pathogen#infect()
  2. syntax on
  3. filetype plugin indent on

安装好 pathogen 以后,你可以像下面这样把 Python-mode 插件放入 ~/.vim/bunble 目录中:

  1. # cd ~/.vim/bundle
  2. # git clone https://github.com/klen/python-mode.git

然后像下面这样在 Vim 中重建 helptags

  1. :helptags

你需要启用 filetype-plugin:help filetype-plugin-on)和 filetype-indent:help filetype-indent-on)来使用 Python-mode 。

在 Debian 和 Ubuntu 中安装 Python-mode

另一种在 Debian 和 Ubuntu 中安装 Python-mode 的方法是使用 PPA,就像下面这样

  1. $ sudo add-apt-repository https://klen.github.io/python-mode/deb main
  2. $ sudo apt-get update
  3. $ sudo apt-get install vim-python-mode

如果你遇到消息:“The following signatures couldn’t be verified because the public key is not available”,请运行下面的命令:

  1. $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B5DF65307000E266

现在,使用 vim-addon-manager 启用 Python-mode:

  1. $ sudo apt install vim-addon-manager
  2. $ vim-addons install python-mode

在 Linux 中定制 Python-mode

如果想覆盖默认键位绑定,可以在 .vimrc 文件中重定义它们,比如:

  1. " Override go-to.definition key shortcut to Ctrl-]
  2. let g:pymode_rope_goto_definition_bind = "<C-]>"
  3. " Override run current python file key shortcut to Ctrl-Shift-e
  4. let g:pymode_run_bind = "<C-S-e>"
  5. " Override view python doc key shortcut to Ctrl-Shift-d
  6. let g:pymode_doc_bind = "<C-S-d>"

注意,默认情况下, Python-mode 使用 Python 2 进行语法检查。你可以在 .vimrc 文件中加入下面这行内容从而启动 Python 3 语法检查。

  1. let g:pymode_python = 'python3'
TAGS: ,
五月 27th, 2017

Linfo 是一个自由开源的跨平台的服务器统计 UI 或库,它可以显示大量的系统信息。Linfo 是可扩展的,通过 composer,很容易使用 PHP5 库以程序化方式获取来自 PHP 应用的丰富的系统统计数据。它有 Web UI 及其Ncurses CLI 视图,在 Linux、Windows、BSD、Darwin/Mac OSX、Solaris 和 Minix 系统上均可用。

Linfo 显示的系统信息包括 CPU 类型/速度、服务器的体系结构、挂载点用量、硬盘/光纤/Flash 驱动器、硬件设备、网络设备和统计信息、运行时间/启动日期、主机名、内存使用量(RAM 和 swap)、温度/电压/风扇速度和 RAID 阵列等。

环境要求:

  • PHP 5.3
  • pcre 扩展
  • Linux – /proc/sys 已挂载且可对 PHP 可读,已经在 2.6.x/3.x 内核中测试过

如何在 Linux 中安装 Linfo 服务器统计 UI及库

首先,在 Apache 或 Nginx 的 Web 根目录下创建 Linfo 的目录,然后,使用下面展示的 rsync 命令 克隆仓库文件并将其移动到目录 /var/www/html/linfo 下:

  1. $ sudo mkdir -p /var/www/html/linfo
  2. $ git clone git://github.com/jrgp/linfo.git
  3. $ sudo rsync -av linfo/ /var/www/html/linfo/

接下来,将 sample.config.inc.php 重命名为 config.inc.php。这是 Linfo 的配置文件,你可以在里面定义你想要的值:

  1. $ sudo mv sample.config.inc.php config.inc.php

现在,在 Web 浏览器中打开链接 http://SERVER_IP/linfo 来查看这个 Web UI,正如下面的截图所展示的。

从截图中可以看到, Linfo 显示了系统内核信息、硬件组成、RAM 统计、网络设备、驱动器以及文件系统挂载点。

Linux 服务器运行信息

Linux 服务器运行信息

你可以将下面一行内容加入配置文件 config.inc.php 中,以便进行故障排查时看到错误信息。

  1. $settings['show_errors'] = true;

以 Ncurses 模式运行 Linfo

Linfo 有一个基于 ncurses 的简单界面,它依赖于 phpncurses 扩展。

  1. # yum install php-pecl-ncurses [在 CentOS/RHEL 上]
  2. # dnf install php-pecl-ncurses [在 Fedora 上]
  3. $ sudo apt-get install php5-dev libncurses5-dev [在 Debian/Ubuntu 上]

现在,像下面这样编译这个 php 扩展:

  1. $ wget http://pecl.php.net/get/ncurses-1.0.2.tgz
  2. $ tar xzvf ncurses-1.0.2.tgz
  3. $ cd ncurses-1.0.2
  4. $ phpize # generate configure script
  5. $ ./configure
  6. $ make
  7. $ sudo make install

接下来,如果编译成功并安装好了该 php 扩展,运行下面的命令:

  1. $ sudo echo extension=ncurses.so > /etc/php5/cli/conf.d/ncurses.ini

验证 ncurse:

  1. $ php -m | grep ncurses

现在,运行 Info:

  1. $ cd /var/www/html/linfo/
  2. $ ./linfo-curses

Linux 服务器信息

Linux 服务器信息

Info 中尚欠缺下面这些功能:

  1. 支持更多 Unix 操作系统(比如 Hurd、IRIX、AIX 和 HP UX 等)
  2. 支持不太出名的操作系统 Haiku/BeOS
  3. 额外功能/扩展
  4. 在 ncurses 模式中支持 htop 类 特性