2018QS世界大学排名

排名学院名称国家
1哈佛大学美国
2麻省理工学院美国
3斯坦福大学美国
4加州大学伯克利分校美国
5牛津大学英国
6加州理工大学美国
7剑桥大学英国
8哥伦比亚大学美国
9普林斯顿大学美国
10华盛顿大学美国
10耶鲁大学美国
10约翰霍普金斯大学美国
13加州大学洛杉矶分校美国
14芝加哥大学美国
15加州大学旧金山分校美国
16加州大学圣地亚哥分校美国
17密歇根大学安娜堡分校美国
17帝国理工学院英国
19宾夕法尼亚大学美国
20多伦多大学加拿大
21杜克大学美国
22伦敦大学学院英国
23康奈尔大学美国
24西北大学美国
25瑞士联邦理工学院苏黎世瑞士
26墨尔本大学澳大利亚
27不列颠哥伦比亚大学加拿大
28加州大学圣巴巴拉分校美国
28纽约大学美国
30爱丁堡大学英国
31威斯康星大学美国
32华盛顿大学-圣路易斯美国
32德州大学奥斯汀分校美国
34北卡罗来纳大学教堂山分校美国
34悉尼大学澳大利亚
36洛桑联邦理工学院瑞士
37哥本哈根大学丹麦
38巴黎第六大学法国
39波士顿大学美国
40慕尼黑大学德国
41伦敦大学国王学院英国
42明尼苏达大学双城分校美国
43新加坡国立大学新加坡
44科罗拉多大学美国
45澳大利亚昆士兰大学澳大利亚
46俄亥俄州立大学美国
47加州大学圣克鲁兹分校美国
48匹兹堡大学美国
49麦克吉尔大学加拿大
50马里兰大学帕克分校美国
51伊利诺伊大学香槟分校美国
52洛克菲勒大学美国
52加州大学戴维斯分校美国
52卡罗林斯卡学院瑞典
55南洋理工大学新加坡
55阿姆斯特丹大学荷兰
57荷兰乌得勒支大学荷兰
57东京大学日本
59曼彻斯特大学英国
59苏黎世大学瑞士
59德国海德堡大学德国
62南加州大学美国
63天主教鲁汶大学比利时
64清华大学中国
65北京大学中国
66宾州州立大学美国
67范德堡大学美国
68莫纳什大学澳大利亚
69新南威尔士大学澳大利亚
69澳大利亚国立大学澳大利亚
71埃默里大学美国
71乔治亚理工学院美国
73布里斯托大学英国
73鹿特丹伊拉斯姆斯大学荷兰
75加州大学欧文分校美国
75伦敦卫生和热带医学院英国
77亚利桑那大学美国
77卡内基梅隆大学美国
79莱顿大学荷兰
80慕尼黑工业大学德国
81莱斯大学美国
81密歇根州立大学美国
81巴塞罗那大学西班牙
81赫尔辛基大学芬兰
85瑞典隆德大学瑞典
85阿姆斯特丹自由大学荷兰
87柏林洪堡特大学德国
88日内瓦大学瑞士
88瓦赫宁根大学荷兰
88根特大学比利时
88西澳大利亚大学澳大利亚
92布朗大学美国
93巴黎第十一大学法国
94格罗宁根大学荷兰
95佛罗里达大学美国
95奥胡斯大学丹麦
97罗格斯大学新布朗斯维克校区美国
97南安普敦大学英国
99瑞典乌普萨拉大学瑞典
100巴黎第七大学法国
101内梅亨大学荷兰
102格拉斯哥大学英国
103普渡大学西拉法叶分校美国
104奥斯陆大学挪威
104魏茨曼科学研究所以色列
104波恩大学德国
107弗吉尼亚大学美国
107伯明翰大学英国
109香港大学中国香港
110阿卜杜拉国王科技大学阿拉伯
111罗切斯特大学美国
112柏林自由大学德国
113开普敦大学南非
114京都大学日本
115西奈山医学院美国
116伦敦玛丽王后大学英国
116瑞士伯尔尼大学瑞士
118德克萨斯农机大学――学院站美国
119丹麦科技大学丹麦
120伯尔尼大学瑞士
121德州大学西南医学中心美国
122阿得雷德大学澳大利亚
123国立首尔大学韩国
124罗马大学意大利
124鲁汶天主教大学比利时
126贝勒医学院美国
126麻州大学阿默斯特分校美国
128麦克马斯特大学加拿大
129犹他大学美国
129印第安纳大学美国
129利物普大学英国
129斯德哥尔摩大学瑞典
129蒙特利尔大学加拿大
134亚利桑那州国家大学-坦佩美国
134利兹大学英国
134汉堡大学德国
134艾伯塔大学加拿大
138奥克兰大学新西兰
138波罗尼亚大学意大利
140帕多瓦大学意大利
141加州大学河滨分校美国
142哥廷根大学德国
143雪菲尔大学英国
143诺丁汉大学英国
145中国科技大学中国
146凯斯西储大学美国
146格勒诺布尔大学法国
148华威大学英国
148香港中文大学中国香港
148弗莱堡大学德国
148复旦大学中国
152香港科技大学中国香港
153艾奥瓦大学美国
153圣保罗大学巴西
155蒂宾根大学德国
156纽约州立大学石溪分校美国
156上海交通大学中国
158米兰大学意大利
159卡蒂夫大学英国
159马赛大学法国
159浙江大学中国
162阿拉巴马伯明翰大学美国
163埃克塞特大学英国
164巴塞罗那自治大学西班牙
164代尔夫特理工大学荷兰
166台湾大学中国台湾
167马斯特里赫特大学荷兰
167卡尔斯鲁厄理工学院德国
167柏林医科大学德国
167亚琛工业大学大学德国
171俄勒冈健康与科学大学美国
171迈阿密大学美国
173塔夫斯大学美国
173杜伦大学英国
173特拉维夫大学以色列
176哥德堡大学瑞典
176庞培法布拉大学西班牙
176法兰克福歌德大学沃尔夫冈德国
179洛桑大学瑞士
180挪威卑尔根大学挪威
181圣母大学美国
181耶路撒冷希伯来大学以色列
183阿卜杜拉国王科技大学阿拉伯
183德累斯顿工科大学德国
183卡尔加里大学加拿大
186香港城市大学中国香港
187纽卡斯尔大学英国
187斯特拉斯堡大学法国
187维也纳大学奥地利
190佛罗里达州立大学美国

2017 US News世界大学TOP100中英文榜

20

排名学校名称学校英文名国家/地区
1哈佛大学Harvard University美国
2麻省理工学院Massachusetts Institute of Technology美国
3斯坦福大学Stanford University美国
4加州大学伯克利分校University of California, Berkeley美国
5加州理工学院California Institute of Technology美国
6牛津大学University of Oxford英国
7剑桥大学University of Cambridge英国
8普林斯顿大学Princeton University美国
9哥伦比亚大学Columbia University美国
10加州大学洛杉矶分校University of California, Los Angeles美国
11约翰霍普金斯大学Johns Hopkins University美国
11华盛顿大学University of Washington美国
13芝加哥大学University of Chicago美国
14耶鲁大学Yale University美国
15加州大学圣地亚哥分校University of California, San Diego美国
16加州大学旧金山分校University of California, San Francisco美国
17密歇根大学安娜堡分校University of Michigan美国
17宾夕法尼亚大学University of Pennsylvania美国
19杜克大学Duke University美国
19帝国理工学院Imperial College London英国
21多伦多大学University of Toronto加拿大
22康奈尔大学Cornell University美国
23伦敦大学学院University College London英国
24加州大学圣塔芭芭拉分校University of California, Santa Barbara美国
25西北大学Northwestern University美国
26圣路易斯华盛顿大学Washington University in St. Louis美国
27纽约大学New York University美国
27加州大学圣克鲁兹分校University of California, Santa Cruz美国
29威斯康辛大学麦迪逊分校University of Wisconsin, Madison美国
30德克萨斯大学奥斯汀分校University of Texas, Austin美国
31英属哥伦比亚大学University of British Columbia加拿大
32波士顿大学Boston University美国
32科罗拉多大学博尔德分校University of Colorado, Boulder美国
32北卡罗来纳大学教堂山分校University of North Carolina, Chapel Hill美国
35苏黎世联邦理工学院Swiss Federal Institute of Technology Zurich瑞士
36爱丁堡大学University of Edinburgh英国
37墨尔本大学University of Melbourne澳大利亚
38明尼苏达大学双城分校University of Minnesota, Twin Cities美国
39洛克菲勒大学Rockefeller University美国
40洛桑联邦理工学院Ecole Polytechnique Federal of Lausanne瑞士
40马里兰大学学帕克分校University of Maryland, College Park美国
42加州大学戴维斯分校University of California, Davis美国
43俄亥俄州立大学Ohio State University美国
44东京大学University of Tokyo日本
45伦敦大学国王学院King’s College London英国
45悉尼大学University of Sydney澳大利亚
47伊利诺伊大学厄本那-香槟分校University of Illinois, Urbana-Champaign美国
47匹兹堡大学University of Pittsburgh美国
49哥本哈根大学University of Copenhagen丹麦
50麦吉尔大学McGill University加拿大
50新加坡国立大学National University of Singapore新加坡
52昆士兰大学University of Queensland Australia澳大利亚
53北京大学Peking University中国
53南加州大学University of Southern California美国
55鲁汶大学(荷语)KU Leuven比利时
56宾州州立大学公园分校Pennsylvania State University美国
57清华大学Tsinghua University中国
57慕尼黑大学University of Munich德国
59曼彻斯特大学University of Manchester英国
59乌得勒支大学Utrecht University荷兰
61莱斯大学Rice University美国
62巴黎第六大学Pierre and Marie Curie University – Paris 6法国
63阿姆斯特丹大学University of Amsterdam荷兰
63范德堡大学Vanderbilt University美国
65加州大学欧文分校University of California, Irvine美国
66佐治亚理工学院Georgia Institute of Technology美国
67卡耐基梅隆大学Carnegie Mellon University美国
68海德堡大学Heidelberg University德国
69卡罗琳医学院Karolinska Institute瑞典
70埃默里大学Emory University美国
70伦敦大学热带医学院London School of Hygiene & Tropical Medicine英国
70苏黎世大学University of Zurich瑞士
73亚利桑那大学University of Arizona美国
74南洋理工大学Nanyang Technological University新加坡
75鹿特丹伊拉斯姆斯大学Erasmus University Rotterdam荷兰
76布里斯托大学University of Bristol英国
77莱顿大学Leiden University荷兰
78密歇根州立大学Michigan State University美国
79莫纳什大学Monash University澳大利亚
80澳洲国立大学Australian National University澳大利亚
80新南威尔士大学University of New South Wales澳大利亚
82罗格斯大学Rutgers State University美国
82佛罗里达大学University of Florida美国
84巴黎第十一大学Université Paris-Sud法国
85布朗大学Brown University美国
86慕尼黑工业大学Technical University of Munich德国
86巴塞罗那大学University of Barcelona西班牙
86格罗宁根大学University of Groningen荷兰
86阿姆斯特丹自由大学VU University Amsterdam荷兰
90普渡大学西拉法叶分校Purdue University美国
90塔夫斯大学Tufts University美国
91日内瓦大学University of Geneva瑞士
91赫尔辛基大学University of Helsinki芬兰
93柏林洪堡大学Humboldt-Universität zu Berlin德国
94隆德大学Lund University瑞典
95罗彻斯特大学University of Rochester美国
95西澳大学University of Western Australia澳大利亚
97内梅亨大学Radboud University Nijmegen荷兰
98根特大学Ghent University比利时
99弗吉尼亚大学University of Virginia美国
99巴黎第七大学Université Paris Diderot – Paris 7法国

2018-2019中国大学排名800强完整榜单

