首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

再说J.U.C之并发基础工具

[TOC] 上一讲我们讲述了线程池整个的过程,这一讲我们来先底层的3个组件,synchronized,Unsafe以及LockSupport Unsafe 常用api /** * 获取对象指定Field对应的内存地址偏移量,可以理解为跟C++中的指针一样,获取到了属性的地址,在一个对象中 * 属性的偏移地址是固定的,不会发生变化 * @param var1 * @return */ public native long objectFieldOffset(Field var1); /** * 可以修改对象属性值 * @param var1 对象实例 * @param var2 属性偏移量 * @param var4 要修改的值

优秀的个人博客,低调大师

Openstack 实战讲解之-----------01-基础环境安装

本次使用的环境如下: Linux-node1 ip:192.168.56.11 控制节点 Linux-node2 ip:192.168.56.12 计算节点 设置主机名解析 [root@linux-node1~]#cat/etc/hosts 127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4 ::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6 192.168.56.11linux-node1linux-node1.example.com 192.168.56.12linux-node2linux-node2.example.com 2.安装EPEL仓库和常用命令 [root@linux-node1~]#rpm-ivhhttp://mirrors.aliyun.com/epel...h.rpm [root@linux-node1~]#yuminstall-ynet-toolsvimlrzsztreescreenlsoftcpdump yuminstall-ycentos-release-openstack-newton 修改openstack源的地址为阿里云的地址(提高yum下载的速度) sed-i"s#mirror.centos.org#mirrors.aliyun.com#g"/etc/yum.repos.d/CentOS-OpenStack-newton.repo 安装OpenStack客户端 yuminstall-ypython-openstackclient yuminstall-yopenstack-selinux rpm-qapython-openstackclientopenstack-selinux 3.关闭NetworkManager和防火墙 [root@linux-node1~]#systemctldisablefirewalld [root@linux-node1~]#systemctlstopNetworkManager 4.关闭SELinux [root@linux-node1~]#vim/etc/sysconfig/selinux SELINUX=disabled#修改为disabled 检查结果如下 [root@linux-node1~]#getsebool getsebool:SELinuxisdisabled 5.更新系统并重启 yum update & reboot 这里需要注意: Centos7.3 对openstack的许多功能有不支持的,所以建议不要升级到7.3的版本 二、环境架构图 三、服务安装 3.1 控制节点服务安装 安装数据库: yum install -y mariadb mariadb-server python2-PyMySQL 配置数据库: 1 vim /etc/my .cnf.d /openstack .cnf [mysqld] bind-address = 192.168.56.11 default-storage-engine = innodb innodb_file_per_table max_connections = 4096 collation-server = utf8_general_ci character-set-server = utf8 这个openstack.cnf是自己创建的配置文件,这里为什么会在my.cnf.d下面创建一个配置文件那,是因为/etc/my.cnf数据库中的配置文件有一条指定了保护这个路径下面的配置文件,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@linux-node1yum.repos.d] #cat/etc/my.cnf [mysqld] datadir= /var/lib/mysql socket= /var/lib/mysql/mysql .sock #Disablingsymbolic-linksisrecommendedtopreventassortedsecurityrisks symbolic-links=0 #Settingsuserandgroupareignoredwhensystemdisused. #Ifyouneedtorunmysqldunderadifferentuserorgroup, #customizeyoursystemdunitfileformariadbaccordingtothe #instructionsinhttp://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error= /var/log/mariadb/mariadb .log pid- file = /var/run/mariadb/mariadb .pid # #includeallfilesfromtheconfigdirectory # !includedir /etc/my .cnf.d 安装消息队列服务: yum install -y rabbitmq-server 安装keystone认证服务: yum install -y openstack-keystone httpd mod_wsgi 安装镜像服务: 1 yum install -yopenstack-glance 安装计算服务: 1 2 3 yum install -yopenstack-nova-apiopenstack-nova-conductor\ openstack-nova-consoleopenstack-nova-novncproxy\ openstack-nova-scheduler 安装网络资源服务: 1 2 yum install -yopenstack-neutronopenstack-neutron-ml2\ openstack-neutron-linuxbridgeebtables 今天先简单介绍所需部分服务在node1上的安装,下一篇将介绍安装服务的配置 本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/1886216,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux基础之bash脚本进阶篇-数组

数组 什么是数组? 计算机中的数组指的是具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型。 通俗点来说数组就是变量的一种,按现在的术语来说就是变量圈子中的一个,只不过这个变量圈子都是相同类型的变量并有一定的组织顺序。 数组的格式 array[key]=value array:表示数组变量的名称 key:表示数组元素的索引又称下标 value:表示key对应的数组元素的值 大体了解了什么是数组,下面就来了解下如何定义数组或如何创建数组 定义数组 定义数组主要有如下几种类型 1、通过指定元素来定义数组 1 2 3 4 5 6 7 #!/bin/bash #通过指定元素来定义数组 #指定数组元素值 array[0]=8 array[2]=two #输出数组元素 echo "${array[@]}" 运行脚本 1 2 [root@docker test ] #sh20160910-1 8two 2、通过declare语句来定义数组 1 2 3 4 5 6 7 8 9 #!/bin/bash #通过declare语句来定义数组 #定义数组-a选项表示后面定义的是一个名为array的数组。 declare -aarray #为元素赋值 array[0]=1 array[1]=2 #输出元素值 echo "${array[@]}" 运行脚本 1 2 [root@docker test ] #sh20160910-2 12 通过上面两个例子,其实可以发现在shell中这样的声明不是非常必要的,因为在shell中,所有的变量不必显示定义就可以用作数组,在某种意义上所有变量都是数组:赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的。 示例: 1 2 3 4 #!/bin/bash tom=1 echo "${tom}" echo "${tom[0]}" 运行脚本 1 2 3 [root@docker test ] #sh20160910-3 1 1 由结果可知赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的。 3、通过元素列表定义数组 1 2 3 4 5 6 7 8 #!/bin/bash #通过元素列表定义数组 #定义数组 array=(123456) #输出第4个数组元素的值 echo "Thefourthelementis${array[3]}" #输出所有元素的值 echo "Theelementsofthisarrayare${array[@]}" 运行脚本 1 2 3 [root@docker test ] #sh20160910-4 Thefourthelementis4 Theelementsofthisarrayare123456 数组的访问或查看 数组访问有若干途径,下面列举常用两种: 1、通过索引值来查看其对应的元素值 1 2 3 4 5 #!/bin/bash #定义数组 array=(123) #查看下标为1的元素 echo "thesecondelementis${array[1]}" 运行脚本 1 2 [root@docker test ] #sh20160910-5 thesecondelementis2 2、通过循环列表遍历数组 我们如果要用for循环的c表达,那么有一个问题需要解决,就是取值范围,而数组中有多少个元素只有定义的人才知道,如果有一个现成的数组,我们在不知道其有多少个元素的情况下如何通过for循环遍历显示? 为此我们需要先知道该数组有多少个元素,在数组里面可以通过${#array[@]}表示 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #通过循环列表定义数组 #定义数组 array=(onetwothreefourfive678910) #获取数组长度 length= "${#array[@]}" #通过循环遍历数组 for ((i=0;i<$length;i++)); do echo "${array[$i]}" done 运行脚本 1 [root@docker test ] #sh20160910-6 1 2 3 4 5 6 7 8 9 10 one two three four five 6 7 8 9 10 关联数组 “关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它 关联数组必须事先声明,否则导致创建关联数组失败 declare -A array声明关联数组 array=([a]=tom [b]=john [c]=3) 如果我们定义下标内是人名其对应的元素为成绩,那么输入指定的人名就可以知道其对应的成绩 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash #定义关联数组 declare -Agrades #为数组下标指定对应的分数 grades=([tom]=90[lilei]=88[rose]=92[Lucy]=80) #给一个名字 read -p "Giveaname:" name_G #判断是否给了内容,若没有则在提示后退出 [-z$name_G]&& echo "Nonepleaseselect[tom|lilei|rose|Lucy]&&exit1" #根据输入的名字输出对应的分数 case $name_G in tom) echo "tom'sgradesis${grades[tom]}" ;; lilei) echo "lilei'sgradesis${grades[lilei]}" ;; rose) echo "rose'sgradesis${grades[rose]}" ;; Lucy) echo "Lucy'sgradesis${grades[Lucy]}" ;; *) echo "pleaseselect[tom|lilei|rose|Lucy]" esac 运行脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@docker test ] #sh20160910-7 Giveaname:tom Tom'sgradesis90 [root@docker test ] #vim20160910-7 [root@docker test ] #sh20160910-7 Giveaname:rose rose'sgradesis92 [root@docker test ] #sh20160910-7 Giveaname:lilei lilei'sgradesis88 [root@docker test ] #sh20160910-7 Giveaname:Lucy Lucy'sgradesis80 [root@docker test ] #sh20160910-7 Giveaname:other please select [tom|lilei|rose|Lucy] 数组的增删合 增加数组个数 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash #定义数组 array=(12) #显示数组所有元素 echo "${array[@]}" #显示数组元素个数 echo "${#array[@]}" #追加数组元素 array[2]=3 array[3]=4 #显示追加后的数组信息 echo "${array[@]}" echo "${#array[@]}" 运行脚本 1 2 3 4 5 [root@docker test ] #sh20160910-8 12 2 1234 4 可以从数组的任意未使用的下标数开始。可以非连续增加数组 删除数组 1、删除数组指定某个元素 命令:unset array[n] 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash #定义数组 array=(123) #显示数组所有元素 echo "${array[@]}" #显示下标为0的数组元素 echo "${array[0]}" #删除下标为0的数组元素 unset array[0] echo "${array[@]}" echo "${array[0]}" 2、删除整个数组 命令:unset array 1 2 3 4 5 6 7 #!/bin/bash #定义数组 array=(123) echo "${array[@]}" #删除整个数组 unset array echo "${array[@]}" 运行脚本 1 2 [root@docker test ] #sh20160910-9 123 数组之间的合并 数组可以将多个不同的数组组合成一个新的数组。 数组连接语法如下: ("${array1[@]}" "${array2[@]}" ... "${arrayN[@]}") 数组之间用空格隔开 示例 1 2 3 4 5 6 7 #定义两个数组 array1=(123) array2=(456) #连接数组 array1_2=( "${array1[@]}" "${array2[@]}" ) #显示合并后数组的所有元素 echo "${array1_2[@]}" 运行脚本 1 2 [root@docker test ] #sh20160910-10 123456 数组中的切片 所谓切片,是指截取数组的部分元素或某个元素的部分内容 基本语法为:${array[@|*|n]:start:length} 示例1:给定一个长度为8的数组,截取第3个元素开始的4个元素。 1 2 3 4 #!/bin/bash array=(12345678) var=${array[@]:3:4} echo "$var" 运行脚本 1 2 [root@docker test ] #sh20160910-11 4567 示例2:给定一个长度为3的数组,截取第2个元素,从该元素的第1个字符开始,截取其中3个字符 1 2 3 4 #!/bin/bash array=(appleorangebanana) var=${array[2]:1:3} echo "$var" 运行脚本 1 2 [root@docker test ] #sh20160910-12 ana 数组中的替换 数组的替换是指将某个数组元素的部分内容用其他字符串来代替,但不影响原来的数组的值。 基本语法为:${array[@|*]/pattern/replacement} 1 2 3 4 #!/bin/bash replace=(abcde) echo "thereplacedarrayis${replaced[@]/c/3}" echo "theoriginalarrayis${replace[@]}" 运行脚本 1 2 3 [root@docker test ] #sh20160910-13 thereplacedarrayisab3de theoriginalarrayisabcde 小结 本文主要讲述数组的概念,数组的定义,数组的查看,关联数组的使用,数组的增删合,数组的切片,数组的替换这7部分内容。 感触:我在总结完数组后,隐隐感觉到数组与数据库之间有一定的关联性。 查看历史可以知道数组诞生于数据库之前,因此我感觉数据库这个思想一定程度上是借鉴了数组的一些理念。当然数据库比数组要强大很多,在数据查询搜索专业许多。可还是觉得这两者之间有种本质上的一致:基于数据之间的对应。 本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1851443,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux基础之bash脚本进阶篇-函数

函数,什么是函数? 函数的出现最初是在数学中,它的数学定义如下:在某变化过程中有两个变量x,y,按照某个对应法则,对于给定的x,有唯一确定的值y与之对应,那么y就叫做x的函数。 而在计算机中函数的内涵发生了一些变化。 在编程中,为了简化代码量,通常会将经常调用的一些代码模块化,并一一个名字表示,当再次使用该模块时只需要输入该名字,系统会自动去读取该名字所对应的代码模块。因此在计算机中把一段独立功能的代码当做一个整体,并为之命一个名字,命名的代码段即为函数。 虽然此函数非彼函数但函数最本质的意义并未改变:按照某个对应法则的对应关系。 函数的语法格式: 格式1: function function_name() { ...函数体 } 格式2: function_name() { ...函数体 } 函数的调用 注:定义函数的代码段不会自动执行,在调用时执行;调用即在代码中给定函数并即可;函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码。 示例:定义一sayhello函数,输出“Hello,World!” 1 2 3 4 5 6 7 8 9 #!/bin/bash #functionsayhello #authorchawan #定义函数 function sayhello(){ echo "Hello,World!" } #调用函数 sayhello 运行脚本 1 2 [root@docker test ] #sh20160909-1 Hello,World! 函数调用成功。 这时候有个疑惑:上面的脚本,如果我们将调用函数操作放在定义函数的前面会发生怎样的情况呢? 两种情况:1、调用失败;2、正常调用 下面通过实验来测试: 1 2 3 4 5 6 7 8 9 #!/bin/bash #functionsayhello #authorchawan #调用函数 sayhello #定义函数 function sayhello(){ echo "Hello,World!" } 运行脚本 1 2 [root@docker test ] #sh20160909-1 20160909-1:行5:sayhello:未找到命令 系统报错,为什么报错呢? 首先,脚本的执行总体上是顺序执行,因此会先执行sayhell,通过定义的环境变量$PATH定义的路径找不到sayhello对应的命令因此报“未发现sayhello命令”。 我们在终端命令行中输错命令报错也是这个原因。终端命令行默认会将最左面输入的内容当做命令,因此若是错误的命令,不是命令的命令等内容都会报错。 通过上面的对比,我们至少知道函数的调用若是在同一个脚本中,调用操作需要在定义的函数后面。 函数的链接 所谓函数链接:是指在某个shell函数中调用另外一个函数的过程。 shell允许用户函数的嵌套使用。 示例:演示某个函数中同时调用多个其他函数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash #函数间的调用 #authorchawandate:20160909 john(){ echo "Hello,John!" } tom(){ john echo "Hello,tom!" } sayhello(){ tom lilei } lilei(){ echo "Hello,lilei!" } sayhello 运行脚本,结果如下: 1 2 3 4 [root@docker test ] #sh20160909-2 Hello,John! Hello,tom! Hello,lilei! 这个脚本我故意将lilei函数放在sayhello函数后面,结果sayhello正常调用lilei,所以只要调用函数的位置在当前脚本所设定的函数之后即不受函数顺序的影响。函数之间无顺序制约 函数返回值 在介绍函数返回值前先讲述下跟函数返回值有关的状态退出码 状态退出码: shell中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理。退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。你可以捕获这个值并在脚本中使用。 查看退出状态码 Linux提供了$?专属变量来保存上个执行的命令的退出状态码。你必须在你要查看的命令之后马上查看或使用$?变量。它的值会变成shell中执行的最后一条命令的退出状态码: 示例:查看命令状态码 1 2 3 4 5 6 7 [root@docker test ] #ls/etc>>/dev/null [root@docker test ] #echo$? 0 [root@docker test ] #basdc bash :basdc:未找到命令... [root@docker test ] #echo$? 127 退出状态码大体分两种: 一种是命令正确执行的状态码,该状态码为:0 一种是命令错误执行的状态码,为1-255 Linux退出状态码 状态码 描述 0 命令成功结束 1 通用未知错误 2 误用shell命令 126 命令不可执行 127 没找到命令 128 无效退出参数 128+x Linux信号x的严重错误 130 命令通过Ctrl+C终止 255 退出状态码越界 在脚本中可以指定退出状态码的值,通过命令exit实现 示例:指定退出状态码 1 2 3 #!/bin/bash #exitstatus echo "Hello,World!" && exit 400 执行脚本 1 2 3 4 [root@docker test ] #sh20160909-3 Hello,World! [root@docker test ] #echo$? 144 我指定的是400,真实的值为144.为什么会是这个值? 首先退出状态码取值范围为0-255。一般在不指定退出状态码时,所有的状态值都会在0-255之内,当我们手动指定退出状态码后,若值超过255,那么shell会通过模(模就是256)运算得到相应的退出状态码。400对256取模值为144. 函数返回值(函数退出状态码) bash shell会把函数当做小型脚本,运行结束时也会返回一个退出状态码。 默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。 示例:函数状态码演示 1 2 3 4 5 6 7 8 #!/bin/bash #functionexitstatus func_test(){ echo "Hi,thisisafunctiontest!" lll-a /etc } func_test echo "Theexitstatusis:$?" 运行脚本 1 2 3 4 [root@docker test ] #sh20160909-4 Hi,thisisa function test ! 20160909-4:行5:lll:未找到命令 The exit statusis:127 函数的退出状态码是127,这是因为函数中最后一条命令没有成功执行,更具体点就是没有找到lll命令。但这个退出状态码无法知道函数中其他命令是否成功执行。 再看一个例子 1 2 3 4 5 6 7 8 #!/bin/bash #functionexitstatus func_test(){ lll-a /etc echo "Hi,thisisafunctiontest!" } func_test echo "Theexitstatusis:$?" 仅仅是将先前函数体中的2个命令换个位置。执行该脚本 1 2 3 4 [root@docker test ] #sh20160909-5 20160909-4:行4:lll:未找到命令 Hi,thisisa function test ! The exit statusis:0 这次,由于函数最后一行命令正确执行,函数的退出状态码就是0,尽管函数中有一条命令没有成功运行。 使用函数的默认退出状态码是很危险的,幸运的是return命令可以解决这个问题。 bash shell使用return命令来退出函数并返回特定的退出状态码。return命令允许指定一个整数值来定义函数的退出状态码,整数范围为0-255 示例:使用return指定函数退出状态码 1 2 3 4 5 6 7 8 9 #!/bin/bash #usingthereturncommandinafuction func_test(){ lll-a /etc echo "Hi,thisisafunctiontest!" return 4 } func_test echo "Theexitstatusis:$?" 还是使用相同的函数,在函数最后加上return指定的状态码4. 执行脚本 1 2 3 4 [root@docker test ] #sh20160909-6 20160909-4:行4:lll:未找到命令 Hi,thisisa function test ! The exit statusis:4 之所以费这么大劲介绍函数状态码是因为在今后的脚本中一个设置规范的函数返回值能帮我们简化脚本。 传递参数给函数 在函数体中,可以使用$1,$2,...引用传递给函数的参数;还可以在函数中使用$*或$@引用所有参数,$#引用传递的参数个数;在调用函数时,在函数名后以空白符分隔给定参数列表即可。 示例:传递参数给函数 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash #传递参数给函数 func_var(){ #输出所有的参数 echo "allparametersare$*" #输出脚本名称 echo "thescript'snameis$0" #输出第一个参数 echo "thefirstparameteris$1" #输出第二个参数 echo "thesecondparameteris$2" } func_varhelloworld 执行脚本 1 2 3 4 5 [root@docker test ] #sh20160909-7 allparametersarehelloworld thescript'snameis20160909-7 thefirstparameterishello thesecondparameterisworld 函数的变量作用域 局部变量:作用域是函数的生命周期;在函数结束时被自动销毁。 定义局部变量的方法:local VAR=VALUE 本地变量:作用域是运行脚本的shell进程的生命周期;因此,其作用范围为当前shell 为什么要用到局部变量? 下面举个例子说明这个问题 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #在函数外定义本地变量 var= "Hello,World" func_1(){ #在函数内改变变量内容 var= "Hi,varischanged" } echo "$var" func_1 echo "$var" 执行脚本 1 2 3 [root@docker test ] #sh20160909-8 Hello,World Hi,varischanged 结果显示在调用函数后,原有的本地变量var被替换了。还好这个变量并不是重要的部分,想想若是PATH被替换了,那么这个函数的罪过就大了。因此我们如何即调用函数中定义的变量同时又不对本地变量造成任何影响呢?局部变量的出现就是为了解决这个问题。 下面看看在使用了局部变量后的效果。 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash #在函数外定义本地变量 var= "Hello,World" func_1(){ #在函数内改变变量内容 local var= "Hi,varischanged" echo "$var" } echo "$var" func_1 echo "$var" 运行脚本 1 2 3 4 [root@docker test ] #sh20160909-9 Hello,World Hi,varischanged Hello,World 该实验结果说明,使用局部变量后,函数体中出现的变量作用范围只存在于当前函数生命周期。 递归函数 递归函数:即函数可以直接或间接地调用自身。 在函数的递归调用中,函数既是调用者,又是被调用者。 递归函数的调用过程就是反复地调用其自身,每调用一次就进入新的一层。 示例:使用递归函数表示阶乘表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash #usingrecursion func_r(){ if [$1- eq 1-o$1- eq 0]; then echo "1" else local temp=$[$1-1] local result=`func_r$temp` echo $[$result*$1] fi } read -p "Enteranumber:" value [-z$value]&& echo "None,pleaseinsetanumber" && exit 1 result=`func_r$value` echo "Thefunc_rof$valueis:$result" 执行脚本 1 2 3 4 5 6 [root@docker test ] #sh20160909-11 Giveanumber:3 Thefunc_rof3is:6 [root@docker test ] #sh20160909-11 Giveanumber:5 Thefunc_rof5is:120 递归函数在新手看来是比较难理解的,如果理解起来比较困难,建议给一个小的数,通过列举,来看该函数的执行效果,一层一层,一直到其结束。这样会对递归有个更清晰的认识。 小结: 本文主要介绍内容: 函数、函数的语法格式、函数的调用、函数的链接、给函数传递参数、函数返回值、函数的变量作用域、递归函数。 本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1851236,如需转载请自行联系原作者

优秀的个人博客,低调大师

Unity3d dll 热更新 基础框架

晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + vs2010 +mono 下面要模拟的是一个登陆环境,点击按钮,就加载一个iGameObjec的Item, Item 上得到更新的文本内容。具体如下图 1> 程序集管理 2> Dll管理与加载 3> 逻辑代码和UI的实现 4> 打包dll+打包Assetbundle 限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] rawAssembly)这个接口,所以要自己想办法先读出来。 限制2:动态加载的脚本不能在编辑器里挂在prefab上。 限制3:如果脚本在动态dll里,调用AddComponent()挂此脚本上prefab上时不能使用AddComponent(“SomeScript”)的方式调用,要用AddComponent(Type.GetType(“SomeScript”))。 限制4:在动态dll里使用[RequireComponent(typeof(SomeScript))]无效,所以不能使用。 本文转自jiahuafu博客园博客,原文链接:http://www.cnblogs.com/jiahuafu/p/8278893.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux从入门到精通系列之基础

首先我们先来说一下什么是Linux? 我们一般都听说过Windows,而一提到linux大部分人都很陌生,毕竟台式机、笔记本都是Windows操作系统。首先我们要知道 Linux 这玩意儿跟Windows是一样的都是在计算机上面运行的操作系统,所以说 Linux 就是一个操作系统。问题是Linux 可以在哪些种类的计算机上面运行呢?而 Linux 源自哪里?为什么Linux是免费的呢?这些我们都得来谈一谈先! 由上图中我们可以看到其实核心与硬件的关系非常的强烈。早期的 Linux 是针对 386 来开发的,由于Linux 只是一套操作系统并不含有其他癿应用程序,因此很多工程师在下载了 Linux 核心并且实际安装之后,就只能看着计算机开始运行了! 接下来这些高级工程师为了自己的需求,再在 Linux 上面安装他们所需要的软件就是了。 由与不同的硬件他的功能函数并不相同,例如 IBM 的Power CPU 与Intel 的 x86 架构就是不一样! 所以同一套操作系统是无法在不同的硬件平台上面运行的!举例来说,如果你想要让 x86 上面跑的那套操作系统也能够在 Power CPU 上运行时,就得要将该操作系统进行修改才行。如果能够参考硬件的功能函数并据以修改你癿操作系统程序代码,那经过改版后的操作系统就能够在另一个硬件平台上面运行了。这个动作我们通常就称为『软件移植』了! Linux 提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构,这个架构是沿袭Unix 良好的传统来的,所以相当的稳定而功能强大! ●1991 年:芬兰大学生 Linus Torvalds 的一则简讯到了 1991 年,芬兰的赫尔辛基大学的Linus Torvalds 在 BBS 上面贴了一则消息,宣称他以 bash, gcc 等工具写了一个小小的核心程序,这个核心程序可以在 Intel 的 386 机器上面运行,让很多人很感兴趣!仍此开始了 Linux 不平凡的路程! 一共经历了三个阶段:1.单人维护阶段 2.广大黑客志工加入阶段 3.核心功能细部分工发展阶段 ●Linux的核心版本 Linux 的核心版本编号有点类似如下的样子: 如前所述,因为对与 Linux 核心的开发者太多了,以致于造成 Linux 核心经常性的变动。 但对于一般家庭计算机或企业关键应用的话,常变动的核心并不适合的。因此托瓦兹便将核心的发展趋势分为两股, 并根据这两股核心的发展分别给予不同的核心编号,那就是: 好了,经过上面的说明,我们知道了 Linux 其实就是一个操作系统最底层的核心及其提供的核心工具。他是 GNU GPL 授权模式,所以,任何人均可取得原始码与可执行这个核心程序,并且可以修改。 此外,因为 Linux 参考 POSIX 设计规范,于是兼容于 Unix 操作系统,故亦可称之为 Unix Like 的一种。 ●GNU(GNU isNotUnix) 1984年由Richard Stallman发起并创建,官方网站:http://www.gnu.org ●GPL(GNU General Public License) 1.GNU自由软件的通用许可协议 2.允许用户任意复制、传递、修改及再发布 3. 基于自由软件修改再次发布的软件,仍需遵守GPL 底下列出几个主要的Linux发行者网址: Red Hat: http://www.redhat.com Fedora: http://fedoraproject.org/ Mandriva: http://www.mandriva.com Novell SuSE: http://www.novell.com/linux/ Debian: http://www.debian.org/ Slackware: http://www.slackware.com/ Gentoo: http://www.gentoo.org/ Ubuntu: http://www.ubuntu.com/ CentOS: htpp://www.centos.org/ ●Linux的特色 那么这个系统有什么特别的功能呢?简单的说: 1. 自由与开放的使用与学习环境 2. 配备需求廉价 3. 核心功能强大而稳定 4. 独立作业 目前Linux已经是想当成熟的一套操作系统咯,而且不耗资源又可以自由获取,呵呵,可以说造成微软相当大的压力呀!这也是造成Linux成为最近几年来最受瞩目的操作系统之一,如前所述,他会受到的瞩目原因是因为他是Free的,就是可以自由获取的操作系统啦!然后他是开放性的系统,也就是说你可以随时的取得程序的源代码,这对于程序开发工程师是很重要的。而且他虽然是Free的自由软件,但是功能很强大!另外,Linux对于硬件需求不是很高,这一点更造成他流行的原因。 反正Linux好处说不完啦,不过虽然Linux具有这样多的好处,但是他有一个致命的地方,使他普及率受到很大的限制,就是Linux需要使用相关的命令字符来进行系统管理,虽然近年来有很多的图形接口开发使用在Linux上面,但毕竟要熟悉Linux还是以命令字符比较好,因此要接受Linux的玩家必须会使用相关的命令字符,而不是用鼠标点一点就行的。 下面介绍几款开源软件: Firefox(火狐)浏览器OpenOffice办公软件Apache网站服务器软件 好了,天儿也不早了今天就先讲到这里我会在今后的日子里继续为大家讲解Linux的相关知识。 本文转自Devin 51CTO博客,原文链接:http://blog.51cto.com/devingeng/1330937

优秀的个人博客,低调大师

OpenStack入门修炼之网络虚拟化基础(20)

1.Linux Bridge的基本概念 假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是: 如何让 VM1 能够访问外网? ① 给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来,如下图所示 Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。 在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据; 反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。 现在我们增加一个虚机 VM2,如下图所示 VM2 的虚拟网卡 vnet1 也连接到了 br0 上。 现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。 2.理解virbr0 virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。 virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。 [root@linux-node1 ~]# ifconfig brqc39c1348-5a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.11 netmask 255.255.255.0 broadcast 192.168.56.255 ether 00:0c:29:4c:ef:31 txqueuelen 0 (Ethernet) RX packets 1069698 bytes 374890434 (357.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 854554 bytes 289390857 (275.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::20c:29ff:fe4c:ef31 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:4c:ef:31 txqueuelen 1000 (Ethernet) RX packets 1272820 bytes 454742027 (433.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 948074 bytes 428034564 (408.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 12361940 bytes 4186785589 (3.8 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12361940 bytes 4186785589 (3.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 tapae04cfac-d0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 6a:ef:28:f7:c5:90 txqueuelen 1000 (Ethernet) RX packets 5 bytes 438 (438.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 13043 bytes 2231018 (2.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:8b:7a:13 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 查看虚拟机 [root@linux-node1 ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos 关闭 查看虚拟机网卡信息 [root@linux-node1 ~]# virsh domiflist centos 接口 类型 源 型号 MAC ------------------------------------------------------- - network default virtio 52:54:00:e4:75:83 查看桥接网卡信息,可以看到virbr0-nic桥接到virbr0网卡上 [root@linux-node1 ~]# brctl show bridge name bridge id STP enabled interfaces brqc39c1348-5a 8000.000c294cef31 no eth0 tapae04cfac-d0 virbr0 8000.5254008b7a13 yes virbr0-nic 启动虚拟机 [root@linux-node1 ~]# virsh start centos 域 centos 已开始 [root@linux-node1 ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- 1 centos running 使用TightVNC连接192.168.56.11,查看网卡信息 [root@linux-node1 ~]# ssh 192.168.122.169 root@192.168.122.169's password: Last login: Tue Dec 12 15:04:59 2017 ping外网可通 [root@localhost ~]# ping www.baidu.com PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data. 64 bytes from 14.215.177.39: icmp_seq=1 ttl=127 time=13.4 ms 64 bytes from 14.215.177.39: icmp_seq=2 ttl=127 time=9.14 ms 64 bytes from 14.215.177.39: icmp_seq=3 ttl=127 time=8.47 ms 64 bytes from 14.215.177.39: icmp_seq=4 ttl=127 time=15.5 ms 64 bytes from 14.215.177.39: icmp_seq=5 ttl=127 time=8.85 ms 64 bytes from 14.215.177.39: icmp_seq=6 ttl=127 time=8.85 ms ^C --- www.a.shifen.com ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5012ms rtt min/avg/max/mdev = 8.473/10.716/15.538/2.741 ms 没有问题,可以访问外网,说明 NAT 起作用了。 需要说明的是,使用 NAT 的虚拟机 centos可以访问外网,但外网无法直接访问 centos。 因为 centos 发出的网络包源地址并不是 192.168.122.169,而是被 NAT 替换为宿主机的 IP 地址了。 这个与使用 br0 不一样,在 br0 的情况下,centos 通过自己的 IP 直接与外网通信,不会经过 NAT 地址转换。 版权声明:原创作品,谢绝转载。否则将追究法律责任 本文转自 IT_外卖小哥 51CTO博客,原文链接:http://blog.51cto.com/jinlong/2049817

优秀的个人博客,低调大师

Linux基础知识汇总(1)...持续更新中

1 2 3 4 5 6 7 8 9 linux启动流程: { 1. BLOS 识别硬件,自我测试,导向MBR 2. MBR 提供菜单选择系统项 , grup 3. Boot loader kernel 与 加载内存及检测硬件情况 4. 内核文件 加载init进程 基本命令 ls , cp , 其他软件加载到内存中 5. 配置文件 /etc/rc .d /rc .sysinit 6. 执行服务的启动 7. 加载 /etc/rc .d /rc . local } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 shell特殊符号: { # 注释 \ 转义 | 管道 用于数据定向 cat etc /passwd | cut -d: -f1 ; 分隔符 ~ 用户根目录 $ 变量符号 & 作业控制 ! 非 / 目录符号 >> > 数据输出 < << 数据输入 '' "" `` () {} } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 shell脚本编程: (用于系统维护,自动化管理,检测) { 习惯良好的编程习惯 #!/bin/bash 作为起始描述. 定义变量 declare -i num=1 declare -s str= "sss" 执行shell脚本 source xxx.sh(父进程中执行,可更新配置文件) bash xxx.sh bash -x xxx.sh 执行调试 输入 read -p "" var 输出 echo -e (格式化输出) 字符的作用 '' 只做字符的引用 "" 还可做变量的引用 `` 命令做执行结果 测试包含: 1. 数字测试 2. 字符测试 3. 文件测试 1.数字测试 -gt -lt - ge - le - eq - ne 可用中括号完成 2.字符测试 == =~ 正则匹配测试 != -n 判断字符是否为空 null位真 -z 可用两对中括号完成 3.文件测试 -e 存在 -f 普通文件 -d 目录 -b 块设备 -c 正则表达式字符设备 -S socket文件 -p FIFO文件 (键盘设备??) -L 连接文件 可用中括号完成 -nt file1是否比file2新? -ot file2是否比file2旧? -ef 两个文件的inode号是否一致 4.文件权限测试 -r -w -x 多条件判断 && || ! 个人倾向 [ a ] && [ b ] 可有: [[ a && b ]] [ a && y ] 变量分类: 本地变量 可由用户定义,只能在当前的上下文中使用,其他shell均没有权限 定义 num=1 但在使用的时候 $1 局部变量 $? 当前命令执行的状态 环境变量 比如shell脚本第一句导入,就是环境变量,当前的shell可以访问环境变量 比如$path 位置变量 #1 #2 #2 与shell脚本执行的参数变量 特殊变量 $ #(参数个数) $@(总参数列表) 算数运算: let sum +=2 流程控制: if [ conditions ]; then fi if [ conditions ]; then else fi if [ conditions ]; then elif [ conditions ]; then else fi case $1 in "a" ) ;; "b" ) ;; *) ;; esac for $i in 列表; do done 列表生成 1. for i in 1 6 8; 2. for i in /usr/log/ * 3. for i in {0..10} for i in ` seq 1 10 1` for i in ` seq 1 $line 2` for (( i=0; i<n; i++ )); do done while [ conditions ]; do done while read line; do done < /etc/passwd until [ !conditions ]; do done 函数定义: function name() { echo $1 } name 1 shift : 参数轮替 } 1 2 3 4 5 6 7 8 9 10 11 shell特性重定向: { 每一个命令都支持支持最基本的linux标准输入和输出 ls /etc/passwd 可将信息输出到用户频幕上 . /a .txt < /etc/passwd . /a .txt << /etc/passwd 讲信息输入到a ?? cat /etc/passwd > . /a .txt >> 可以在 set -C 禁止覆盖 &> 和错误也定向输出 cat /dev/zero > /dev 清空硬盘 ls /etc &> /dev/null 讲错误定向到null区域 双向重定向 tee 输出屏幕和文件 tee 后一般是文件 } 1 2 3 4 5 6 7 8 9 10 11 12 13 shell命令: { cat 输出 ll = ls -l who 谁在线 cut 讲信息进行切割 cut -d ' ' -f1 (-d 切割字符 -f 获取切割段) grep 对文件进行正则匹配查找 ( grep "" 文件 / cat /etc/passwd | grep "" ) last 最后登陆信息 20条 export 打印当前用户的环境 sprt 排序 sort -t '' -k 3 (-t 切割字符 -k 切割后的条件) uniq 排除重复 wc -c -l (字符数 , 文件行数) tr '[A-Z]' '[a-z]' 大小写转换 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 shell常用目录或文件: { /etc/passwd 账户信息 /dev/null null黑洞 /dev/zero zero0用于填充磁盘 /etc/rc .d /rc .init 启动信息 /etc/vimrc ~/.vimrc vim配置信息 /proc/partitions 分区信息 /proc/cpuinfo /proc/meminfo cpu meminfo信息 /etc/fstab 挂载点信息(可更新) /proc/mounts 详细 /etc/mtab /proc/sys/vm/swapiness 内存策略 是否启用交换分区 /etc/mdadm .conf 阵列配置信息 /proc/mdstat 整列设备信息 /dev/rc .d /rc .sysinit 开机启动项 /etc/sysconfig/network-scripts/ifcfg-eth0 网络配置 /etc/yum .conf /etc/yum .repos.d/* 软件源配置 /etc/issue 欢迎信息 /boot/grup 引导器 /boot/grup/menu .lst 引导列表 /etc/man .config man 文档匹配 /etc/profile .d 脚本配置目录 /usr/include 头文件目录 /etc/ld .so.conf.d/ 库文件所在 /proc/meminfo 内存信息 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 vim的使用: { 模式: 编辑模式 默认 /esc 命令模式 : 输入模式 i 可视模式 v 按键: 编辑模式 gg 移动 ^ h j k l $ 可与数字配合 10j G ZZ 退出 dd 删除整行 d o 新插入一行 yy 复制整行 y p 粘贴 J 合并行 u 还原 ctrl+r 撤销 r 替换一个字符 CTRL+w s 窗口分割 可视模式 v V 选择块 行 命令模式 / 搜索 :n,md 从n到m删除 :n,ms/原内容( 可正则)/ 新内容 /g :wq 保存退出 :q! 强制退出 设置: nu ai sm 括号匹配 syntax 语法 其他问题: 编码: 可设置当前主机 LANG= 断行符: UNIX2dos -k 文件 dos2UNIX -k 文件 语系编码转换: iconv -f 原编码 -t 现编码 filename newfilenamew } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 磁盘管理: 新建普通 { 磁盘有物理和逻辑结果组成(机械式) 物理结构: 扇区 512KB 物理结构最小单位 扇面 柱面 分区最小单位 (千层饼??) 在磁盘的第一个扇区 有446KB的MBR主引导 分区表64KB (16*4) 2KB标识位 逻辑结构: 磁盘被分为许多block, inode 众多的block组成了block group -> super block,文件描述信息,inode talbe,block bitmap,inode bitmap,block 文件描述信息: 描述上述东西的存在 super block: 描述block,inode数量 使用量 block: 最小逻辑单位 1K 2K 4K inode: 记录block12个block的位置 共128byte 一般情况下拥有12个直接 1一个间接 1个双间接 1个三间接 block bitmap: 记录block的使用情况 inode bitmap: 记录inode的使用情况 常见文件系统格式: 基本: ext2 ext3 ext4 Reiserfs(小) JFS vfat xfs(大) 集群: GFS2 , OCFS2 网路: NFS , smbfs 光盘: ISO9660 交换分区: SWAP 分区磁盘分为两种情况: 1, 已存在系统 kpartx -i /dev/sda kpartx -af /dev/sda partx -a /dev/sda 2, 新磁盘 操作: 查看 cat /proc/partitions 磁盘信息 1. 分区 fdisk sfdisk parted 2. 格式化 mkfs mkfs.exts mk2efs (在格式化也可对文件系统调整) 3. 信息查看/调整 blkid (格式化后文件系统信息) dumpe2fs (超级块信息) tune2fs (调整文件系统选项) e2label (改变label) hdparm (硬件信息) resize2fs (从新调整大小) 4. 检测 fsck e2fsck 5. 交换分区 mkswap swapon /off 6. 挂载 mount umount (手动,开机) 过程中需要使用到的信息 fuser 挂载占用 df 磁盘空闲状态 du 目录评估占用 dd 填充 ln 链接 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 磁盘管理: raid { HBA 查看机器raid情况 /proc/mdstat raid的出现是为了 1.提高 读 a 写 b 速度 2. 容错能力 3. 备份 4.利用率 5. 至少数量 raid 0 yes no no 100 2 raid 1 1a yes yes 50 2 raid 5 yes yes no n-1 /n 3 raid01 1a yes yes n-2 /n 4 raid10 yes yes yes n-2 /n 4 jbad 连接磁盘 实例:创建一个空间大小为10G的RAID5设备,要求其chunk大小为1024K,格式经为ext4文件系统,开机可自动挂载至 /backup 目录,并支持acl功能; mdadm -C /dev/md0 -a yes -l 5 -n 4 -c 1024K /dev/sdb /dev/sdc /dev/sdd /dev/sde # 只有阵列完毕才可以格式化 mkfs -t ext4 /dev/md0 #调整绝大数磁盘信息 tune2fs -o acl /dev/md0 可以调整目录的label的名字 e2label /dev/md0 "xxxx" dumpe2fs -h /dev/md0 #编辑/etc/fstab /dev/md0 /backup ext4 defaults 0 0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 /backup ext4 defaults 0 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 磁盘管理: LVM { LVM: 逻辑卷管理器(可弹性管理磁盘策略) 扩容不需要停止业务 缩容需要停止业务 分区之后的物理盘加入到卷组中(逻辑概念)之后假如逻辑卷(中间多了一个中间层,由内核驱动完成,内核提供了这样的中间层) 流程: 1. 将需要假如LVM的磁盘格式化 2. pvcreate /dev/sd {a-z} 3. vgcreate -s 16M vgname /dev/sd {a-z} 4. lvcreate -L 容量 lvname vgname 5. 挂载 /dev/vgname/lvname 动态其他操作: 1. 扩容 先扩大物理容量,再逻辑容量 2. 缩小 先缩小逻辑容量,再物理容量 练习: 1、创建一个由两个物理卷组成大小为20G的卷组myvg,要求PE大小16M;而后新建 大小为7G逻辑卷mylv1,要求其文件系统为ext4,块大小为2048,且开机能自动挂载至 /users ; 2、新建用户openstack,其家目录为 /users/openstack ,而后切换至openstack用户,复制一些文件至其家目录中; 3、缩减mylv1至5G大小;而后切换至openstack用户,确保其数据没有丢失; 4、对mylv1创建快照卷snap-mylv1,并通过其备份数据至 /tmp/user . tar .bz2; #1 pvscan pvcreate /dev/sd {b,c} pvdisplay vgcreate -s 16M test /dev/sd {b,c} vgscan vgdisplay lvcreate -L 7G -n mylv test mkfs -t ext4 /dev/test/mylv tune2fs -r 2048 /dev/test/mylv vi /etc/mdadm .conf ARRAY /dev/md0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 #编辑/etc/fstab /dev/md0 /backup ext4 defaults 0 0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 /backup ext4 defaults 0 0 #2 useradd openstack -d /users su openstack cp -rf /var/ * /users #3 pvdisplay umount /dev/test/mylv e2fsck -f /dev/test/mylv resize2fs /dev/test/mylv 5G mount /dev/test/mylv /users lvresize -L 5G /dev/test/mylv #4 快照 lvcreate -L 50M -s -n mylv-snap /dev/test/mylv mkdir /snap mount /dev/test/mylv-snap /snap tar -jcf /snap/ * > /tmp/user . tar .bz2 tar -jcv -f /tmp/user . tar .bz2 /snap/ } 1 2 3 4 5 6 7 8 9 10 11 12 13 压缩,归档工具: { 这里包含压缩和归档的过程,两个在这里就不区分了,因为使用非常简单 tar -c 创建压缩/归档文件夹 -x 解压压缩/归档文件 -f 欲解压压缩的文件或包 -j 对应使用 gzip 压缩工具 -z 对应使用 bzip2 压缩工具 -J 对应使用xz压缩工具 - v 查看解压压缩过程 实例 在解压和压缩的过程 j J z 都可以省略 自动判断后缀选择压缩工具 tar -xf nginx-1.4.2. tar .gz 解压 tar -cf axel-2.4. tar .bz axel-2.4/ 压缩 } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1362564 ,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册