-- linux下的运算 [root@li ~]# echo $[1+1] --不能算浮点数 2 [root@li ~]# echo 1.1+1 | bc 2.1 [root@li ~]# echo | awk '{print 1.1+1}' 2.1 查看系统有关信息的相关命令 top uptime free nice renice (vmstat,iostat,mpstat,sar等) top - 17:44:59 up 43 min, 3 users, load average: 0.00, 0.08, 0.23 Tasks: 212 total, 3 running, 209 sleeping, 0 stopped, 0 zombie Cpu(s): 5.2%us, 3.0%sy, 0.0%ni, 90.2%id, 1.0%wa, 0.2%hi, 0.3%si, 0 Mem: 3798572k total, 3643268k used, 155304k free, 52644k buffers Swap: 524280k total, 0k used, 524280k free, 3055808k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3596 root 20 0 90576 39m 1808 S 10.3 1.1 4:10.20 x0vncserver 2957 root 20 0 134m 16m 8580 R 7.6 0.4 2:59.39 Xorg 3562 root 20 0 306m 14m 9860 S 1.3 0.4 0:04.03 gnome-termin 11 root 20 0 0 0 0 R 0.7 0.0 0:04.99 events/0 1 root 20 0 19348 1456 1148 S 0.0 0.0 0:00.78 init .............. top第一行的数据也可以用uptime或w来查看 load average: 0.08, 0.12, 0.08--分别代表cpu一分钟内,五分钟内,十五分钟内的平均负载 进程状态 s sleeping 睡眠状态,有可能会被其它信号或者程序唤醒 R running 运行状态 Z 僵死进程 D 不可中断的睡眠,一般是等待硬件的唤醒 T 进程暂停 top -b -n 2 > /root/Desktop/top.txt --把top的输出内容重定向到一个文件 top的信息从哪来? /proc /sys --查看内存使用情况 [root@li www]# free total used free shared buffers cached Mem: 2065980 2012420 53560 0 73192 1569380 -/+ buffers/cache: 369848 1696132 Swap: 4096564 136 4096428 第一行:total 总的物理内存 used 已经使用的物理内存 free 空闲的物理内存 shared 共享内存,它是用于unix与不同进程之间的一个数据共享,很少程序会用到,但是 oracle 会用到共享内存 --ipcs查看共享内存段的使用情况 buffers 缓冲区,用于存储速度不同步的设备或者优先级不同的设备之间的传输数据的区域。通过缓冲区,可以使进程之间的相互等待减少,从而使从速度慢的设备读入数据时,速度快的设备的操作不发生间断。 cached 因为cpu的速度比内存快,会设立一级缓存,二级缓存的cache。但linux下free命令这里的cached指的是page cache的内存,文件系统的cache 2012420-73192-1569380 = 369848 --指的实实在在的程序用掉的内存 53560+73192+1569380 = 1696132 --指的就是实际可挪用的内存 2065980 =369848+1696132 --关于linux的内存释放 linux使用的内存不会象windows那样关掉一个进程或者程序,马上释放内存,而是都缓存起来(buffer+cache) /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches --linux下内存释放在这里指的就是丢掉cache,把这个值改为3就可以,但实际没有必要,实际生产环境不要乱用 linux的内存工作原理? cpu--》内存 --》磁盘 (异步过程) 内存会把使用过的数据缓存起来(buffer+cache),以页为单位(page size为4096byte) 内存处理的数据,满足一定的条件(由一些内核参数来控制,比如默认30秒,或者内存脏数据达到一定比率等)才会写到磁盘 # /usr/bin/time -v mysql Major (requiring I/O) page faults: 36 --主要页面故障,相当于是内存没命中的次数 Minor (reclaiming a frame) page faults: 646 --次要页面故障,相当于是内存命中 # /usr/bin/time -v mysql --再执行一次,主要页面故障为0,表示被内存缓存了,命中了 小测试: # /usr/bin/time -v firefox & # /usr/bin/time -v firefox & --做两次,对比打开时间和主要页面故障等参数 # echo 3 > /proc/sys/vm/drop_caches # /usr/bin/time -v firefox & --扔过缓存后,再执行对比 什么时候才会用到swap? 一般来说是内存不够。但有些时候内存里不常用的一些页(page,为内存的最小单位)linux也会把它暂时放到swap.(此过程没必要去控制它,只知道有这回事就行了) sync命令 比如你拷贝一个大的文件到你的U盘里,你然后使用umount命令,会发现要等一会儿才能umount,其实它就是在把内存里的数据写到你U盘后才能umount(相当于先输入sync命令,再umount) --------------------------------------------- 进程优先级 nice renice 优先级有一个数字范围为-19到20,数字越小优先级越高 优先级高的进程占用的资源(CPU,内存等)较多 单核CPU,在同一个时间点内也只能做一件事,那么它如何去跑多任务。它其实把时间分片,然后通过中断(硬件中断和软件中断)在不同的任务间切换(上下文切换)。这种在不同任务间的间的调度叫进程调度。 # vim /tmp/1.sh #!/bin/bash a=0 while [ $a -le 1000000 ] do let a++ done 实验1: 两个终端同时执行下面两条,服务器越卡,效果越明显。还可以开第三个终端打开top来比较两者占用的资源 第一终端 # time sh /tmp/1.sh real 0m15.586s user 0m11.895s sys 0m0.487s 第二终端 # time nice --19 sh /tmp/1.sh --这是表示指定优先级为-19 real 0m12.620s user 0m11.963s sys 0m0.582s 实验2: 还是做上面的实验,但用top查看到优先级高的PID,然后用第四个终端速度使用renice 19 pid,把它优先级改低 结果是改低后第二终端执行时间变成比第一终端执行时间长了 总结:普通用户只能改自己管理的进程的优先级,并且只能改低,不能改高。只有管理员才能把进程优先级改高 ============================================= vim /etc/inittab # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) --关机 # 1 - Single user mode --单用户模式 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)--多用户模式,但没有NFS,没有网络 # 3 - Full multiuser mode --带网络的文本多用户模式,如果3模式没有网络的话就和2模式一样 # 4 - unused --保留 # 5 - X11 --图形模式 # 6 - reboot (Do NOT set initdefault to this) --重启 # id:5:initdefault: --设定开机后默认的启动级别,不要设成0或者6,如果设成0或者6致命开机不了,在grub的选择界面按E编辑这一次启动进入5模式(临时,只对这次进系统有效),进入后再修改/etc/initab(这是永久生效) # runlevel --现在是5级别 N 5 --表示第一次的级别为5 使用ctrl+alt+F2切换登录后,再使用runlevel看到还是5级别 # init 3 --用这个命令才能完全切换到3级别 # runlevel 5 3 --表示由5级别切成3级别 切换为3级别后使用ctrl+alt+F1也切换不回来图形了,因为已经是完全的3级别了 在3级别要启动图形startx或gdm(gnome display management)或init 5 可以启动多个图形startx -- :1,启动后用ctrl+alt+F7或ctrl+alt+F8来切换 ============================================ 服务管理 手动启动或关闭服务,与开机自动自动启动服务无关 service httpd start service httpd stop service httpd restart /etc/init.d/httpd restart /etc/init.d/和/etc/rc.d/init.d 目录下存放的都是服务启动脚本 对于一个服务脚本,一般都有下面两行注释 # chkconfig: - 85 15 - 代表2345级别,如果要自定级别的话在这里可以用数字表示,例如:23 85 代表开机时启动的顺序号为85 15 代表关机时关闭服务的顺序号为15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. chkconfig - updates and queries runlevel information for system services [root@li ~]# chkconfig --list --查看服务开机在各个级别是否启动 NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@li ~]# chkconfig --list |grep httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 修改httpd服务开机后不自动启动 [root@li ~]# chkconfig httpd off [root@li ~]# chkconfig --list |grep httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off 修改httpd服务开机后自动启动 [root@li ~]# chkconfig httpd on [root@li ~]# chkconfig --list |grep httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 可以针对特定的级别来设定开机后自动启动或者关闭 [root@li ~]# chkconfig httpd off --level 23 [root@li ~]# chkconfig --list |grep httpd httpd 0:off 1:off 2:off 3:off 4:on 5:on 6:off 删除一个服务(--只是chkconfig命令看不到了) [root@li ~]# chkconfig --del httpd [root@li ~]# chkconfig --list |grep httpd 添加一个服务(相对于chkconfig --del) [root@li ~]# chkconfig --add httpd [root@li ~]# chkconfig --list |grep httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off 如果你自己写了一个服务的启动脚本,如何让它支持chkconfig 有两点要求:1, 服务脚本要存在于/etc/init.d或者是/etc/rc.d/init.d,必须要执行权限 2, 就是要有 # chkconfig: # description: 这两行 S表示start K表示kill K15httpd 和 S85httpd对应chkconfig: - 85 15里的85和15这两个数字 # ls /etc/rc0.d/ 到/etc/rc6.d/里全是软链接,为什么? 答案:因为有0-6多个级别,同一个服务脚本在每个级别里有不同的应用(有些是启动,有些是关闭)。如果对一个服务脚本有修改的需求,得去0-6这七个目录里都修改一次。所以linux设计全部软链接到/etc/init.d/目录,如果要修改只改一次就可以了。 -------------------------------------------- # ntsysv --level 2345 按照当前所学建议只留下haldaemon,messagebus,network,rsyslog,sshd,vmware这六个 特别是haldaemon,messagebus这两个,少一个就会造成开机后鼠标键盘动不了 优化完后,使用下面的命令查出5级别自动开机的服务,确认OK # chkconfig --list |grep 5:on |awk '{print $1}' ============================================================= mbr master bootloader record 512字节 512=446 + 64 + 2 64字节(447-510)存放分区表 64=16+16+16+16 4 primary 3 primary + 1 Extended (N个 logical) 系统开机启动过程: 开机-->bios或EFI(配置主板的程序,BIOS=basic input and output system,EFI=Extensible Firmware Interface加电自检,找到启动设备的编号)-->找到mbr(master bootloader record,它是属于硬盘的0磁盘0扇区,硬盘最前的512个节点)-->boot loader程序 grub-->通过grub找到vmlinuz和initramfs(驱动硬件)--> 内核启动,产生init进程-->/etc/inittab(确定系统的启动级别)-->/etc/rc.sysinit(获取主机的网络环境和主机类型,测试与载入设备,是否启动selinux,模块的加载,设置系统时间.................)--》/etc/fstab--》按照inittab里的级别来对应的启动/etc/rcX.d/里的服务-->/etc/rc.local--》gdm系统登录 /etc/rc.local --写上你在登录前要自动做的命令或脚本 mount /soft/rhel-server-6.3-x86_64-dvd.iso /yum/ -o loop # ll /etc/rc5.d/S99local --这是一个软链接,如果这个软链接没了,则你写到/etc/rc.local里的命令也不会生效 lrwxrwxrwx. 1 root root 11 Jul 14 07:26 /etc/rc5.d/S99local -> ../rc.local 让开机后自动关机的方式有很多 1,inittab默认级别改为0 2,/etc/rc.local里加一句init 0 3,在一定要自启动的服务脚本里如/etc/init.d/network里加一句init 0 4, 在环境变量文件如/root/.bash_profile里加init 0 5, 在时间任务里定义一个时间init 0 --------------------- lilo grub 就是一个boot loader程序 # rpm -qa |grep grub grub-0.97-77.el6.x86_64 # rpm -qi grub-0.97-77.el6.x86_64 Summary : Grand Unified Boot Loader. Description : GRUB (Grand Unified Boot Loader) is an experimental boot loader capable of booting into most free operating systems - Linux, FreeBSD, NetBSD, GNU Mach, and others as well as most commercial operating systems. # vim /boot/grub/grub.conf --如果是使用了efi分区(/boot/efi)的话,路径则在# vim /boot/efi/EFI/redhat/grub.conf default=0 --默认进第一个系统 timeout=5 --有5秒选择时间,这里可以写负数,指的是一直在等待,一定要用户选择 splashimage=(hd0,0)/grub/splash.xpm.gz --指的是grub界面的图片,hd0是由/boot/grub/device.map来指定 title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM LANG=en_US.UTF-8 rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img rhgb表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到 quiet表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示 问题1:假设现在的系统分区情况如下 /dev/sda1 /boot /dev/sda2 swap /dev/sda3 / 那么它的启动应该按下面的写法 splashimage=(hd0,0)/grub/splash.xpm.gz title linux root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img 如果分区情况如下 /dev/sda1 / /dev/sda2 swap 请问我的grub.conf应该如何写 splashimage=(hd0,0)/boot/grub/splash.xpm.gz title linux root (hd0,0) kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda1 rhgb quiet initrd /boot/initramfs-2.6.32-279.el6.x86_64.img 问题2:假设我现在的/etc/fstab文件如下 /dev/sda1 /boot ext4 defaults 1 1 /dev/sda2 / ext4 defaults 1 2 /dev/sda3 swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 我如果删除了fstab里的第一行,请问重启系统会怎么样? 结果为:启动是grub不受影响,只是系统启动后/dev/sda1分区没有挂载到/boot目录而已. 原因是grub去找vmlinuz和initramfs不是去找/boot目录的,而是去找/dev/sda1的,所以fstab不管怎么改都不会影响grub(而且按启动顺序来讲,fstab在grub之后) 问题3:假设我现在同一个硬盘上装了两个linux(我们称为linux1和linux2),分区情况如下: /dev/sda1 /boot --第一个系统boot分区 /dev/sda2 / --第一个系统的根 /dev/sda3 swap /dev/sda4 extended /dev/sda5 / --第二个系统的根,它没有分boot分区 两个linux到底用的是谁的grub? 两个linux到底用的是谁的grub? 在装第二个系统时有一步叫install boot loader on /dev/sda前打勾,那么它会覆盖第一个系统的grub,就会使用第二个系统的grub;如果没有打勾,那就是用的第一系统的grub 如果使用第二个系统的grub,它里面是否能引导第一个系统呢? 结果就是你自己手动写上第一个系统的引导项就可以了 title linux01 root (hd0,0) kernel /vmlinux-xxx ro root=/dev/sda2 initrd /initramfs-xxx title linux02 root (hd0,4) kernel /boot/vmlinux-xxx ro root=/dev/sda5 initrd /boot/initramfs-xxx 写上第一个系统的引导项后,我就可以引导进入第一个系统,同理也可以在第一个系统里再写上第二个系统的引导项,如果我现在想使用第一个系统的grub,又应该怎么做? grub-install /dev/sda --这表示把当前系统的grub配置安装到sda的mbr里去覆盖别的系统的grub ================================================================ 给grub加密码 (防止别人在启动系统时修改grub进入1级别改你的root密码) 但是你有grub密码,别人还是可以通过rescue模式来进入你的系统) [root@li ~]# grub-md5-crypt --用此命令产生一个密码加密串 Password: Retype password: $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ --输两次密码就可以产生加密串 default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz --在下面加上加密信息,建议加到第一个title的上面就可以了,因为它是锁这句话之后的代码 password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM LANG=en_US.UTF-8 rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img ------------------------------------------ --grub排错引导例子: 注意:做下面实验不要使用lvm,lvm不支持下面这种做法 当grub丢失,或者 grub写的有错误时,进系统时会发现grub文件找不到或者直接到grub>的界面 grub>root (hd0,0) --进到/boot分区 grub>kernel /vmlinuz-xxxxxxx ro root=LABEL=/ --root分区不要写错,label形式或者/dev/sdax形式都可以 grub>initrd /initramfs-xxxxxxxx grub>boot --boot代表启动 进入系统后,再修改好grub,看需要再grub-install /dev/sda ================================================================== 硬盘安装linux系统 # df -h /dev/sda6 47G 4.0G 40G 9% /soft 准备下面这些东西,最好都放到一个专门的分区挂载目录,我这里是/dev/sda6 /soft/rhel-server-6.5-x86_64-dvd.iso /soft/isolinux/ /soft/images/ /soft/vmlinuz /soft/initrd.img 重启你的操作系统,在grub界面按C键, grub > root (hd0,5) grub > kernel /vmlinuz grub > initrd /initrd.img grub > boot 就会进入装系统的界面,和以前装系统的过程几乎一样,只有一个地方不一样就是有一步它会问你你的安装方式,你选择hard drive,然后再会问你iso的路径,你选择/dev/sda6就可以了; ============================================================