排名学校名称综合得分星级排名办学层次
1北京大学1008星级世界一流大学
2清华大学97.688星级世界一流大学
3中国科学院大学86.778星级世界一流大学(特色)
4复旦大学82.948星级世界一流大学
5中国人民大学82.488星级世界一流大学(特色)
5浙江大学82.488星级世界一流大学
7上海交通大学82.247星级世界知名高水平大学(前列)
8南京大学81.837星级世界知名高水平大学(前列)
9武汉大学81.517星级世界知名高水平大学(前列)
10中山大学78.77星级世界知名高水平大学(前列)
11吉林大学77.847星级世界知名高水平大学
12华中科技大学76.997星级世界知名高水平大学
13天津大学76.187星级世界知名高水平大学
14四川大学76.137星级世界知名高水平大学
15中国科学技术大学75.788星级世界一流大学(特色)
16南开大学75.587星级世界知名高水平大学
17北京师范大学75.557星级世界知名高水平大学
18西安交通大学75.087星级世界知名高水平大学(前列)
19哈尔滨工业大学75.037星级世界知名高水平大学(前列)
20中南大学74.967星级世界知名高水平大学
20山东大学74.967星级世界知名高水平大学
22厦门大学74.617星级世界知名高水平大学
23同济大学74.437星级世界知名高水平大学
24东南大学73.997星级世界知名高水平大学
25北京航空航天大学71.877星级世界知名高水平大学
26东北大学70.656星级世界高水平大学
27西北工业大学70.626星级世界高水平大学
28华东师范大学70.596星级世界高水平大学
29北京理工大学70.526星级世界高水平大学
30华南理工大学70.496星级世界高水平大学
31大连理工大学70.436星级世界高水平大学
32湖南大学69.686星级世界高水平大学
33重庆大学69.636星级世界高水平大学
34中国农业大学69.26星级世界高水平大学(特色)
35兰州大学68.466星级世界高水平大学
36华中师范大学68.255星级中国一流大学(特色)
37电子科技大学68.186星级世界高水平大学(特色)
38西南大学67.675星级中国一流大学(特色)
39河海大学67.386星级世界高水平大学(特色)
40武汉理工大学67.165星级中国一流大学(特色)
41西南交通大学67.15星级中国一流大学(特色)
42北京科技大学66.85星级中国一流大学(特色)
43华中农业大学66.595星级中国一流大学(特色)
44北京交通大学66.575星级中国一流大学(特色)
45西北大学66.515星级中国一流大学(特色)
46郑州大学66.55星级中国一流大学(特色)
47南京农业大学66.45星级中国一流大学(特色)
48华东理工大学66.375星级中国一流大学(特色)
49苏州大学66.365星级中国一流大学(特色)
50南京理工大学66.285星级中国一流大学(特色)
51西安电子科技大学66.255星级中国一流大学(特色)
52东北师范大学66.245星级中国一流大学(特色)
53南京师范大学66.075星级中国一流大学(特色)
54中国海洋大学66.056星级世界高水平大学(特色)
55中国地质大学(武汉)666星级世界高水平大学(特色)
56西北农林科技大学65.735星级中国一流大学(特色)
57南京航空航天大学65.695星级中国一流大学(特色)
58北京邮电大学65.66星级世界高水平大学(特色)
59湖南师范大学65.594星级中国高水平大学
59上海大学65.594星级中国高水平大学
61暨南大学65.485星级中国一流大学(特色)
62合肥工业大学65.315星级中国一流大学(特色)
63哈尔滨工程大学65.275星级中国一流大学(特色)
64南昌大学65.24星级中国高水平大学
65陕西师范大学65.165星级中国一流大学(特色)
66华南师范大学65.145星级中国一流大学(特色)
67昆明理工大学65.125星级中国一流大学(特色)
68东华大学65.015星级中国一流大学(特色)
69中南财经政法大学64.976星级世界高水平大学(特色)
70云南大学64.935星级中国一流大学(特色)
71北京协和医学院64.896星级世界高水平大学(特色)
72上海财经大学64.886星级世界高水平大学(特色)
73福州大学64.844星级中国高水平大学
74中国矿业大学64.836星级世界高水平大学(特色)
74中国政法大学64.836星级世界高水平大学(特色)
76江南大学64.65星级中国一流大学(特色)
77北京化工大学64.575星级中国一流大学(特色)
78中国石油大学(华东)64.566星级世界高水平大学(特色)
79华南农业大学64.525星级中国一流大学(特色)
80燕山大学64.455星级中国一流大学(特色)
81河南大学64.434星级中国高水平大学
82宁波大学64.424星级中国高水平大学
83首都师范大学64.414星级中国高水平大学
83福建师范大学64.414星级中国高水平大学
85浙江工业大学64.394星级中国高水平大学
86深圳大学64.374星级中国高水平大学
87浙江师范大学64.364星级中国高水平大学
88江苏大学64.354星级中国高水平大学
89广西大学64.344星级中国高水平大学
89上海理工大学64.344星级中国高水平大学
91长安大学64.334星级中国高水平大学
92杭州电子科技大学64.274星级中国高水平大学
92北京工业大学64.274星级中国高水平大学
94扬州大学64.254星级中国高水平大学
95对外经济贸易大学64.225星级中国一流大学(特色)
96天津师范大学64.214星级中国高水平大学
97山西大学64.24星级中国高水平大学
98齐鲁工业大学64.184星级中国高水平大学
98中央民族大学64.186星级世界高水平大学(特色)
100太原理工大学64.154星级中国高水平大学
100河北大学64.154星级中国高水平大学
100西南财经大学64.155星级中国一流大学(特色)
103南京工业大学64.064星级中国高水平大学
104安徽大学63.964星级中国高水平大学
105北京林业大学63.955星级中国一流大学(特色)
106辽宁大学63.824星级中国高水平大学
107黑龙江大学63.744星级中国高水平大学
108首都医科大学63.725星级中国一流大学(特色)
108贵州大学63.724星级中国高水平大学
110新疆大学63.685星级中国一流大学(特色)
111上海师范大学63.654星级中国高水平大学
112内蒙古大学63.64星级中国高水平大学
113中央财经大学63.575星级中国一流大学(特色)
114东北林业大学63.464星级中国高水平大学
115东北财经大学63.365星级中国一流大学(特色)
116广东工业大学63.284星级中国高水平大学
117中国石油大学(北京)63.275星级中国一流大学(特色)
118华北电力大学63.264星级中国高水平大学
119福建农林大学63.234星级中国高水平大学
120南方医科大学63.24星级中国高水平大学
121湘潭大学63.164星级中国高水平大学
122东北农业大学63.084星级中国高水平大学
123南京邮电大学63.064星级中国高水平大学
124西南政法大学63.045星级中国一流大学(特色)
125广东外语外贸大学63.024星级中国高水平大学
126山东师范大学634星级中国高水平大学
127华侨大学62.983星级区域一流大学
128四川农业大学62.924星级中国高水平大学
129长沙理工大学62.894星级中国高水平大学
129西北师范大学62.894星级中国高水平大学
131哈尔滨医科大学62.884星级中国高水平大学
132安徽师范大学62.854星级中国高水平大学
132山东农业大学62.854星级中国高水平大学
132广西师范大学62.853星级区域一流大学
135大连海事大学62.834星级中国高水平大学
135海南大学62.833星级区域一流大学
135江西师范大学62.833星级区域一流大学
138北京语言大学62.85星级中国一流大学(特色)
138南京医科大学62.84星级中国高水平大学
140广州大学62.763星级区域一流大学
141河北工业大学62.754星级中国高水平大学
142中国药科大学62.715星级中国一流大学(特色)
143山东科技大学62.673星级区域一流大学
143河南科技大学62.673星级区域一流大学
145天津医科大学62.664星级中国高水平大学
146北京中医药大学62.656星级世界高水平大学(特色)
147天津工业大学62.634星级中国高水平大学
147河北师范大学62.633星级区域一流大学
149湖南农业大学62.613星级区域一流大学
150江西财经大学62.584星级中国高水平大学
150浙江工商大学62.584星级中国高水平大学
152青岛大学62.573星级区域一流大学
153中国医科大学62.554星级中国高水平大学
154西安理工大学62.543星级区域一流大学
155河南师范大学62.533星级区域一流大学
155湖北大学62.533星级区域一流大学
157上海中医药大学62.526星级世界高水平大学(特色)
157成都理工大学62.524星级中国高水平大学
157重庆邮电大学62.523星级区域一流大学
160南京信息工程大学62.514星级中国高水平大学
161南京林业大学62.494星级中国高水平大学
161长春理工大学62.493星级区域一流大学
163西安建筑科技大学62.474星级中国高水平大学
163云南师范大学62.473星级区域一流大学
163浙江理工大学62.473星级区域一流大学
166汕头大学62.463星级区域一流大学
167中南民族大学62.435星级中国一流大学(特色)
167中国地质大学(北京)62.434星级中国高水平大学
169云南民族大学62.425星级中国一流大学(特色)
170哈尔滨师范大学62.413星级区域一流大学
171武汉科技大学62.43星级区域一流大学
172杭州师范大学62.373星级区域一流大学
173延边大学62.353星级区域一流大学
174石河子大学62.343星级区域一流大学
175重庆医科大学62.333星级区域一流大学
176南方科技大学62.325星级中国一流大学(特色)
176河南农业大学62.323星级区域一流大学
178大连大学62.293星级区域一流大学
178温州医科大学62.293星级区域一流大学
180哈尔滨理工大学62.263星级区域一流大学
181首都经济贸易大学62.234星级中国高水平大学
182河北农业大学62.224星级中国高水平大学
182四川师范大学62.223星级区域一流大学
182中国计量大学62.223星级区域一流大学
185兰州交通大学62.213星级区域一流大学
186南京中医药大学62.194星级中国高水平大学
186东北电力大学62.193星级区域一流大学
188东莞理工学院62.183星级区域一流大学
189山东财经大学62.174星级中国高水平大学
190上海海事大学62.164星级中国高水平大学
191河南理工大学62.153星级区域一流大学
192宁夏大学62.143星级区域一流大学
193桂林电子科技大学62.133星级区域一流大学
193湖北工业大学62.133星级区域一流大学
193济南大学62.133星级区域一流大学
193江苏师范大学62.133星级区域一流大学
197沈阳农业大学62.123星级区域一流大学
198湖南科技大学62.113星级区域一流大学
198辽宁工程技术大学62.113星级区域一流大学
198重庆交通大学62.113星级区域一流大学
201华东政法大学62.14星级中国高水平大学
201青岛科技大学62.13星级区域一流大学
201曲阜师范大学62.12星级区域高水平大学
204云南农业大学62.093星级区域一流大学
205天津理工大学62.083星级区域一流大学
206辽宁师范大学62.063星级区域一流大学
207兰州理工大学62.043星级区域一流大学
207天津科技大学62.043星级区域一流大学
209长江大学62.033星级区域一流大学
210西南石油大学62.014星级中国高水平大学
210中北大学62.013星级区域一流大学
212广州中医药大学61.995星级中国一流大学(特色)
213成都中医药大学61.984星级中国高水平大学
213天津中医药大学61.984星级中国高水平大学
215重庆师范大学61.972星级区域高水平大学
216三峡大学61.953星级区域一流大学
216山东理工大学61.953星级区域一流大学
218天津财经大学61.934星级中国高水平大学
218温州大学61.933星级区域一流大学
220西南民族大学61.884星级中国高水平大学
220贵州师范大学61.882星级区域高水平大学
222东北石油大学61.824星级中国高水平大学
222安徽农业大学61.823星级区域一流大学
222沈阳工业大学61.823星级区域一流大学
225华东交通大学61.793星级区域一流大学
225上海工程技术大学61.793星级区域一流大学
227大连医科大学61.773星级区域一流大学
228黑龙江中医药大学61.765星级中国一流大学(特色)
228上海海洋大学61.764星级中国高水平大学
230广西民族大学61.744星级中国高水平大学
230中国矿业大学(北京)61.744星级中国高水平大学
230江西理工大学61.742星级区域高水平大学
233浙江农林大学61.733星级区域一流大学
234南通大学61.712星级区域高水平大学
234重庆工商大学61.712星级区域高水平大学
236中南林业科技大学61.73星级区域一流大学
237广州医科大学61.693星级区域一流大学
237河南工业大学61.693星级区域一流大学
239内蒙古农业大学61.683星级区域一流大学
239南昌航空大学61.683星级区域一流大学
239新疆师范大学61.682星级区域高水平大学
242浙江财经大学61.673星级区域一流大学
242青岛理工大学61.672星级区域高水平大学
244吉林农业大学61.663星级区域一流大学
244大连工业大学61.662星级区域高水平大学
246青海大学61.653星级区域一流大学
246山西财经大学61.653星级区域一流大学
248广西医科大学61.643星级区域一流大学
248石家庄铁道大学61.643星级区域一流大学
248西南科技大学61.642星级区域高水平大学
251北京工商大学61.633星级区域一流大学
252西藏大学61.623星级区域一流大学
252沈阳建筑大学61.623星级区域一流大学
254江西农业大学61.613星级区域一流大学
254山西医科大学61.613星级区域一流大学
256哈尔滨商业大学61.63星级区域一流大学
256河北科技大学61.62星级区域高水平大学
256集美大学61.62星级区域高水平大学
259内蒙古师范大学61.582星级区域高水平大学
259新疆医科大学61.582星级区域高水平大学
261中国民航大学61.573星级区域一流大学
261景德镇陶瓷大学61.572星级区域高水平大学
263上海对外经贸大学61.563星级区域一流大学
263新疆农业大学61.563星级区域一流大学
263西安科技大学61.562星级区域高水平大学
266云南财经大学61.553星级区域一流大学
267桂林理工大学61.542星级区域高水平大学
267南华大学61.542星级区域高水平大学
267沈阳师范大学61.542星级区域高水平大学
267烟台大学61.542星级区域高水平大学
271浙江海洋大学61.533星级区域一流大学
272武汉纺织大学61.522星级区域高水平大学
273沈阳药科大学61.54星级中国高水平大学
273安徽工业大学61.53星级区域一流大学
273安徽医科大学61.53星级区域一流大学
273海南师范大学61.52星级区域高水平大学
277北华大学61.492星级区域高水平大学
278重庆理工大学61.482星级区域高水平大学
279河北医科大学61.473星级区域一流大学
280福建医科大学61.463星级区域一流大学
280南京财经大学61.463星级区域一流大学
282陕西科技大学61.452星级区域高水平大学
283沈阳航空航天大学61.433星级区域一流大学
283北京信息科技大学61.432星级区域高水平大学
283长春工业大学61.432星级区域高水平大学
283鲁东大学61.432星级区域高水平大学
283山西师范大学61.432星级区域高水平大学
288江西中医药大学61.423星级区域一流大学
288宁夏医科大学61.422星级区域高水平大学
290甘肃农业大学61.413星级区域一流大学
290安徽理工大学61.412星级区域高水平大学
292安徽建筑大学61.43星级区域一流大学
293北京建筑大学61.394星级中国高水平大学
294浙江中医药大学61.384星级中国高水平大学
294常州大学61.383星级区域一流大学
296天津职业技术师范大学61.372星级区域高水平大学
297湖南中医药大学61.364星级中国高水平大学
298安徽财经大学61.352星级区域高水平大学
298聊城大学61.352星级区域高水平大学
300辽宁科技大学61.322星级区域高水平大学
301西北民族大学61.314星级中国高水平大学
301大连交通大学61.313星级区域一流大学
301内蒙古科技大学61.312星级区域高水平大学
304青岛农业大学61.33星级区域一流大学
304河北经贸大学61.32星级区域高水平大学
304内蒙古工业大学61.32星级区域高水平大学
307福建中医药大学61.283星级区域一流大学
307山西农业大学61.283星级区域一流大学
309江苏科技大学61.272星级区域高水平大学
310昆明医科大学61.253星级区域一流大学
310辽宁中医药大学61.253星级区域一流大学
310东华理工大学61.252星级区域高水平大学
313泰山医学院61.243星级区域一流大学
313渤海大学61.242星级区域高水平大学
313天津商业大学61.242星级区域高水平大学
316西北政法大学61.234星级中国高水平大学
316山东中医药大学61.233星级区域一流大学
318西安石油大学61.223星级区域一流大学
319广西师范学院61.212星级区域高水平大学
320山东建筑大学61.23星级区域一流大学
320北京联合大学61.22星级区域高水平大学
322湖南商学院61.192星级区域高水平大学
323佛山科学技术学院61.182星级区域高水平大学
323赣南师范大学61.182星级区域高水平大学
323华北理工大学61.182星级区域高水平大学
326广东财经大学61.173星级区域一流大学
326河南中医药大学61.173星级区域一流大学
328北方工业大学61.162星级区域高水平大学
329西华大学61.152星级区域高水平大学
329浙江科技学院61.152星级区域高水平大学
331吉林师范大学61.142星级区域高水平大学
331武汉工程大学61.142星级区域高水平大学
333西南林业大学61.133星级区域一流大学
333西华师范大学61.132星级区域高水平大学
335大连海洋大学61.123星级区域一流大学
335沈阳化工大学61.122星级区域高水平大学
335太原科技大学61.122星级区域高水平大学
338吉首大学61.112星级区域高水平大学
339辽宁石油化工大学61.13星级区域一流大学
339湖南工业大学61.12星级区域高水平大学
341湖北中医药大学61.093星级区域一流大学
342西安工业大学61.082星级区域高水平大学
343南京审计大学61.063星级区域一流大学
344华北水利水电大学61.053星级区域一流大学
344青海民族大学61.052星级区域高水平大学
344青海师范大学61.052星级区域高水平大学
344西安工程大学61.052星级区域高水平大学
348贵州医科大学61.042星级区域高水平大学
348河南财经政法大学61.042星级区域高水平大学
350广东海洋大学61.033星级区域一流大学
350贵州民族大学61.033星级区域一流大学
350成都信息工程大学61.032星级区域高水平大学
350河北工程大学61.032星级区域高水平大学
354长春中医药大学61.023星级区域一流大学
354广西中医药大学61.023星级区域一流大学
356北京服装学院612星级区域高水平大学
356齐齐哈尔大学612星级区域高水平大学
356上海电力学院612星级区域高水平大学
359天津城建大学60.993星级区域一流大学
360湖南理工学院60.982星级区域高水平大学
360武汉轻工大学60.982星级区域高水平大学
362沈阳理工大学60.972星级区域高水平大学
362郑州轻工业学院60.972星级区域高水平大学
364贵州财经大学60.962星级区域高水平大学
365新疆财经大学60.953星级区域一流大学
365临沂大学60.952星级区域高水平大学
367吉林财经大学60.943星级区域一流大学
367福建工程学院60.942星级区域高水平大学
367佳木斯大学60.942星级区域高水平大学
367延安大学60.942星级区域高水平大学
367遵义医学院60.942星级区域高水平大学
372北方民族大学60.932星级区域高水平大学
372辽宁工业大学60.932星级区域高水平大学
374西安邮电大学60.923星级区域一流大学
374信阳师范学院60.922星级区域高水平大学
374中原工学院60.922星级区域高水平大学
374湖州师范学院60.921星级区域知名大学
378黑龙江科技大学60.92星级区域高水平大学
378上海立信会计金融学院60.92星级区域高水平大学
380贵阳中医学院60.893星级区域一流大学
381南京工程学院60.882星级区域高水平大学
382五邑大学60.872星级区域高水平大学
382西藏民族大学60.872星级区域高水平大学
382徐州医科大学60.872星级区域高水平大学
385大连民族大学60.863星级区域一流大学
385内蒙古民族大学60.863星级区域一流大学
385塔里木大学60.862星级区域高水平大学
388湖北师范大学60.852星级区域高水平大学
388苏州科技大学60.852星级区域高水平大学
388重庆科技学院60.851星级区域知名大学
391河北地质大学60.843星级区域一流大学
391陕西中医药大学60.843星级区域一流大学
391安徽工程大学60.842星级区域高水平大学
391合肥学院60.842星级区域高水平大学
395河南科技学院60.832星级区域高水平大学
396长春大学60.822星级区域高水平大学
396广东金融学院60.822星级区域高水平大学
396江汉大学60.822星级区域高水平大学
396上海应用技术大学60.822星级区域高水平大学
396厦门理工学院60.822星级区域高水平大学
401海南医学院60.812星级区域高水平大学
401锦州医科大学60.812星级区域高水平大学
401成都学院60.811星级区域知名大学
404安徽中医药大学60.793星级区域一流大学
404上海政法学院60.793星级区域一流大学
404天津农学院60.793星级区域一流大学
404嘉兴学院60.791星级区域知名大学
404绍兴文理学院60.791星级区域知名大学
409广东药科大学60.783星级区域一流大学
409湖北经济学院60.782星级区域高水平大学
411黑龙江八一农垦大学60.763星级区域一流大学
411井冈山大学60.762星级区域高水平大学
413广西科技大学60.752星级区域高水平大学
413山东工商学院60.752星级区域高水平大学
413浙江万里学院60.751星级区域知名大学
416长春师范大学60.732星级区域高水平大学
416江西科技师范大学60.732星级区域高水平大学
416内蒙古财经大学60.732星级区域高水平大学
419北京农学院60.723星级区域一流大学
419北京印刷学院60.723星级区域一流大学
419安庆师范大学60.722星级区域高水平大学
419广东技术师范学院60.722星级区域高水平大学
419沈阳大学60.722星级区域高水平大学
424闽南师范大学60.712星级区域高水平大学
424大理大学60.711星级区域知名大学
424宁波工程学院60.711星级区域知名大学
427西南医科大学60.73星级区域一流大学
427内蒙古医科大学60.72星级区域高水平大学
427宁夏师范学院60.72星级区域高水平大学
427广西财经学院60.71星级区域知名大学
427淮北师范大学60.71星级区域知名大学
427闽江学院60.71星级区域知名大学
427南昌工程学院60.71星级区域知名大学
427重庆文理学院60.71星级区域知名大学
435广东医科大学60.692星级区域高水平大学
435江苏理工学院60.691星级区域知名大学
437淮阴师范学院60.681星级区域知名大学
437九江学院60.681星级区域知名大学
437四川理工学院60.681星级区域知名大学
440兰州财经大学60.673星级区域一流大学
440广东石油化工学院60.672星级区域高水平大学
440新乡医学院60.672星级区域高水平大学
440盐城师范学院60.671星级区域知名大学

Linux 常用command

linux目录架构


/   根目录
/bin    常用的命令 binary file 的目錄
/boot   存放系统启动时必须读取的档案,包括核心 (kernel) 在内
     /boot/grub/menu.lst   GRUB设置
     /boot/vmlinuz   内核
     /boot/initrd     核心解壓縮所需 RAM Disk
/dev    系统周边设备     
/etc    系统相关设定文件
     /etc/DIR_COLORS   设定颜色
     /etc/HOSTNAME   设定用户的节点名
     /etc/NETWORKING   只有YES标明网络存在
     /etc/host.conf 文件说明用户的系统如何查询节点名
     /etc/hosts 设定用户自已的IP与名字的对应表
     /etc/hosts.allow 设置允许使用inetd的机器使用 
     /etc/hosts.deny 设置不允许使用inetd的机器使用
     /etc/hosts.equiv 设置远端机不用密码
     /etc/inetd.conf 设定系统网络守护进程inetd的配置
     /etc/gateways 设定路由器
     /etc/protocols 设定系统支持的协议
     /etc/named.boot 设定本机为名字服务器的配置文件
     /etc/sysconfig/network-scripts/ifcfg-eth0   设置IP
     /etc/resolv.conf    设置DNS  
     /etc/X11  X Window的配置文件,xorg.conf 或 XF86Config 這兩個 X Server 的設定檔
     /etc/fstab    记录开机要mount的文件系统
     /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel
     /etc/issue 记录用户登录前显示的信息
     /etc/group 设定用户的组名与相关信息
     /etc/passwd 帐号信息
     /etc/shadow 密码信息
     /etc/sudoers 可以sudo命令的配置文件
     /etc/securetty 设定哪些终端可以让root登录
     /etc/login.defs 所有用户登录时的缺省配置
     /etc/exports 设定NFS系统用的
     /etc/init.d/   所有服務的預設啟動 script 都是放在這裡的,例如要啟動或者關閉
     /etc/xinetd.d/  這就是所謂的 super daemon 管理的各項服務的設定檔目錄
     /etc/modprobe.conf   内核模块额外参数设定
     /etc/syslog.conf   日志设置文件
/home   使用者家目录
/lib    系统会使用到的函数库
     /lib/modules   kernel 的相关模块
     /var/lib/rpm   rpm套件安装处 
/lost+found    系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
/mnt     外设的挂载点
/media   与/mnt类似
/opt     主机额外安装的软件
/proc    虚拟目录,是内存的映射
      /proc/version   内核版本
       /proc/sys/kernel   系统内核功能
/root    系统管理员的家目录
/sbin    系统管理员才能执行的指令
/srv     一些服務啟動之後,這些服務所需要取用的資料目錄
/tmp     一般使用者或者是正在執行的程序暫時放置檔案的地方
/usr     最大的目录,存许应用程序和文件
    /usr/X11R6:   X-Window目录 
    /usr/src:    Linux源代码
    /usr/include:系统头文件
    /usr/openwin 存放SUN的OpenWin 
    /usr/man 在线使用手册
    /usr/bin           使用者可執行的 binary file 的目錄
    /usr/local/bin     使用者可執行的 binary file 的目錄
    /usr/lib           系统会使用到的函数库
    /usr/local/lib     系统会使用到的函数库
    /usr/sbin          系统管理员才能执行的指令
    /usr/local/sbin    系统管理员才能执行的指令
/var   日志文件
    /var/log/secure    記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中
    /var/log/wtmp      記錄登入者的訊息資料, last
    /var/log/messages  幾乎系統發生的錯誤訊息
    /var/log/boot.log  記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
    /var/log/maillog   紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄
    /var/log/cron      記錄 crontab 這個例行性服務的內容
    /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
    分別是幾個不同的網路服務的記錄檔 一些常用的基本命令:
uname -a    查看内核版本       
ls -al    显示所有文件的属性
pwd         显示当前路径        
cd –    返回上一次目录     cd ~    返回主目录
date s      设置时间、日期          
cal      显示日历     cal 2006
bc          计算器具               
man  & info     帮助手册
locale     显示当前字体     locale -a    所有可用字体     /etc/sysconfig/i18n设置文件
LANG=en    使用英文字体            
sync       将数据同步写入硬盘        
shutdonw -h now & half & poweroff  关机
reboot     重启                   
startx  &  init 5   进入图形介面
/work  & ?work    向上、下查找文档内容
chgrp      改变档案群组  chgrp testing install.log    
chown     改变所属人   chown root:root install.log
chmod      改变属性     chmod 777 install.log     read=4  write=2  execute=1
cp   复制   cp filename
rm   删除文件  rm -rf filename   强制删除文件
rmdir   删除文件夹
mv  移动    mv 123.txt 222.txt  重命名
mkdir     创建文件夹
touch     创建文件  更新当前时间
cat       由第一行开始显示     cat |more  分页
nl        在内容前加行号
more  &  less   一面一面翻动
head -n filename   显示第N行内容
tail -n filename  显示后N行内容
od        显示非纯文档
df -h 显示分区空间
du  显示目录或文件的大小
fdisk   分区设置    fdisk -l /dev/hda  显示硬盘分区状态
mkfs    建立各种文件系统  mkfs -t ext3  /dev/ram15   
fsck    检查和修复LINUX档案
ln      硬链接   ln -s  软件链接
whereis   查找命令
locate    查找
find      查找   find / -name “***.***”
which     查看工具
whoami    显示当前用户
gcc -v    查看GCC版本
chattr +i filename  禁止删除   chattr -i filename  取消禁止
lsattr    显示隐藏档属性
updatedb  更新资料库
mke2fs    格式化   mkfs -t ext3 
dd if=/etc/passwd of=/tmp/passwd.bak    备份
mount     列出系统所有的分区
mount -t iso9660 /dev/cdrom /mnt/cdrom   挂载光盘
mount -t vfat /dev/fd0 /mnt/floppy       挂载软盘
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2   挂载fat32分区
mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3         挂载ntfs分区
Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
umount /mnt/hda3  缷载
ifconfig   显示或设置网络设备
service network restart   重启网卡  
ifdown eth0  关闭网卡
ifup eth0    开启网卡
clear    清屏
history    历史记录       !55  执行第55个指令
stty   设置终端    stty -a
fdisk /mbr   删除GRUB
at     僅進行一次的工作排程
crontab   循環執行的例行性命令    [e]编辑,[l]显示,[r]删除任务
&       后台运行程序    tar -zxvf 123.tar.gz & ———>后台运行
jobs    观看后台暂停的程序   jobs -l
fg      将后台程序调到前台   fg n ——>n是数字,可以指定进行那个程序
bg      让工作在后台运行
kill    结束进程    kill -9 PID     [9]强制结束,[15]正常结束,[l]列出可用的kill信号
ps aux  查看后台程序   
top     查看后台程序   top -d 2    每两秒更新一次        top -d 2 -p10604   观看某个PID
        top -b -n 2 > /tmp/top.txt —–>將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt    
pstree   以树状图显示程序    [A]以 ASCII 來連接, [u]列出PID, [p]列出帐号
killall   要刪除某個服務    killall -9 httpd
free      显示内存状态     free -m  ——–>以M为单位显示
uptime    显示目前系统开机时间
netstat   显示网络状态    netstat -tulnp——>找出目前系統上已在監聽的網路連線及其 PID
dmesg     显示开机信息    demsg | more
nice      设置优先权      nice -n -5 vi & —–>用 root 給一個 nice 植為 -5 ,用於執行 vi 
renice    调整已存在优先权
runlevel  显示目前的runlevel
depmod    分析可载入模块的相依性
lsmod     显示已载入系统的模块
modinfo   显示kernel模块的信息
insmod    载入模块
modprobe   自动处理可载入模块
rmmod     删除模块
chkconfig   检查,设置系统的各种服务     chkconfig –list —–>列出各项服务状态
ntsysv     设置系统的各种服务
cpio      备份文件

压缩命令:
 *.Z      compress 程式壓縮的檔案; 
 *.bz2    bzip2 程式壓縮的檔案; 
 *.gz     gzip 程式壓縮的檔案; 
 *.tar    tar 程式打包的資料,並沒有壓縮過; 
 *.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮
compress filename  压缩文件  加[-d]解压  uncompress
gzip filename   压缩  加[-d]解压  zcat 123.gz 查看压缩文件内容
bzip2 -z filename  压缩  加[-d]解压   bzcat filename.bz2  查看压缩文件内容
tar -cvf /home/123.tar /etc  打包,不压缩
tar -xvf 123.tar   解开包
tar -zxvf /home/123.tar.gz  以gzip解压
tar -jxvf /home/123.tar.bz2  以bzip2解压
tar -ztvf /tmp/etc.tar.gz   查看tar内容
cpio -covB  > [file|device]   份份
cpio -icduv < [file|device]   还原 vi一般用法
一般模式              编辑模式                  指令模式
h 左               a,i,r,o,A,I,R,O             :w 保存
j 下                进入编辑模式                :w! 强制保存
k 上                dd 删除光标当前行           :q! 不保存离开
l 右                ndd 删除n行                 :wq! 保存后离开
0 移动到行首        yy 复制当前行                :e! 还原原始档
$ 移动到行尾        nyy 复制n行                  :w filename 另存为
H 屏幕最上          p,P 粘贴                     :set nu 设置行号
M 屏幕中央          u  撤消                      :set nonu 取消行号
L 屏幕最下          [Ctrl]+r 重做上一个动作       ZZ 保存离开
G 档案最后一行      [ctrl]+z 暂停退出            :set nohlsearch   永久地关闭高亮显示
/work 向下搜索                                   :sp 同时打开两个文档 
?work 向上搜索                                   [Ctrl]+w 两个文档设换
gg 移动到档案第一行                              :nohlsearch    暂时关闭高亮显示 认识SHELL
alias    显示当前所有的命令别名      alias lm=”ls -al”   命令别名    unalias lm 取消命令别名
type      类似which
exprot    设置或显示环境变量
exprot PATH=”$PATH”:/sbin  添加/sbin入PATH路径
echo $PATH    显示PATH路径
bash      进入子程序
name=yang     设定变量
unset name    取消变量
echo $name    显示变量的内容
myname=”$name its me”   &   myname=’$name its me’     单引号时$name失去变量内容
ciw=/etc/sysconfig/network-scripts/     设置路径
env      列出所有环境变量
echo $RANDOM    显示随意产生的数
set      设置SHELL
PS1='[/u@/h /w /A #/#]/$ ‘     提示字元的設定
   [root@linux ~]# read [-pt] variable     ———–读取键盘输入的变量
   參數:
   -p  :後面可以接提示字元!
   -t  :後面可以接等待的『秒數!』
declare    声明 shell 变量
ulimit -a   显示所有限制资料
 ls /tmp/yang && echo “exist” || echo “not exist”
 意思是說,當 ls /tmp/yang 執行後,若正確,就執行echo “exist” ,若有問題,就執行echo “not exist” 
 echo $PATH | cut -d ‘:’ -f 5       以:为分隔符,读取第5段内容
 export | cut -c 10-20      读取第10到20个字节的内容
 last | grep ‘root’    搜索有root的一行,加[-v]反向搜索
 cat /etc/passwd | sort    排序显示
 cat /etc/passwd | wc      显示『行、字数、字节数』正规表示法
[root@test root]# grep [-acinv] ‘搜尋字串’ filename
       參數說明:
       -a :將 binary 檔案以 text 檔案的方式搜尋資料
       -c :計算找到 ‘搜尋字串’ 的次數
       -i :忽略大小寫的不同,所以大小寫視為相同
       -n :順便輸出行號
       -v :反向選擇,亦即顯示出沒有 ‘搜尋字串’ 內容的那一行!
 grep -n ‘the’ 123.txt     搜索the字符 ———–搜尋特定字串       
 grep -n ‘t[ea]st’ 123.txt    搜索test或taste两个字符———利用 [] 來搜尋集合字元
 grep -n ‘[^g]oo’ 123.txt     搜索前面不为g的oo———–向選擇 [^] 
 grep -n ‘[0-9]’ 123.txt  搜索有0-9的数字
 grep -n ‘^the’ 123.txt 搜索以the为行首———–行首搜索^
 grep -n ‘^[^a-zA-Z]’ 123.txt  搜索不以英文字母开头
 grep -n ‘[a-z]$’ 123.txt    搜索以a-z结尾的行———- 行尾搜索$
 grep -n ‘g..d’ 123.txt     搜索开头g结尾d字符———-任意一個字元 . 
 grep -n ‘ooo*’ 123.txt     搜索至少有两个oo的字符———重複字元 *
sed    文本流编辑器    利用脚本命令来处理文本文件
awd    模式扫描和处理语言
 nl 123.txt | sed ‘2,5d’   删除第二到第五行的内容
diff     比较文件的差异
cmp      比较两个文件是否有差异
patch    修补文件
pr       要打印的文件格式化

帐号管理
/etc/passwd    系统帐号信息
/etc/shadow    帐号密码信息    经MD5 32位加密
     在密码栏前面加『 * 』『 ! 』禁止使用某帐号
/etc/group     系统群组信息
/etc/gshadow
newgrp    改变登陆组
useradd  &  adduser    建立新用户  ———> useradd -m test  自动建立用户的登入目录
          useradd -m -g pgroup test ———>指定所属级
/etc/default/useradd   相关设定
/etc/login.defs       UID/GID 有關的設定
passwd    更改密码 ———–> passwd test
usermod   修改用户帐号
userdel   删除帐号 ———–>userdel -r test
chsh      更换登陆系统时使用的SHELL   [-l]显示可用的SHELL;[-s]修改自己的SHELL
chfn      改变finger指令显示的信息
finger    查找并显示用户信息
id        显示用户的ID ———–>  id test
groupadd   添加组
groupmod   与usermod类似
groupdel   删除组
su test    更改用户   su –    进入root,且使用root的环境变量
sudo       以其他身份来执行指令
visudo     编辑/etc/sudoers      加入一行『 test ALL=(ALL) ALL 』
           %wheel ALL = (ALL) ALL               系统里所有wheel群组的用户都可用sudo
           %wheel ALL = (ALL) NOPASSWD: ALL     wheel群组所有用户都不用密码NOPASSWD
       User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3         加入ADMPW组
       ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, /
       !/usr/bin/passwd root      可以更改使用者密码,但不能更改root密码 (在指令前面加入 ! 代表不可)
PAM (Pluggable Authentication Modules, 嵌入式模組)
who & w     看谁在线                     
last        最近登陆主机的信息
lastlog     最近登入的時間    读取 /var/log/lastlog 
talk        与其他用户交谈
write       发送信息    write test   [ctrl]+d 发送
mesg        设置终端机的写入权限    mesg n 禁止接收     mesg y 
wall        向所有用户发送信息    wall this is q test
mail        写mail   
/etc/default/useradd    家目录默认设置quota      显示磁盘已使用的空间与限制     quota -guvs —–>秀出目前 root 自己的 quota 限制值
           quota -vu   查询
quotacheck   检查磁盘的使用空间与限制     quotacheck -avug  —–>將所有的在 /etc/mtab 內,含有 quota 支援的 partition 進行掃瞄
             [-m] 强制扫描  
     quota一定要是独立的分区,要有quota.user和quota.group两件文件,在/etc/fstab添加一句:
     /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
     chmod 600 quota*         设置完成,重启生效
edquota    编辑用户或群组的quota  [u]用户,[g]群组,[p]复制,[t]设置宽限期限 
           edquota -a yang       edquota -p yang -u young —–>复制    
quotaon    开启磁盘空间限制     quotaon -auvg ——–>啟動所有的具有 quota 的 filesystem
quotaoff   关闭磁盘空间限制     quotaoff -a  ——–>關閉了 quota 的限制
repquota -av     查閱系統內所有的具有 quota 的 filesystem 的限值狀態Quota 從開始準備 filesystem 的支援到整個設定結束的主要的步驟大概是:
1、設定 partition 的 filesystem 支援 quota 參數:
由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來說, 支援度最好的是 ext2/ext3 ,
其他的 filesystem 類型鳥哥我是沒有試過啦! 啟動 filesystem 支援 quota 最簡單就是編輯 /etc/fstab ,
使得準備要開放的 quota 磁碟可以支援 quota 囉;
2、建立 quota 記錄檔:
剛剛前面講過,整個 quota 進行磁碟限制值記錄的檔案是 aquota.user/aquota.group, 
要建立這兩個檔案就必須要先利用 quotacheck 掃瞄才行喔!
3、編輯 quota 限制值資料:
再來就是使用 edquota 來編輯每個使用者或群組的可使用空間囉;
4、重新掃瞄與啟動 quota :
設定好 quota 之後,建議可以再進行一次 quotacheck ,然後再以 quotaon 來啟動吧!
开机流程简介
1、載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號; 
2、讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊; 
3、載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置; 
4、Kernel 執行 init 程式並取得 run-level 資訊; 
5、init 執行 /etc/rc.d/rc.sysinit 檔案; 
6、啟動核心的外掛模組 (/etc/modprobe.conf); 
7、init 執行 run-level 的各個批次檔( Scripts ); 
8、init 執行 /etc/rc.d/rc.local 檔案; 
9、執行 /bin/login 程式,並等待使用者登入; 
10、登入之後開始以 Shell 控管主機。在/etc/rc.d/rc3.d內,以S开头的为开机启动,以K开头的为关闭,接着的数字代表执行顺序GRUB vga设定
彩度/解析度  640×480  800×600  1024×768  1280×1024   bit 
    256        769      771      773       775      8 bit 
   32768       784      787      790       793     15 bit 
   65536       785      788      791       794     16 bit 
   16.8M       786      789      792       795     32 bit
./configure    检查系统信息       ./configure –help | more  帮助信息
make clean     清除之前留下的文件
make           编译
make install   安装rpm -q  —–>查询是否安装             rpm -ql ——>查询该套件所有的目录
rpm -qi —–>查询套件的说明资料       rpm -qc[d] —–>设定档与说明档
rpm -ivh  —->安装                    rpm -V  ——–>查看套件有否更动过
rpm -e  ——>删除                    rpm -Uvh ——->升级安装  
–nodeps —–>强行安装                –test —–>测试安装

Linux Shell Command

Linux-shell-完全詳解命令

一、 Shell簡介:什麽是Shell,Shell命令的兩種執行方式1

二、 幾種常見的Shell1

三、 Shell腳本語言與編譯型語言的差異2

四、什麽時候使用Shell3

五、 第一個Shell腳本3

六、Shell變量:Shell變量的定義、刪除變量、只讀變量、變量類型5

七、Shell特殊變量:Shell $0, $#, $*, $@, $?, $$和命令行參數6

八、 Shell替換:Shell變量替換,命令替換,轉義字符9

九、 Shell運算符:Shell算數運算符、關系運算符、布爾運算符、字符串運算符12

十、 Shell註釋20

十一、 Shell字符串20

十二、Shell數組:shell數組的定義、數組長度21

十三、 Shell echo命令23

十四、 shell printf命令:格式化輸出語句24

十五、Shell if else語句25

十六、Shell case esac語句28

十七、Shell for循環30

十八、Shell while循環31

十九、Shell until循環32

二十、Shell break和continue命令33

二十一、Shell函數:Shell函數返回值、刪除函數、在終端調用函數35

二十二、Shell函數參數37

二十三、Shell輸入輸出重定向:Shell Here Document,/dev/null文件38

二十四、Shell文件包含41

Linux-shell-完全詳解(1)
一、Shell簡介:什麽是Shell,Shell命令的兩種執行方式

Shell本身是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。作為命令語言,它交互式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變量和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。
它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程序、建立文件並以並行的方式協調各個程序的運行。因此,對於用戶來說,shell是最重要的實用程序,深入了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。
Shell有兩種執行命令的方式:

1、交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。

2、批處理(batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。
Shell腳本和編程語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。
Shell初學者請註意,在平常應用中,建議不要用 root 帳號運行 Shell 。作為普通用戶,不管您有意還是無意,都無法破壞系統;但如果是 root,那就不同了,只要敲幾個字母,就可能導致災難性後果。

二、幾種常見的Shell

上面提到過,Shell是一種腳本語言,那麽,就必須有解釋器來執行這些腳本。
Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell腳本解釋器。

bash

bash是Linux標準默認的shell,本教程也基於bash講解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。
Linux使用它作為默認的shell是因為它有諸如以下的特色:

可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。

1、自動通過查找匹配的方式給出以某字符串開頭的命令。

2、包含了自身的幫助功能,你只要在提示符下面鍵入help就可以得到相關的幫助。

sh

sh

由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell。

ash

ash shell 是由Kenneth Almquist編寫的,Linux中占用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。

csh

csh 是Linux比較大的內核,它由以William Joy為代表的共計47位作者編成,共有52個內部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

ksh

ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優點是幾乎和商業發行版的ksh完全兼容,這樣就可以在不用花錢購買商業版本的情況下嘗試商業版本的性能了。

註意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是說,用sh寫的腳本可以不加修改的在bash中執行。

三、Shell腳本語言與編譯型語言的差異

大體上,可以將程序設計語言可以分為兩類:編譯型語言和解釋型語言。

編譯型語言

很多傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言需要預先將我們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱作“編譯”。
運行程序時,直接讀取目標代碼(object code)。由於編譯後的目標代碼(object code)非常接近計算機底層,因此執行效率很高,這是編譯型語言的優點。
但是,由於編譯型語言多半運作於底層,所處理的是字節、整數、浮點數或是其他機器層級的對象,往往實現一個簡單的功能需要大量復雜的代碼。例如,在C++裏,就很難進行“將一個目錄裏所有的文件復制到另一個目錄中”之類的簡單操作。

解釋型語言

解釋型語言也被稱作“腳本語言”。執行這類程序時,解釋器(interpreter)需要讀取我們編寫的源代碼(source code),並將其轉換成目標代碼(object code),再由計算機運行。因為每次執行程序都多了編譯的過程,因此效率有所下降。

使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awkperl、Python、Ruby與Shell。

四、什麽時候使用Shell

因為Shell似乎是各UNIX系統之間通用的功能,並且經過了POSIX的標準化。因此,Shell腳本只要“用心寫”一次,即可應用到很多系統上。因此,之所以要使用Shell腳本是基於:

1、簡單性:Shell是一個高級語言;通過它,你可以簡潔地表達復雜的操作。

2、可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可在不同的系統上執行。

3、開發容易:可以在短時間內完成一個功能強大又妤用的腳本
但是,考慮到Shell腳本的命令限制和效率問題,下列情況一般不使用Shell:

1、資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)。

2、需要處理大任務的數學操作,尤其是浮點運算,精確運算,或者復雜的算術運算(這種情況一般使用C++或FORTRAN 來處理)。

3、有跨平臺(操作系統)移植需求(一般使用C 或Java)。

4、復雜的應用,在必須使用結構化編程的時候(需要變量的類型檢查,函數原型,等等)。

5、對於影響系統全局性的關鍵任務應用。

6、對於安全有很高要求的任務,比如你需要一個健壯的系統來防止入侵、破解、惡意破壞等等。

7、項目由連串的依賴的各個部分組成。

8、需要大規模的文件操作。

9、需要多維數組的支持。

10、需要數據結構的支持,比如鏈表或數等數據結構。

11、需要產生或操作圖形化界面 GUI。

12、需要直接操作系統硬件。

13、需要 I/O 或socket 接口。

14、需要使用庫或者遺留下來的老代碼的接口。

15、私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。


如果你的應用符合上邊的任意一條,那麽就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言比如C/C++,或者是Java。即使如此,你會發現,使用shell來原型開發你的應用,在開發步驟中也是非常有用的。

五、第一個Shell腳本

打開文本編輯器,新建一個文件,擴展名為sh(sh代表shell),擴展名並不影響腳本執行,見名知意就好,如果你用php寫shell 腳本,擴展名就用php好了。

輸入一些代碼:

#!/bin/bash

echo “Hello World !”

“#!” 是一個約定的標記,它告訴系統這個腳本需要什麽解釋器來執行,即使用哪一種Shell。echo命令用於向窗口輸出文本。

運行Shell腳本有兩種方法。

作為可執行程序

將上面的代碼保存為test.sh,並 cd 到相應目錄:

chmod +x ./test.sh  #使腳本具有執行權限./test.sh  #執行腳本

註意,一定要寫成./test.sh,而不是test.sh。運行其它二進制的程序也一樣,直接寫test.sh,linux系統會去PATH裏尋找有沒有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH裏,你的當前目錄通常不在PATH裏,所以寫成test.sh是會找不到命令的,要用./test.sh告訴系統說,就在當前目錄找。

通過這種方式運行bash腳本,第一行一定要寫對,好讓系統查找到正確的解釋器。

這裏的”系統”,其實就是shell這個應用程序(想象一下Windows Explorer),但我故意寫成系統,是方便理解,既然這個系統就是指shell,那麽一個使用/bin/sh作為解釋器的腳本是不是可以省去第一行呢?是的。

作為解釋器參數

這種運行方式是,直接運行解釋器,其參數就是shell腳本的文件名,如:

/bin/sh test.sh/bin/php test.php

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

再看一個例子。下面的腳本使用 read 命令從 stdin 獲取輸入並賦值給 PERSON 變量,最後在 stdout 上輸出:

#!/bin/bash

# Author : mozhiyan

# Copyright (c) http://see.xidian.edu.cn/cpp/linux/

# Script follows here:

echo “What is your name?”

read PERSON

echo “Hello, $PERSON”

運行腳本:

chmod +x ./test.sh$./test.shWhat is your name?mozhiyanHello, mozhiyan$

六、Shell變量:Shell變量的定義、刪除變量、只讀變量、變量類型

Shell支持自定義變量。

定義變量

定義變量時,變量名不加美元符號($),如:

variableName=”value”

註意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:

1、首個字符必須為字母(a-z,A-Z)。

2、中間不能有空格,可以使用下劃線(_)。

3、不能使用標點符號。

4、不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。


變量定義舉例:

myUrl=”http://see.xidian.edu.cn/cpp/linux/”

myNum=100

使用變量

使用一個定義過的變量,只要在變量名前面加美元符號($)即可,如:

your_name=”mozhiyan”

echo $your_name

echo ${your_name}

變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:

for skill in Ada Coffe Action Java

do

    echo “I am good at ${skill}Script”

done

如果不給skill變量加花括號,寫成echo “I am good at $skillScript”,解釋器就會把$skillScript當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。

推薦給所有變量加上花括號,這是個好的編程習慣。

重新定義變量

已定義的變量,可以被重新定義,如:

myUrl=”http://see.xidian.edu.cn/cpp/linux/”

echo ${myUrl}

myUrl=”http://see.xidian.edu.cn/cpp/shell/”

echo ${myUrl}

這樣寫是合法的,但註意,第二次賦值的時候不能寫 $myUrl=”http://see.xidian.edu.cn/cpp/shell/”,使用變量的時候才加美元符($)。

只讀變量

使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。

下面的例子嘗試更改只讀變量,結果報錯:

#!/bin/bash

myUrl=”http://see.xidian.edu.cn/cpp/shell/”

readonly myUrl

myUrl=”http://see.xidian.edu.cn/cpp/danpianji/”

運行腳本,結果如下:

/bin/sh: NAME: This variable is read only.

刪除變量

使用 unset 命令可以刪除變量。語法:

unset variable_name

變量被刪除後不能再次使用;

unset 命令不能刪除只讀變量。

舉個例子:

#!/bin/sh

myUrl=”http://see.xidian.edu.cn/cpp/u/xitong/”

unset myUrl

echo $myUrl

上面的腳本沒有任何輸出。

變量類型

運行shell時,會同時存在三種變量:

1) 局部變量

局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。

2) 環境變量

所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。

3) shell變量

shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行。

七、Shell特殊變量:Shell $0, $#, $*, $@, $?, $$和命令行參數

前面已經講到,變量名只能包含數字、字母和下劃線,因為某些包含其他字符的變量有特殊含義,這樣的變量被稱為特殊變量。

例如,$ 表示當前Shell進程的id,即pid,看下面的代碼:

$echo $$

運行結果

29949

特殊变量列表
变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(” “)包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

命令行参数

運行腳本時傳遞給腳本的參數稱為命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。

請看下面的腳本:

#!/bin/bash

echo “file Name: $0″

echo “First Parameter : $1”

echo “First Parameter : $2”

echo “Quoted Values: $@”

echo “Quoted Values: $*”

echo “Total Number of Parameters : $#”

運行結果:

$./test.sh Zara AliFile Name : ./test.shFirst Parameter : ZaraSecond Parameter : AliQuoted Values: Zara AliQuoted Values: Zara AliTotal Number of Parameters : 2

$* 和 $@ 的區別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(” “)包含時,都以”$1” “$2” … “$n” 的形式輸出所有參數。

但是當它們被雙引號(” “)包含時,”$*” 會將所有的參數作為一個整體,以”$1 $2 … $n”的形式輸出所有參數;”$@” 會將各個參數分開,以”$1″ “$2” … “$n” 的形式輸出所有參數。

下面的例子可以清楚的看到 $* 和 $@ 的區別:

#!/bin/bash

echo “\$*=” $*

echo “\”\$*\”=” “$*”

echo “\$@=” $@

echo “\”\$@\”=” “$@”

echo “print each param from \$*”

for var in $*

do

    echo “$var”

done

echo “print each param from \$@”

for var in $@

do

    echo “$var”

done

echo “print each param from \”\$*\””

for var in “$*”

do

    echo “$var”

done

echo “print each param from \”\$@\””

for var in “$@”

do

    echo “$var”

done

執行 ./test.sh “a” “b” “c” “d”,看到下面的結果:

$*=  a b c d”$*”= a b c d$@=  a b c d”$@”= a b c dprint each param from $*abcdprint each param from $@abcdprint each param from “$*”a b c dprint each param from “$@”abcd

退出狀態

$? 可以獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其他值,表示不同類型的錯誤。


下面例子中,命令成功執行:

$./test.sh Zara AliFile Name : ./test.shFirst Parameter : ZaraSecond Parameter : AliQuoted Values: Zara AliQuoted Values: Zara AliTotal Number of Parameters : 2$echo $?0$


$? 也可以表示函數的返回值,後續將會講解。

八、Shell替換:Shell變量替換,命令替換,轉義字符

如果表達式中包含特殊字符,Shell 將會進行替換。例如,在雙引號中使用變量就是一種替換,轉義字符也是一種替換。

舉個例子:

#!/bin/bash

a=10

echo -e “Value of a is $a \n”

運行結果:

Value of a is 10

這裏 -e 表示對轉義字符進行替換。如果不使用 -e 選項,將會原樣輸出:

Value of a is 10\n


下面的轉義字符都可以用在 echo 中:

转义字符含义
\\反斜杠
\a警报,响铃
\b退格(删除键)
\f换页(FF),将当前位置移到下页开头
\n换行
\r回车
\t水平制表符(tab键) 
\v垂直制表符

可以使用 echo 命令的 -E 選項禁止轉義,默認也是不轉義的;使用 -n 選項可以禁止插入換行符。

命令替換

命令替換是指Shell可以先執行命令,將輸出結果暫時保存,在適當的地方輸出。

命令替換的語法:

`command`

註意是反引號,不是單引號,這個鍵位於 Esc 鍵下方。

下面的例子中,將命令執行結果保存在變量中:

#!/bin/bash

date=`date`

echo “Date is $DATE”

users=`who | wc -l`

echo “Logged in user are $USERS”

UP=`date ; uptime`

echo “Uptime is $UP”

運行結果:

Date is Thu Jul  2 03:59:57 MST 2009Logged in user are 1Uptime is Thu Jul  2 03:59:57 MST 200903:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

變量替換

變量替換可以根據變量的狀態(是否為空、是否定義等)來改變它的值

可以使用的變量替換形式:

形式说明
${var}变量本来的值
${var:-word}如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}如果变量 var 为空或已被删除(unset),那么返回 word,并将var 的值设置为 word。
${var:?message}如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。

若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word}如果变量 var 被定义,那么返回 word,但不改变 var 的值。

請看下面的例子:

#!/bin/bash echo ${var:-“Variable is not set“}echo “1 – Value of var is ${var}” echo ${var:=”Variable is not set”}echo “2 – Value of var is ${var}” unset varecho ${var:+”This is default value”}echo “3 – Value of var is $var” var=”Prefix”echo ${var:+”This is default value”}echo “4 – Value of var is $var” echo ${var:?”Print this message”}echo “5 – Value of var is ${var}”

運行結果:

Variable is not set

1 – Value of var is

Variable is not set

2 – Value of var is Variable is not set

3 – Value of var is

This is default value

4 – Value of var is Prefix

Prefix

5 – Value of var is Prefix

VI命令详解

vi命令示例大全

命令历史

以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。

进入vi

vi filename # 打开或新建文件,并将光标置于第一行首
vi +n filename # 打开文件,并将光标置于第n行首
vi + filename # 打开文件,并将光标置于最后一行首
vi +/pattern filename # 打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename # 在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename # 打开多个文件,依次进行编辑

文件命令

打开单个文件
vim file

同时打开多个文件
vim file1 file2 file3 …

在vim窗口中打开一个新文件
:open file

在新窗口中打开文件
:split file

切换到下一个文件
:bn

切换到上一个文件
:bp

查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。
:args

打开远程文件,比如ftp或者share folder
:e ftp://192.168.10.76/abc.txt
:e \qadrive\test\1.txt

vim的模式

正常模式(按Esc或Ctrl+[进入) 左下角显示文件名或为空

插入模式(按i键进入) 左下角显示–INSERT–

可视模式(不知道如何进入) 左下角显示–VISUAL–

保存退出

w # 保存当前文件
w /tmp1 # 另存为/tmp1
20,59w /tmp1 # 仅将20-59行之间的内存另存为/tmp1
x 或 wq # 保存退出
q # 退出vi
q! # 退出不保存
!command # 执行shell命令command
n1,n2 w !command # 将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
r !command # 将命令command的输出结果放到当前行
w !sudo tee % # 保存没权限时,可获取权限再保存

导航

h # 光标左移一个字符
l # 光标右移一个字符
space # 光标右移一个字符
Backspace # 光标左移一个字符
k 或 Ctrl+p # 光标上移一行
j 或 Ctrl+n # 光标下移一行
Enter # 光标下移一行
w 或 W # 光标右移一个字至字首
b 或 B # 光标左移一个字至字首
e 或 E # 光标右移一个字至字尾
) # 光标移至句尾
( # 光标移至句首
} # 光标移至段落开头
{ # 光标移至段落结尾
nG # 光标移至第n行首
n+ # 光标下移n行
n- # 光标上移n行
n$ # 光标移至第n行尾
H # 光标移至屏幕顶行
M # 光标移至屏幕中间行
L # 光标移至屏幕最后行
0 # (注意是数字零)光标移至当前行首
$ # 光标移至当前行尾
% 括号匹配

屏幕翻滚

Ctrl+u # 向文件首翻半屏
Ctrl+d # 向文件尾翻半屏
Ctrl+f # 向文件尾翻一屏
Ctrl+b # 向文件首翻一屏
nz # 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部

插入

i # 在光标前
I # 在当前行首
a # 光标后
A # 在当前行尾
o # 在当前行之下新开一行
O # 在当前行之上新开一行
r # 替换当前字符
R # 替换当前字符及其后的字符,直至按ESC键
s # 从当前光标位置处开始,以输入的文本替代指定数目的字符
S # 删除指定数目的行,并以所输入文本代替之
ncw 或 nCW # 修改指定数目的字
nCC # 修改指定数目的行

删除

ndw 或 ndW # 删除光标处开始及其后的n-1个字
do # 删至行首
d$ # 删至行尾
ndd # 删除当前行及其后n-1行
x 或 X # 删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u # 删除输入方式下所输入的文本
n1,n2 d # 将n1行到n2行之间的内容删除
%d # 删除全部内容
1,$d # 删除全部内容

复制粘贴、剪切、移动

yy # 复制当前行
nyy # 复制当前行开始的n行
先按 v 然后方向键选择区域,按 y 复制选中行
dd # 剪切当前行
p(小) # 在当前光标处下面粘贴内容。
P(大) # 在当前光标处上面粘贴内容
n1,n2 co n3 # 将n1行到n2行之间的内容拷贝到第n3行下
n1,n2 m n3 # 将n1行到n2行之间的内容移至到第n3行下

vi编辑器中的各种(整行,多行,一个单词)复制

2014年06月06日 18:03:02 笑笑小懒猪 阅读数 7359那么vi编辑器中的整行(多行)复制与粘贴就非常必要了。

    1、复制

   1)单行复制

   在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制;

   2)多行复制

   在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3……

    2、粘贴

   在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴

vi复制多行文本的方法
方法1:
光标放到第6行,
输入:2yy
光标放到第9行,
输入:p
此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面。
方法2:
命令行模式下输入
6,9 co 12
复制第6行到第9行之间的内容到第12行后面。
方法3:
有时候不想费劲看多少行或复制大量行时,可以使用标签来替代
光标移到起始行,输入ma
光标移到结束行,输入mb
光标移到粘贴行,输入mc
然后 :’a,’b co ‘c  把 co 改成 m就成剪切了
要删除多行的话,可以用 :5, 9de

vi复制一个单词的方法

光标移到想要被复制词的词首,输入yw
光标移到想到粘贴的位置,输入p

vi复制几个字母(字符)的方法

光标移到想要被复制字符的首位置,若想复制5个字符输入:5yl

光标移到想到粘贴的位置,输入p

搜索(查找)

/abc # 从光标开始处向文件尾搜索abc
?abc # 从光标开始处向文件首搜索abc
/\/abc # 从光标开始处向文件尾搜索/abc,其中/是转义
n # 在同一方向重复上一次搜索命令
N # 在反方向上重复上一次搜索命令

替换

s/vivian/sky/ # 替换当前行第一个 vivian 为 sky
s/vivian/sky/g # 替换当前行所有 vivian 为 sky
n,$s/vivian/sky/ # 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
n,$s/vivian/sky/g # 替换第 n 行开始到最后一行中每一行所有 vivian 为sky
%s/vivian/sky/g # (等同于 g/vivian/s//sky/) 替换每一行的每一个 vivian 为 sky
s#vivian/#sky/# # 替换当前行第一个 vivian/ 为 sky/(可以使用 #或+作为分隔符,此时中间出现的 / 不会作为分隔符)
s/p1/p2/g # 将当前行中所有p1均用p2替代
n1,n2s/p1/p2/g # 将第n1至n2行中所有p1均用p2替代
g/p1/s//p2/g # 将文件中所有p1均用p2替换

寄存器

"?nyy # 将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw # 将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl # 将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p # 取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd # 将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

选项设置

set number # 显示行号
set number! # 不显示行号,其它选项同理加!号
set all # 列出所有选项设置情况
set term # 设置终端类型
set ignorance # 在搜索中忽略大小写
set list # 显示制表位(Ctrl+I)和行尾标志($)
set report # 显示由面向行的命令修改过的数目
set terse # 显示简短的警告信息
set warn # 在转到别的文件时若没保存当前文件则显示NO write信息
set nomagic # 允许在搜索模式中,使用前面不带“”的特殊字符
set nowrapscan # 禁止vi在搜索到达文件两端时,又从另一端开始
set mesg # 允许vi显示其他用户用write写到自己终端上的信息

插入命令

i 在当前位置生前插入

I 在当前行首插入

a 在当前位置后插入

A 在当前行尾插入

o 在当前行之后插入一行

O 在当前行之前插入一行

查找命令

/text  查找text,按n健查找下一个,按N健查找前一个。

?text  查找text,反向查找,按n健查找下一个,按N健查找前一个。

vim中有一些特殊字符在查找时需要转义  .*[]^%/?~$

:set ignorecase  忽略大小写的查找

:set noignorecase  不忽略大小写的查找

查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。

:set hlsearch  高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。

:set nohlsearch  关闭高亮搜索显示

:nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。

:set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。

:set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。

替换命令

ra 将当前字符替换为a,当期字符即光标所在字符。

s/old/new/ 用old替换new,替换当前行的第一个匹配

s/old/new/g 用old替换new,替换当前行的所有匹配

%s/old/new/ 用old替换new,替换所有行的第一个匹配

%s/old/new/g 用old替换new,替换整个文件的所有匹配

:10,20 s/^/ /g 在第10行知第20行每行前面加四个空格,用于缩进。

ddp 交换光标所在行和其下紧邻的一行。

移动命令

h 左移一个字符
l 右移一个字符,这个命令很少用,一般用w代替。
k 上移一个字符
j 下移一个字符

以上四个命令可以配合数字使用,比如20j就是向下移动20行,5h就是向左移动5个字符,在Vim中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!,这里的Esc是必须的,否则命令不生效。

w 向前移动一个单词(光标停在单词首部),如果已到行尾,则转至下一行行首。此命令快,可以代替l命令。

b 向后移动一个单词 2b 向后移动2个单词

e,同w,只不过是光标停在单词尾部

ge,同b,光标停在单词尾部。

^ 移动到本行第一个非空白字符上。

0(数字0)移动到本行第一个字符上,

移动到本行第一个字符。同0健。

$ 移动到行尾 3$ 移动到下面3行的行尾

gg 移动到文件头。 = [[

G(shift + g) 移动到文件尾。 = ]]

f(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符。

F 同f,反向查找。

跳到指定行,冒号+行号,回车,比如跳到240行就是 :240回车。另一个方法是行号+G,比如230G跳到230行。

Ctrl + e 向下滚动一行

Ctrl + y 向上滚动一行

Ctrl + d 向下滚动半屏

Ctrl + u 向上滚动半屏

Ctrl + f 向下滚动一屏

Ctrl + b 向上滚动一屏

撤销和重做

u 撤销(Undo)

U 撤销对整行的操作

Ctrl + r 重做(Redo),即撤销的撤销。

删除命令

x 删除当前字符

3x 删除当前光标开始向后三个字符

X 删除当前字符的前一个字符。X=dh

dl 删除当前字符, dl=x

dh 删除前一个字符

dd 删除当前行

dj 删除上一行

dk 删除下一行

10d 删除当前行开始的10行。

D 删除当前字符至行尾。D=d$

d$ 删除当前字符之后的所有字符(本行)

kdgg 删除当前行之前所有行(不包括当前行)

jdG(jd shift + g) 删除当前行之后所有行(不包括当前行)

:1,10d 删除1-10行

:11,$d 删除11行及以后所有的行

:1,$d 删除所有行

J(shift + j)  删除两行之间的空行,实际上是合并两行。

拷贝和粘贴

yy 拷贝当前行

nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。

p 在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。

shift+p 在当前行前粘贴

:1,10 co 20 将1-10行插入到第20行之后。

:1,$ co $ 将整个文件复制一份并添加到文件尾部。

正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制

ddp交换当前行和其下一行

xp交换当前字符和其后一个字符

剪切命令

正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切

ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴

:1,10d 将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。

:1, 10 m 20 将第1-10行移动到第20行之后。

退出命令

:wq 保存并退出

ZZ 保存并退出

:q! 强制退出并忽略所有更改

:e! 放弃所有修改,并打开原来文件。

窗口命令

:split或new 打开一个新窗口,光标停在顶层的窗口上

:split file或:new file 用新窗口打开文件

split打开的窗口都是横向的,使用vsplit可以纵向打开窗口。

Ctrl+ww 移动到下一个窗口

Ctrl+wj 移动到下方的窗口

Ctrl+wk 移动到上方的窗口

关闭窗口

:close 最后一个窗口不能使用此命令,可以防止意外退出vim。
:q 如果是最后一个被关闭的窗口,那么将退出vim。

ZZ 保存并退出。

关闭所有窗口,只保留当前窗口
:only

录制宏

按q键加任意字母开始录制,再按q键结束录制(这意味着vim中的宏不可嵌套),使用的时候@加宏名,比如qa。。。q录制名为a的宏,@a使用这个宏。

执行shell命令

:!command

:!ls 列出当前目录下文件

:!perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。

:!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。

:suspend或Ctrl – Z 挂起vim,回到shell,按fg可以返回vim。

注释命令

perl程序中#开始的行为注释,所以要注释某些行,只需在行首加入#

3,5 s/^/#/g 注释第3-5行

3,5 s/^#//g 解除3-5行的注释

1,$ s/^/#/g 注释整个文档。

:%s/^/#/g 注释整个文档,此法更快。

帮助命令

:help or F1 显示整个帮助
:help xxx 显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。
:help ‘number’ Vim选项的帮助用单引号括起
:help 特殊键的帮助用<>扩起
:help -t Vim启动参数的帮助用-
:help i_ 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式

帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回

其他非编辑命令

. 重复前一次命令

:set ruler?  查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看

:scriptnames  查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等。

:set list 显示非打印字符,如tab,空格,行尾等。如果tab无法显示,请确定用set lcs=tab:>-命令设置了.vimrc文件,并确保你的文件中的确有tab,如果开启了expendtab,那么tab将被扩展为空格。

完全なLinuxがWindows 10上で稼働する? 「WSL 2」とは

6/19(水) 5:05配信

@IT

WSL 1とWSL 2のアーキテクチャの違い WSL 1は、サブシステムが特殊なプロセス環境を作り、Linuxのカーネル機能をNTカーネルの機能呼び出しに変換してLinuxプログラムを実行する環境を作っていた。このためWSL 1ではLinuxカーネル自体は存在していなかった。これに対してWSL 2では仮想マシン内に専用パッチを当てたLinuxカーネルを動かし、Linuxの実行環境を作る。Linuxカーネルが動作するためほとんどのLinuxプログラムを動作させることができる。

 2019年5月に米国シアトルで開催されたMicrosoftの開発者向けイベント「Build 2019」で、現在のWindows Subsystem for Linux(WSL)を強化した「WSL 2」が発表された(Microsoft Devblog「Announcing WSL 2」「WSL 2 Post BUILD FAQ)。本稿では、発表されたWSL 2のアーキテクチャを紹介しつつ、その特徴や現行のWSL(以下区別のためにWSL 1と表記する)との違い、そして今後の予定について解説する。

【画像:WSL 2の構成】WSL 2とは何か?

 WSL 2最大の特徴は、仮想マシンを使い、Linuxカーネルが動作する「本物のLinux環境」であるということだ。

WSL 1は、Linux実行環境をLinuxカーネルではなく、LXCore と呼ばれる「サブシステム」が作り出しており、カーネルへのファンクションコールをWindowsカーネルへのファンクションコールに変換して動作している。

 これに対してWSL 2は、専用の仮想マシン環境である「Light Weight utility Virtual Machine」(軽量ユーティリティーVM)を使い、ローカルパッチ(Microsoftによる独自パッチ)を当てたLinuxカーネルバイナリを動作させ、仮想マシン内にLinuxの実行環境を作る。

 「Hyper-V仮想マシンサービスを使ったLinuxの仮想マシンならば、これまでもあったではないか!」と思われる方もいるかもしれない。だが、この軽量ユーティリティーVMを使ったWSL 2では、仮想マシン環境が起動し、bashがコマンドを受け付けるまで2秒程度という速度で起動できる。

 このため、コマンドプロンプトなどからwsl.exeなどを使ってbashコマンドを処理する時間は、現在のWSL 1とほとんど変わらない。また、本物のLinux実行環境であるため、これまで正しく動作できなかったアプリケーション、例えばコンテナシステム(Dockerなど)やユーザーファイルシステム(FUSEなど)も動作させることができる。その上で、現在のWSL 1と同等の機能と使い勝手を実現するという。

■WSL 2はWSL 1を置き換えずに併存する

 WSL 2が登場したからといって、WSL 1は廃止になるわけではなく、引き続き利用可能である。Windows OSの仮想マシン支援機能は、Intel VTおよびAMDvにのみ対応しているため、現時点では、Hyper-Vが組み込まれていないARM64版(Windows On ARM。WOA)では、WSL 1が引き続き使われるものと考えられる。

 また、Hyper-Vでは動作条件として最低4GBのメモリが指定されているため、メモリ2GBといった低スペックのマシンなどもWSL 1がカバーすることになると考えられる。

 さらに、Hyper-Vベースの仮想マシン技術を使うものの、WSL 2は、Windows 10 Homeに対しても提供が行われるという(HomeではHyper-Vが無効にされている)。

WSL 2はいつリリースされるのか?

 WSL 2は、2019年6月末には、Windows Insider Programでのプレビューが開始されるという。おそらく、現在プレビュー中のWindows 10の2020年春にリリース予定の機能アップデート「20H1」のプレビュー版に入る形で配布が行われるのではないかと考えられる。

 つまり、正式配布は2020年5月のWindows 10バージョン2003となる。ただし、まだ、「19H2」と呼ばれる2019年10月に提供予定のWindows 10バージョン1909のプレビューは開始されておらず、そのタイミングは6月後半といわれている。そのため、「19H2」「20H1」の両方でプレビューが行われ、2019年内に正式配布が開始される可能性もある。

■コンソールを一新する「Windowsターミナル」

 同イベントでは、新しいコンソールプログラムとなるWindowsターミナルも同時に発表されている。これは、タブ形式で複数セッションを同時に行えるコンソールウィドウプログラムで、DirectWrite(Microsoft DirectXのコンポーネントの1つ)などを使い、「近代的」な文字表示システムを持つ。これにより、絵文字の表示や「合字」、Programming Ligature(プログラミング用に、同一文字でも前後の文字により区別して表示するなどのフォントの機能)などに対応できるようになった。

 Windowsターミナルについては、別途解説する予定だ。WSL 1を振り返る

 WSL 2の具体的な実装について解説する前に、少しだけWSL 1について復習しておく。WSL 1は、Windows NT時代からある「サブシステム」を利用している。サブシステムとは、異なるOS環境を実現するための仕組みで、当初は、Windows OS内でPOSIX準拠アプリケーションを実行するために作られた。当時、米国政府調達に応じるコンピュータシステムには、全てPOSIX対応が義務付けられていたからだ(現在は義務化されていない)。1993年にリリースされた最初のWindows NTには、POSIX、OS/2およびWin32サブシステムなどが組み込まれていた。

 その後、POSIX SubsystemはWindows XPでSFU(Service for UNIX)となり、Windows 7のSUA(Subsystem for UNIX-Based Application)まで、オプション機能などで利用されることになったが、Windows 8で廃止された。

 この仕組みを改良し、OS側がまったく見えない「プレーン」な実行環境であるpicoプロセスをベースに開発されたのがWSL 1である。WSL 1には、Linuxカーネルは存在せず、Linuxカーネルへのファンクションコールをサブシステム側で受け、これを解釈してWindowsカーネルへのファンクションコールに変換している。

 また、専用のinitプロセス(Linuxで最初に起動するプログラム。通常は初期設定や常駐デーモンの起動などを行う)が起動し、実行環境を整備する。Linuxアプリケーション側からは、通常のLinux環境のように見えるが、全てのカーネルファンクションコールに対応しているわけではない。結局、WindowsとLinuxカーネルの違いなどから完全にLinuxとの互換性を持たせることができない。

 ファイルシステムに関しては、NTFS上の特定フォルダ以下を利用し、Windows OSで使わないメタデータなどを使ってアクセス制御などを可能にした「VolFs」が使われる。なお、VolFsやWSL 1内からWin32側のファイルシステムにアクセスする「DrvFs」などは、LinuxのVFS(仮想ファイルシステム)の仕組みを使う。

 こうした構造であるため、まとめるとWSL 1には以下のようなLinuxと非互換の部分がある。

・全てのカーネルファンクションが実装されていない
・一部のカーネルファンクションでは、Linuxと完全な互換性が取れない(ファイルがオープンされているとき、ファイル名を変更することはWindows OSではできないが、Linuxのネイティブファイルシステムでは可能など)
・スケジューリングやメモリ管理、デバイス管理などはWindowsカーネルが行う

WSL 2では性能と互換性が向上

 WSL 2では、特にカーネルファンクションの互換性を高めるため、Linuxカーネルそのものを使う。ただし、公開されているカーネルのソースコードに対して、WSL 2専用のパッチを適用してバイナリコードを生成して利用する。とはいえ、カーネルはLinuxそのものであるため、ファンクションコールの互換性はそのままである。

 また、Linuxの起動ファイルシステムには、ext4を利用する。ただし、仮想環境内であるため、Windows OSの仮想ディスクを利用し、NTFS上のVHDXファイル上に構築される。これをアクセスするコードもLinuxのext4ファイルシステムのコードであり、従来のVolFsに比べて高速化が期待できる。

 Microsoftによれば、ファイルアクセス中心のアプリケーションでは、WSL 1のVolFsに対して「git clone」(gitでリポジトリ内の全ソースコード全てをコピーするコマンド)で2.5倍、cmakeで3.1倍、npm install(Node.jsのパッケージインストールコマンド)で4.7倍に高速化されたという。ただし、WSL 1のVolFsとWSL 2のネイティブファイルシステムがあるVHDXは、直接の互換性がない。Microsoftは変換コマンドを用意し、相互に変換できるようにするとのことだ。WSL 2の実装

 ここからは、WSL 2の具体的な実装に踏み込み、WSL 1と比べて何が変わるのか、どのようなメリット/デメリットがあるのか解説していく。

■WSL 2は専用の仮想マシン内で起動

 WSL 2は、専用の仮想マシン内で起動するが、その起動はWSL 1と同じくwsl.exe(あるいはbash.exeやubuntu.exe)から行われる。wsl.exeは、WSL 1と同じく、Win32側でWSLを制御する「Lxssマネージャーサービス」を呼び出して、Linux環境の起動を要求する。仮想マシンの立ち上げは、Windows OSのコンテナ支援サービスである「ホストコンピュートサービス」を介して行われる。

 その後、Lxssは、仮想マシンでLinuxディストリビューションを起動する(どのディストリビューションを起動するのかはwsl.exeの引数やデフォルト設定から決定される)。Linux環境では、最初のプロセスとしてWSL専用のinitが起動し、デーモンなどを起動することなく、bash.exeが起動される。このとき、bashには、wsl.exeに指定された引数や標準出力などが渡され、bashの出力は、wsl.exeが起動していたコンソールへと接続されることになる。

■標準ファイルシステムはext4、実体はHyper-Vの仮想ディスク

 WSL 1には、VolFs、DrvFsが実装され、自身のファイルシステム(VolFs)に加えて、Win32側のストレージデバイスへのアクセス(DrvFs)が行えた。また、Windows 10 May 2019 Update(バージョン1903)からは、「wsl$」という仮想ホストを使ったWin32からVolFsへのアクセス機能が搭載されている。WSL 2でも、同様に、「Win32からWSL 2のファイルシステム」へのアクセス、「WLS 2からWin32のファイルシステム」へのアクセスが可能になる。

 ただし、その実装はWSL 1と異なる。1つは、WSL 2のネイティブファイルシステムがext4ファイルシステムとなり、Hyper-Vを介して、仮想HDDで構築されることになる。

■ファイル共有プロトコル「9P」でWSL 1との互換性を確保

 しかし、wsl$によるファイルアクセスは、WSL環境専用のinitプロセスに含まれる9Pサーバと、Windows 10側の9Pクライアント(ネットワークプロバイダー)によりネットワークファイルシステムとして実現されているため、実は、この部分は変更なく利用可能となる。

 9Pは、Plan 9 from Bell Labs(Plan 9と略すことが多い)というOS用に開発されたファイル共有プロトコルで、もともとはPlan 9 Filesystem Protocolと呼ばれていた。WSLに使われているのは、9P2000.Lと呼ばれるLinux向けのバージョンだ。ネットワークファイルシステムなら、MicrosoftのSMBを使えばいいのではという話もあるが、Linuxには、SMBの実装であるSambaやこれを使った仮想ファイルシステムがある。

 しかし、これはそもそもLinuxの標準的なパッケージではあるものの、必ずしも全てのLinuxディストリビューションに含まれているわけではないし、ユーザーがSambaを別の目的に利用したいこともあるだろう。

 Sambaの設定ファイルはシステムに1つであり、これをWSLで占有してしまうと、ユーザーの利用に制限が出てしまう。またゼロから作るにしては、SMBは複雑すぎる。このためMicrosoftは、SMBによるVolFsの共有を断念し、別のプロトコルを探すことにした(Microsoftには、WindowsにGPLソフトウェアを同梱できないという社内問題もあったようだ)。

 Microsoftは、Linuxコンテナ用にWindows OS用の9Pサーバを開発していた。Linuxカーネルには、9Pクライアントが組み込まれていて、対応が容易だったからだ。そのため、これを利用することにした。なお、9Pの制御はLxssマネージャーサービスが行うが、9Pサーバとクライアントの通信は、UNIXソケット(AF_UNIX)を介して行われる。WSL 2でもこの仕組みは維持されるようだ。

 ただし、Windows 10 May 2019 Updateに含まれるwsl$ファイルシステムは、UNCとして「//wsl$/<ディストリビューション名>/パス」という構造を取るため、このままでは、WSL 1とWSL 2の同一ディストリビューション同士のパス名が同じになってしまう可能性がある。Microsoftによれば、WSL 1とWSL 2を同時に利用することも可能だとしている。おそらくは、「wsl2$のような仮想ホスト名を使うなどして、両者を区別できるようなUNCを使うことになると考えられる。

■WSLからWin32へのアクセス方法

 前述のようにWSL 1では、WSL内からWin32側へのアクセスは、LinuxのVFSによるDrvFsを利用することで、NTFSへのアクセスをWindowsカーネル経由で行っていた。しかし、仮想マシンを使うWSL 2では、逆にWindowsカーネルへ直接ファンクションコールを出すことができない。

 このため、WSLからWin32ファイルシステムのアクセスに関しても、9Pを利用する。このとき、Windows側の9Pサーバは、VMのワーカープロセス内にあるという。VMのワーカープロセスは、Hyper-Vで仮想マシンに対して、ホストOS側からファイルアクセスやネットワークサービスなどを提供する「受け口」となるプロセスだ。仮想マシンごとにワーカープロセスが対で作られる。

 このように、WSL 2とWin32環境の間のファイル共有は、どちらも9Pを使うことになる。なお、現在WSL 1では、9Pの接続にUNIXソケット(AF_UNIX)を利用している。おそらくは、WSL 2では、何らかの形で、仮想マシンとWin32環境の間でUNIXソケットによる接続が可能な仕組みが提供されると思われる。

 また、WSLからWin32プログラムを起動する「Win32相互運用性」では、最初にWSL側で、実行ファイルを判別する必要がある。具体的には、実行ファイル先頭のマジックナンバー(Win32ではMZ)を見て、LinuxのELF64か、Win32の実行ファイルなのかを判断する。

 その上で、Linuxの「binfmt_misc」(指定されたマジックバイトシーケンスとファイルの先頭の何バイトかを比較して、バイナリタイプを判定する)という機能を使い、対象のファイルを実行できる「インタープリター」を使って指定されたファイルを実行する。

 これは本来、スクリプトやJavaのjar(Javaアーカイブ)ファイルなどを実行するためのものだ。WSL 1では、インタープリターとしてinitが指定されていた。このような仕組みであるため、WSL 2でも、まずは、9Pを使って、Win32側にある実行ファイルを読み出す必要がある。その後、wsl.exeなどのWSL 2を起動した環境側と連携して、Win32実行ファイルを起動する。

 WSL 2が実現可能になったのは、WSL 1開発後にWindows OSの仮想マシン技術が進歩したからだという。WSL 1は、2016年3月に開催されたBuild 2016で発表され、その後プレビュー版、β版を経てWindows 10 Fall Creators Update(バージョン1709)より正式版となった。

 この2年の間にMicrosoftは、仮想マシンを高速起動が可能なように改良したわけだ。この仮想マシン技術は、Windowsサンドボックス(Windows Sandbox)やWDAG(Windows Defender Application Guard)などに使われているものと同種のものだという。Build 2019のセッションビデオなどを見ると、確かに高速に起動しており、体感的にはWSL 1とほとんど違いを感じなさそうだ。WSL 2でもWSL 1同様にディストリビューションをWSL用に変換することが可能であり、しかも完全なLinuxとなることから対応するディストリビューションも増えそうだ。