查看系统版本:
[root@neo ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@neo ~]# uname -r 2.6.32-696.el6.x86_64 [root@neo ~]# uname -m x86_64 [root@neo ~]# uname -a Linux neo 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [root@neo ~]# # cat /etc/redhat-release 查看系统版本, uname -r 查看内核版本 , 通常用这两个命令即可;uname -m 显示系统位数
变量
1. 查看变量的内容: # echo $变量名,如: echo $PS1 [root@neo ~]# echo $PS1 [\u@\h \W]\$ 2. 向变量中放入内容: # 变量名=内容 # PS1 是系统的环境变量;环境变量一般都是大写的,而且在系统中任何的地方都可以使用。PS1 这个环境变量就是控制命令行样子的 [root@neo ~]# echo $PS1 [\u@\h \W]\$ # \u 是指当前用户名,\h 是指当前主机名(hostname),\W 是指当前的位置,相当于pwd (工作中 PS1 这个变量一般不要改)
linux系统优化:
1. 添加普通用户账号
1.1 linux 用户分类: root 用户 --- linux 中的皇帝 普通用户
1.2 添加普通用户 # 添加普通用户的命令: useradd 普通用户名; 查看用户的信息(以及用户是否存在)的命令: id 普通用户名;为普通用户设置密码: passwd 普通用户名 [root@neo ~]# useradd oldboy [root@neo ~]# id oldboy uid=500(oldboy) gid=500(oldboy) groups=500(oldboy) [root@neo ~]# id neo id: neo: No such user [root@neo ~]# id root uid=0(root) gid=0(root) groups=0(root) [root@neo ~]# [root@neo ~]# passwd oldboy Changing password for user oldboy. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. [root@neo ~]# 1.3 切换用户: # 切换用户的命令: su - 用户名 ; 查看当前用户的命令: whoami [root@neo ~]# whoami root [root@neo ~]# su - oldboy [oldboy@neo ~]$ whoami oldboy 1.4 退出当前用户 # 退出当前用户的命令: 快捷键 --- ctrl + d ;也可以用 su - root (但是root密码会比较复杂,不方便) [oldboy@neo ~]$ # ctrl + d [oldboy@neo ~]$ logout [root@neo ~]#
2. 关闭 SELinux
# 查看 SELinux 的状态的命令:getenforce (Enforcing 表示 SELinux正在运行;permissive 表示 SELinux 临时关闭;disabled 表示 SELinux永久关闭) 2.1 临时关闭 SELinux (重启服务器后 SELinux会重新开启) # 命令: setenforce 0 [root@neo ~]# getenforce Enforcing [root@neo ~]# setenforce usage: setenforce [ Enforcing | Permissive | 1 | 0 ] [root@neo ~]# setenforce 0 [root@neo ~]# [root@neo ~]# getenforce Permissive 2.2 永久关闭 SELinux # 修改 /etc/selinux/config 这个配置文件:把 SELINUX=enforcing 改成 SELINUX=disabled (重启服务器后才会生效) [root@neo ~]# vim /etc/selinux/config [root@neo ~]# grep 'SELINUX=' /etc/selinux/config # SELINUX= can take one of these three values: SELINUX=disabled [root@neo ~]#
3. 关闭 iptables
# 服务器对外使用时(服务器有外网),需要开启防火墙 # 服务器只有内网(局域网)时,一般要关闭防火墙(并发高时也需要关闭防火墙) # 查询防火墙是否在运行的命令: /etc/init.d/iptables status [root@neo ~]# /etc/init.d/iptables status Table: filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@neo ~]# # 上面的信息表示防火墙正在运行 # 临时关闭防火墙:(工作中关闭防火墙时建议关闭两次) [root@neo ~]# /etc/init.d/iptables stop iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] [root@neo ~]# /etc/init.d/iptables stop [root@neo ~]# [root@neo ~]# /etc/init.d/iptables status iptables: Firewall is not running. # 这是临时关闭防火墙的方法;系统重启后防火墙会重新开启,因为此时的防火墙会开机自动启动 # 查看开机启动项的命令: chkconfig # 如果 3:on 表示是开机启动的软件 # 查看防火墙是否开机启动: chkconfig | grep iptables [root@neo ~]# chkconfig |grep ipt iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 永关闭防火墙:设置防火墙开机时,不自动启动 # 让防火墙开机时,不自动启动的命令: chkconfig iptables off [root@neo ~]# chkconfig iptables off [root@neo ~]# [root@neo ~]# chkconfig |grep ipt iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off # 开机启动防火墙: chkconfig iptables on [root@neo ~]# chkconfig iptables on [root@neo ~]# chkconfig |grep ipt iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
4. 防止显示中文乱码
# 查看系统的字符集的命令:echo $LANG # LANG 也是环境变量,表示系统用的什么字符集 [root@neo ~]# echo $LANG en_US.UTF-8 # 语言.字符集 # 修改字符集 4.1 临时修改: export LANG=zh_CN.UTF-8 # 往环境变量中放入内容时,需要在其前面加上 export [root@neo ~]# export LANG=zh_CN.UTF-8 [root@neo ~]# echo $LANG zh_CN.UTF-8 4.2 永久修改字符集: [root@neo ~]# cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" [root@neo ~]# # 把上面的 LANG="en_US.UTF-8" 改成你想要的字符集就能永久改变系统字符集(但不要这么做) # 利用 source 让上面的 /etc/sysconfig/i18n 生效 [root@neo ~]# source /etc/sysconfig/i18n [root@neo ~]# echo $LANG en_US.UTF-8 [root@neo ~]# # 中文乱码的原因: linux使用的字符集 与 远程连接工具使用的字符集(如xshell)不一致
Linux目录结构
1. 目录结构特点
1.1 一切从根开始 1.2 Linux中每个设备可以挂在任何目录上面 1.3 Linux下面的设备(光盘/磁盘分区)没有挂载无法使用;挂载相当于给 磁盘分区/设备 开了一个入口,通过入口进入到光盘/磁盘分区 中,这个入口即 挂载点,挂载点本质上就是一些目录
2. Linux目录结构简介
# linux核心目录简介: bin ----> 存放命令、二进制文件的存放目录,binary boot ---> 系统引导程序 + 【系统的内核】 dev ----> device ,设备、光盘、硬盘; <---> 磁盘挂载才能使用 etc ----> 存入系统的配置文件 home ---> 普通用户的家目录 lib ----> libary,库,库文件 lib64 --> 系统是 64位,库文件 host+found ---> 磁盘或文件系统损坏 断电 临时文件位置 media ---> mnt ---> 临时的挂载点 <--> 挂载点,目录,给设备提供了一个入口 opt ---> option;第三方软件安装在这里 proc ----> 虚拟的目录;目录里面的内容是内存中信息(内核、进程、软件) <---> 为了解决:linux 中一切皆文件 root ---> root用户的家目录 sbin ---> super binary;超级命令,只有root用户能用的命令 selinux ---> selinux 及他的配置文件存放的位置 srv ---> sys ---> 虚拟的目录,内存信息 tmp ---> temp;临时文件的存放位置 usr ---> 存放用户的程序 var ---> variable;经常变换的文件,系统日志
3. Linux目录详解
/etc 目录下面的内容:
# /etc 目录下面的内容: /etc/sysconfig/network-scripts/ifcfg-eth0 # 网卡的配置文件 /etc/resolv.conf # 文件目录详解 /etc/hosts /etc/sysconfig/network /etc/fstab /etc/rc.local /etc/inittab /etc/init.d /etc/profile /etc/bashrc
/etc/sysconfig/network-scripts/ifcfg-eth0
# /etc/sysconfig/network-scripts/ifcfg-eth0 [root@neo ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ### 网卡的名字 HWADDR=00:0c:29:26:b5:57 #@@ hardware address 硬件地址;MAC地址 TYPE=Ethernet ### 互联网 UUID=7aef3188-c7e3-49a9-ace8-c20bae02381a ### UUID,系统中唯一的标识 ONBOOT=yes #@@ booton 在重启的时候是否开启网卡(自动运行) NM_CONTROLLED=yes ### 是否能被network软件进行管理 BOOTPROTO=none #@@ 网卡获取ip地址的方式 # 网卡获取ip地址的方式: # none/static ---> ip地址是固定的 # dhcp ---> 自动获取ip地址 IPADDR=10.0.0.200 #@@ ip address ip地址 NETMASK=255.255.255.0 ### 子网掩码 GATEWAY=10.0.0.2 #@@ 网关(默认的出口) USERCTL=no ### 是否允许普通用户管理网卡(开、关、重启) PEERDNS=yes ### PEERDNS=yes 表示 网卡配置文件中的DNS优先于 /etc/resolv.conf; no 的话表示 这两个没有任何关系 IPV6INIT=no [root@neo ~]# # DNS1=223.5.5.5 # DNS2=223.6.6.6 # DNS # 把使用的域名转换为IP地址 ---> DNS : 域名解析服务/系统 ### 阿里云的DNS: # 223.5.5.5 # 223.6.6.6 ### 114 的DNS: # 114.114.114.144 # 114.114.115.115 # 谷歌的DNS: # 8.8.8.8 ### 常见的DNS有关的错误 [root@neo ~]# yum install tree Loaded plugins: fastestmirror, security Setting up Install Process Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock error was 14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'" Error: Cannot find a valid baseurl for repo: base [root@neo ~]# Couldn't resolve host 'mirrorlist.centos.org' # resolve ---> 解析; host ---> 域名 # Linux无法上网: 1. ping www.baidu.com # 是否能上网 2. ping 223.5.5.5 # DNS 是否有问题;223.5.5.5 是一个外网IP,此时的ping 不经过 DNS # 上面两步如果都报错,说明是网络配置有问题;如果第1步报错,第2步不报错,说明是DNS的有问题 # 修改DNS: # 在网卡配置文件中添加上: DNS1=223.5.5.5 DNS2=223.6.6.6 [root@neo ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 [root@neo ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=00:0c:29:26:b5:57 TYPE=Ethernet UUID=7aef3188-c7e3-49a9-ace8-c20bae02381a ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPADDR=10.0.0.200 NETMASK=255.255.255.0 GATEWAY=10.0.0.2 USERCTL=no PEERDNS=yes IPV6INIT=no DNS1=223.5.5.5 DNS2=223.6.6.6 [root@neo ~]# # 修改完上述配置文件后,需要重启网卡让配置文件生效 # 方式一:重启某一个网卡: ifdown eth0 && ifup eth0 # && 表示前一个命令成功后就执行后一个命令 [root@neo ~]# ifdown eth0 && ifup eth0 Determining if ip address 10.0.0.200 is already in use for device eth0... [root@neo ~]# # 方式二: 重启所有网卡: /etc/init.d/network restart [root@neo ~]# [root@neo ~]# /etc/init.d/network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining if ip address 10.0.0.200 is already in use for device eth0... [ OK ] [root@neo ~]#
文件目录详解 ---> /etc/resolv.conf ---> 用于配置DNS
# 文件目录详解 ---> /etc/resolv.conf ---> 用于配置DNS [root@neo ~]# cat /etc/resolv.conf nameserver 223.5.5.5 nameserver 223.6.6.6 # 网卡配置文件中的DNS优先于 /etc/resolv.conf;配置DNS基本都在 网卡里面配置
修改主机名(hostname)
# 修改主机名(hostname) # /etc/sysconfig/network 合作可用于修改主机名的文件 # 1. 查看当前的主机名的命令:hostname [root@neo ~]# hostname neo # 2. 临时修改主机名: hostname 新主机名 (重新连接xshell后临时主机名生效;重启服务器后临时主机名失效) [root@neo ~]# hostname NEO [root@neo ~]# Connection closed. Type `help' to learn how to use Xshell prompt. Xshell:\> Connecting to 10.0.0.200:22... Connection established. Escape character is '^@]'. WARNING! The remote SSH server rejected X11 forwarding request. Last login: Thu Mar 14 17:04:49 2019 from 10.0.0.1 [root@NEO ~]# # 3. 永久修改主机名: vim /etc/sysconfig/network # 修改 /etc/sysconfig/network 文件中的 HOSTNAME= (重启服务器后新的主机名生效) [root@NEO ~]# vim /etc/sysconfig/network [root@NEO ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=NEO [root@NEO ~]# hostname NEO # vi/vim 快捷键: # 删除光标所在位置到行尾的所有内容(命令行模式下):D # xshell 快捷键: # 使用上一个命令的最后一个内容: Esc + .
文件目录详解 ---> /etc/hosts :IP地址与域名的解析关系 (对主机名进行解析的一个文件)
# 文件目录详解 ---> /etc/hosts :IP地址与域名的解析关系 (对主机名进行解析的一个文件) # 在 /etc/hosts 文件中加上: IP 域名 [root@NEO ~]# vim /etc/hosts [root@NEO ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.200 www.jd.com [root@NEO ~]# ping www.jd.com PING www.jd.com (10.0.0.200) 56(84) bytes of data. 64 bytes from www.jd.com (10.0.0.200): icmp_seq=1 ttl=64 time=0.022 ms 64 bytes from www.jd.com (10.0.0.200): icmp_seq=2 ttl=64 time=0.044 ms ^C --- www.jd.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1919ms rtt min/avg/max/mdev = 0.022/0.033/0.044/0.011 ms [root@NEO ~]# # 上述方法的作用大多是用于测试 # Windows 系统下的 hosts 路径:C:\Windows\System32\drivers\etc
文件目录详解 ---> /etc/fstab ---> 开机的时候自动挂载的文件(开机的进修给每个磁盘分区开一个入口)
# 查看磁盘使用情况的命令: df 或者是 df -h (通常用 df -h 命令,这个人类可读的信息); -h 这个参数表示 以人类可读的形式显示大小 [root@NEO ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 9213440 1449756 7289012 17% / tmpfs 242992 0 242992 0% /dev/shm /dev/sda1 194241 39969 144032 22% /boot [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.4G 7.0G 17% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Tue Oct 16 00:33:56 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=cd2601d7-02d0-4070-811f-492ea7b92e85 / ext4 defaults 1 1 UUID=1ba683a1-dd30-4d4a-a3c2-f3d4f5c405aa /boot ext4 defaults 1 2 UUID=062fbbe4-edbd-4b69-8e09-6def7e7d780b 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 [root@NEO ~]# # 上述 cat 信息中,第1列表示 设备/分区;第2列表示 入口/目录/挂载点 # 查看 UUID 分区的 命令: blkid [root@NEO ~]# blkid /dev/sda3: UUID="cd2601d7-02d0-4070-811f-492ea7b92e85" TYPE="ext4" /dev/sda1: UUID="1ba683a1-dd30-4d4a-a3c2-f3d4f5c405aa" TYPE="ext4" /dev/sda2: UUID="062fbbe4-edbd-4b69-8e09-6def7e7d780b" TYPE="swap" [root@NEO ~]#
文件目录详解 ---> /etc/rc.local ---> 开机的时候自动运行的文件(需要开机自启动的软件/命令/服务放在这个文件中即可)
# 让一个软件/脚本/服务开机自动运行的方法: 1. 通过 /etc/rc.local # 这种是常用的方式;这个相当于服务器运行软件的清单 2. 通过 chkconfig 管理 开机自启动
文件目录详解 ---> /etc/inittab ---> 开机时【运行级别】的配置文件
# 1. linux 运行级别(模式/状态): 0 表示 关机状态(不要把运行级别设置为0) 1 表示 单用户模式/状态(用于root用户密码忘记了;这个状态下没有网络) 2 表示 多用户模式,但是没有NFS 3 表示 完全的多用户模式(命令行模式/文本模式;工作中默认的模式) 4 表示 未使用 5 表示 X11/桌面模式/图形化界面模式 6 重启状态(也不要把运行级别设置为6) # 2. 查看当前的运行级别: # 查看当前运行级别的命令: runlevel [root@NEO ~]# runlevel N 3 [root@NEO ~]# N 3 ---> N 表示上一次的运行级别; 3 表示当前系统的运行级别 # 3. 切换运行级别 --- 临时 (不要切换成0或6) # 切换运行级别的命令: init 级别 [root@NEO ~]# init 5 [root@NEO ~]# runlevel 3 5 # 4. 永久修改运行级别:修改 /etc/inittab 文件,修改 其中的 id:3:initdefault: 的 id 后的级别 (但是,这个文件不要改) [root@NEO ~]# tail -1 /etc/inittab id:3:initdefault: # 重启服务器后生效
文件目录详解 ---> /etc/init.d ---> 这个目录下放着一些 系统服务管理的命令(其实是脚本)
文件目录详解 ---> /etc/profile ---> 放着系统环境变量(如:PS1 和 PATH) 和 别名
# 但是 LANG 放在了 /etc/sysconfig/i18n
文件目录详解 ---> /etc/bashrc ---> 真正存放 别名 的 地方
## 下面两个是 全局生效 /etc/profile # 系统环境变量 和 别名 (别名常用这个) /etc/bashrc # 真正存放 别名 的地方 ## 下面两个是 当前用户生效 ~/.bashrc # 别名 ~/.bash_profile # 环境变量 和 别名 # ~ 表示当前用户的家目录: root 用户, ~ 表示 /root ;普通用户 如 oldboy, ~ 表示 /home/oldboy # linux中以 . 开头的文件 是 隐藏文件 # 上面四个,最常用的是 /etc/profile
/usr/local ---> 编译安装的软件 默认的位置
# /usr/local 即相当于 Windows 系统下的 C:\Program Files # Linux下安装软件的方法: 1. yum :yum 安装会自动解决安装依赖的软件;软件包管理工具 yum install 软件名 # yum 安装时可用 yum -y 软件名 的命令:-y 表示 遇到 y/N 的询问时自动选 y 2. rpm :rpm 安装时 缺少的东西需要自己解决 3. 编译: 3.1 ./configure # 配置 3.2 make 3.3 make install # 查看软件是否安装成功: # rpm -qa |grep 软件名 # rpm -qa 会显示出系统中已经安装了的所有的软件 [root@NEO ~]# [root@NEO ~]# rpm -qa |grep tree tree-1.5.3-3.el6.x86_64 [root@NEO ~]#
/var/log/messages ---> 系统默认日志信息
[root@NEO ~]# tail /var/log/messages Mar 15 13:38:50 NEO kernel: type=1305 audit(1552628328.909:3): audit_pid=1213 old=0 auid=4294967295 ses=4294967295 res=1 Mar 15 13:38:50 NEO irqbalance: Balancing is ineffective on systems with a single cpu. Shutting down Mar 15 13:38:51 NEO acpid: starting up Mar 15 13:38:51 NEO acpid: 1 rule loaded Mar 15 13:38:51 NEO acpid: waiting for events: event logging is off Mar 15 13:38:52 NEO acpid: client connected from 1382[68:68] Mar 15 13:38:52 NEO acpid: 1 client rule loaded Mar 15 13:38:52 NEO kdump: No crashkernel parameter specified for running kernel Mar 15 13:38:56 NEO abrtd: Init complete, entering main loop Mar 15 15:17:15 NEO yum[1955]: Installed: tree-1.5.3-3.el6.x86_64
/var/log/secure ---> 系统用户的登陆信息 (谁 什么时候 从哪里登陆的 是否成功)
[root@NEO ~]# tail /var/log/secure Mar 15 00:02:51 NEO sshd[1423]: Received signal 15; terminating. Mar 15 00:02:51 NEO sshd[1582]: Exiting on signal 15 Mar 15 00:02:51 NEO sshd[1582]: pam_unix(sshd:session): session closed for user root Mar 15 13:38:53 NEO sshd[1423]: Server listening on 0.0.0.0 port 22. Mar 15 13:38:53 NEO sshd[1423]: Server listening on :: port 22. Mar 15 13:52:42 NEO sshd[1590]: Accepted password for root from 10.0.0.1 port 3899 ssh2 Mar 15 13:52:42 NEO sshd[1590]: pam_unix(sshd:session): session opened for user root by (uid=0) Mar 15 15:32:04 NEO sshd[1991]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.0.1 user=root Mar 15 15:32:06 NEO sshd[1991]: Failed password for root from 10.0.0.1 port 6193 ssh2 Mar 15 15:32:08 NEO sshd[1992]: Received disconnect from 10.0.0.1: 0: [root@NEO ~]# grep "Failed password" /var/log/secure # 查看登陆失败的信息 Mar 15 15:32:06 NEO sshd[1991]: Failed password for root from 10.0.0.1 port 6193 ssh2 [root@NEO ~]#
文件目录详解 --> /proc/meminfo --> 内存信息 : cat /proc/meminfo
# 显示当前系统的内存信息 的命令: free [root@NEO ~]# free -h total used free shared buffers cached Mem: 474M 126M 347M 224K 9.4M 40M -/+ buffers/cache: 77M 397M Swap: 767M 0B 767M [root@NEO ~]#
文件目录详解 --> /proc/cpuinfo --> 查看 cpu 信息
# 查看 cpu 信息 的命令: lscpu ;该命令即相当于 cat /proc/cpuinfo [root@NEO ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 1 On-line CPU(s) list: 0 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 69 Model name: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz Stepping: 1 CPU MHz: 2401.000 BogoMIPS: 4802.00 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 3072K NUMA node0 CPU(s): 0 [root@NEO ~]#
文件目录详解 --> /proc/loadavg --> 系统的负载
# 负载:系统的繁忙程度 # 查看系统负载的命令: w [root@NEO ~]# w 17:59:12 up 7 min, 1 user, load average: 0.00, 0.01, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 17:52 0.00s 0.02s 0.00s w [root@NEO ~]# # load average: 0.00, 0.01, 0.00 ---> 三个数分别表示: 最近1分钟、最近5分钟、最近15分钟 的 平均负载 # 系统繁忙时,系统的负载接近 cpu 的核心数量
文件目录详解 --> /proc/mounts --> 显示系统的挂载信息
# 系统的挂载信息也可以通过该命令查看: def -h [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 7.0G 18% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# # findmnt 命令 即相当于 cat /proc/mounts (findmnt 作为了解)
Linux系统的启动过程:
PATH 环境变量:
1. 环境变量: (查看环境变量可以用命令:env )
1.1 大部分环境变量是大写; 1.2 在系统大部分地方都可以使用,并且含义相同 # 常用的环境变量:LANG 和 PATH
2. PATH 的含义:
# PATH变量存放的是命令的位置/路径 [root@NEO ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@NEO ~]# # 不同路径之间通过 冒号 分隔
3. PATH的作用:
# linux下面运行命令的过程: 1. 输入命令 2. 在PATH里面 路径进行查找 3. 找到了就运行 4. 找不到就提示 command not found
练习1. 过滤出已知当前目录下 oldboy 中的所有一级目录(一级目录:不包含 oldboy 目录下面的子目录及隐藏目录,即只能是第一级目录)
1. 创建环境:
mkdir /oldboy -p cd /oldboy mkdir ext/oldboy test xiaodong xiaofan xingfujie -p touch jeacen oldboy wodi.gz yingsui.gz #### 如下: [root@NEO ~]# mkdir /oldboy -p [root@NEO ~]# cd /oldboy [root@NEO oldboy]# mkdir ext/oldboy test xiaodong xiaofan xingfujie -p [root@NEO oldboy]# touch jeacen oldboy wodi.gz yingsui.gz [root@NEO oldboy]# tree . ├── ext │ └── oldboy ├── jeacen ├── oldboy ├── test ├── wodi.gz ├── xiaodong ├── xiaofan ├── xingfujie └── yingsui.gz 6 directories, 4 files [root@NEO oldboy]# # tree 命令:以树形显示目录结构 -L 数字 ---> 最多显示几层目录 -d ---> 只显示目录 # 查询某个软件是否安装: rpm -qa # 显示出系统中已经安装了的所有软件 rpm -qa |grep tree # 查询某个软件是否安装 # rpm 是 rpm包管理命令: -qa ---> 查询所有;q 表示查询,a 表示所有 -ql 软件名 ---> 查看某个软件包里面的内容 (软件名要完全正确) # rpm -ql 如下: [root@NEO oldboy]# rpm -ql tre package tre is not installed [root@NEO oldboy]# rpm -ql tree /usr/bin/tree /usr/share/doc/tree-1.5.3 /usr/share/doc/tree-1.5.3/LICENSE /usr/share/doc/tree-1.5.3/README /usr/share/man/man1/tree.1.gz [root@NEO oldboy]#
方法一: tree 命令
[root@NEO oldboy]# tree -d /oldboy/ /oldboy/ ├── ext │ └── oldboy ├── test ├── xiaodong ├── xiaofan └── xingfujie 6 directories [root@NEO oldboy]# tree -dL 1 /oldboy/ /oldboy/ ├── ext ├── test ├── xiaodong ├── xiaofan └── xingfujie 5 directories # tree -d 表示只查看目录; tree -dL 1 表示只查看第1层目录
方法二: find 命令
[root@NEO oldboy]# find -type d # 找出所有的目录 . ./xiaofan ./xingfujie ./xiaodong ./ext ./ext/oldboy ./test [root@NEO oldboy]# find -maxdepth 1 -type d # 找出所有的目录,并且只找第一层:-maxdepth 1 ;-maxdepth 1 建议写在 -type d 前面,要不然会出现 warning (-maxdepth 表示最大的深度) . ./xiaofan ./xingfujie ./xiaodong ./ext ./test [root@NEO oldboy]# find -maxdepth 1 -type d -name "." # 找出第1层、名为 “.” 的所有目录 . [root@NEO oldboy]# find -maxdepth 1 -type d ! -name "." # 找出第1层、名字不为 “.” 的所有目录;find 命令中 取反 的符号为 “!” ./xiaofan ./xingfujie ./xiaodong ./ext ./test [root@NEO oldboy]#
方法三: ls -l 的方法
[root@NEO oldboy]# ls -l total 20 drwxr-xr-x 3 root root 4096 Mar 15 19:21 ext -rw-r--r-- 1 root root 0 Mar 15 19:21 jeacen -rw-r--r-- 1 root root 0 Mar 15 19:21 oldboy drwxr-xr-x 2 root root 4096 Mar 15 19:21 test -rw-r--r-- 1 root root 0 Mar 15 19:21 wodi.gz drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaodong drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaofan drwxr-xr-x 2 root root 4096 Mar 15 19:21 xingfujie -rw-r--r-- 1 root root 0 Mar 15 19:21 yingsui.gz [root@NEO oldboy]# ls -l |grep "^d" # d 表示 目录, ^ 表示以什么开头 drwxr-xr-x 3 root root 4096 Mar 15 19:21 ext drwxr-xr-x 2 root root 4096 Mar 15 19:21 test drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaodong drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaofan drwxr-xr-x 2 root root 4096 Mar 15 19:21 xingfujie [root@NEO oldboy]#
方法四: awk
[root@NEO oldboy]# ls -l total 20 drwxr-xr-x 3 root root 4096 Mar 15 19:21 ext -rw-r--r-- 1 root root 0 Mar 15 19:21 jeacen -rw-r--r-- 1 root root 0 Mar 15 19:21 oldboy drwxr-xr-x 2 root root 4096 Mar 15 19:21 test -rw-r--r-- 1 root root 0 Mar 15 19:21 wodi.gz drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaodong drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaofan drwxr-xr-x 2 root root 4096 Mar 15 19:21 xingfujie -rw-r--r-- 1 root root 0 Mar 15 19:21 yingsui.gz # 从上面的 ls -l 可以看出,目录的第2列都大于1 [root@NEO oldboy]# ls -l |awk '$2>1' # awk 后面要用 单引号;awk命令中,$2 表示第2列 total 20 drwxr-xr-x 3 root root 4096 Mar 15 19:21 ext drwxr-xr-x 2 root root 4096 Mar 15 19:21 test drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaodong drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaofan drwxr-xr-x 2 root root 4096 Mar 15 19:21 xingfujie [root@NEO oldboy]#
方法五: ls -F
# ls 命令的 -F 参数会给目录的结尾加上一个 / [root@NEO oldboy]# ls ext jeacen oldboy test wodi.gz xiaodong xiaofan xingfujie yingsui.gz [root@NEO oldboy]# ls -F ext/ jeacen oldboy test/ wodi.gz xiaodong/ xiaofan/ xingfujie/ yingsui.gz [root@NEO oldboy]# ls -lF total 20 drwxr-xr-x 3 root root 4096 Mar 15 19:21 ext/ -rw-r--r-- 1 root root 0 Mar 15 19:21 jeacen -rw-r--r-- 1 root root 0 Mar 15 19:21 oldboy drwxr-xr-x 2 root root 4096 Mar 15 19:21 test/ -rw-r--r-- 1 root root 0 Mar 15 19:21 wodi.gz drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaodong/ drwxr-xr-x 2 root root 4096 Mar 15 19:21 xiaofan/ drwxr-xr-x 2 root root 4096 Mar 15 19:21 xingfujie/ -rw-r--r-- 1 root root 0 Mar 15 19:21 yingsui.gz [root@NEO oldboy]# ls -F |grep '/' ext/ test/ xiaodong/ xiaofan/ xingfujie/ [root@NEO oldboy]#
练习2. 假如当前目录是 /oldboy ,现在需要进入到 /tmp 目录下进行操作,执行的命令是: cd /tmp ,操作完毕后,需要快速返回上一次进入的目录,即 /oldboy 目录,该如何做 ?(不能用 cd /oldboy 命令)
# 简单说:快速回到上一次所在的位置/目录 的命令: cd - [root@NEO oldboy]# pwd /oldboy [root@NEO oldboy]# cd /tmp/ [root@NEO tmp]# cd - /oldboy [root@NEO oldboy]# # - 是一个环境变量; cd - 相当于 cd $OLDPWD # cd . ===> # . 表示 当前目录,一般用于 复制/移动: cp /etc/hosts . # 复制到当前目录 # cd .. ===> # 进入到当前目录的上一级目录 # cd ~ ===> # ~ 表示当前用户的家目录; root 用户的家目录是 /root ,普通用户(如 oldboy)的家目录是 /home/oldboy # cd ===> # 回到当前用户的家目录 # cd - ===> # 回到上一次的位置/路径
练习3. 一个目录中有很多文件(ls查看时好多屏),想最快速度查看到最近更新的文件
# 命令: ls -lt # ls -l 默认是按照字母的顺序;ls -lt 会按时间降序排序, ls -lrt 会按时间升序排序;-t 按照文件的修改时间进行排序,-r 表示 逆序
练习5. 调试系统服务时,希望能【实时】查看系统日志 /var/log/messages 的更新
tail -f # -f 表示 显示文件的实时更新 # tailf 即相当于 tail -f
练习6. 打印配置文件 nginx.conf 内容的行号及内容
# 创建环境: [root@NEO oldboy]# pwd /oldboy [root@NEO oldboy]# echo {1..5} # echo {1..5} 能显示出 从1到5 1 2 3 4 5 [root@NEO oldboy]# echo stu{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 [root@NEO oldboy]# echo stu{01..10}|xargs -n1 # xargs -n1 表示 一列 stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 [root@NEO oldboy]# echo stu{01..10}|xargs -n1 >nginx.conf [root@NEO oldboy]# cat nginx.conf stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 [root@NEO oldboy]# # 方式一: cat -n 命令 # cat -n 命令: 查看内容及行号 [root@NEO oldboy]# cat -n nginx.conf 1 stu01 2 stu02 3 stu03 4 stu04 5 stu05 6 stu06 7 stu07 8 stu08 9 stu09 10 stu10 [root@NEO oldboy]# # 方式二: vi/vim # 通过 vi/vim 进入文件后, :set nu ---> 显示行号 ; :set nonu ---> 取消显示行号 (只是显示、取消显示行号,不会修改文件内容) [root@NEO oldboy]# vim nginx.conf "nginx.conf" 10L, 60C 1,1 All 1 stu01 2 stu02 3 stu03 4 stu04 5 stu05 6 stu06 7 stu07 8 stu08 9 stu09 10 stu10 ~ ~ ~ ~ ~ :set nu # 方式三: grep # grep -n 命令: 给找到的内容加上行号 [root@NEO oldboy]# [root@NEO oldboy]# grep -n 'stu01' nginx.conf 1:stu01 [root@NEO oldboy]# grep -n 'stu' nginx.conf 1:stu01 2:stu02 3:stu03 4:stu04 5:stu05 6:stu06 7:stu07 8:stu08 9:stu09 10:stu10 [root@NEO oldboy]# grep -n "." nginx.conf # grep 命令中的 . 是正则表达式的内容;表示任何一个符号 1:stu01 2:stu02 3:stu03 4:stu04 5:stu05 6:stu06 7:stu07 8:stu08 9:stu09 10:stu10 [root@NEO oldboy]# # 方式四: awk # awk '{print NR,$0}' # awk 后面的 {} 中, print 表示 显示, NR 表示行号,$0 表示这一行的内容放在了 $0 里面,$数字 表示 某一列 [root@NEO oldboy]# awk '{print NR,$0}' nginx.conf 1 stu01 2 stu02 3 stu03 4 stu04 5 stu05 6 stu06 7 stu07 8 stu08 9 stu09 10 stu10 [root@NEO oldboy]# # 方法五: sed # sed '=' 命令: 显示行号和内容;sed 中 = 表示给这一行加上行号 [root@NEO oldboy]# sed '=' nginx.conf 1 stu01 2 stu02 3 stu03 4 stu04 5 stu05 6 stu06 7 stu07 8 stu08 9 stu09 10 stu10 [root@NEO oldboy]# sed '=' nginx.conf |xargs -n2 # -n2 表示 每行两列 1 stu01 2 stu02 3 stu03 4 stu04 5 stu05 6 stu06 7 stu07 8 stu08 9 stu09 10 stu10 [root@NEO oldboy]#
练习4. 已知 apache 服务的访问日志按天记录在服务器本地目录 /app/logs 下,由于磁盘空间紧张,现在要求只能保留最近7天的访问日志。请给出解决办法或配置或处理命令(提示:可以从 apache 服务配置上着手,也可以从生成出来的日志上着手)
# 数据模拟命令: mkdir -p /app/logs cd /app/logs for time in {01..20};do date -s "201705$time";touch access_www_$(date +%F).log ;done date -s "20170520" # date 命令: 显示系统的时间;date -s ---> 修改系统的时间 # find -mtime 7 ---> 找到第前7天修改的文件; # find -mtime +7 ---> 找到7天之前修改的文件; # find -mtime -7 ---> 找到最近7天修改的文件; # 方法一: # find -type f -name "*.log" -mtime +7|xargs rm -f find -type f -name "*.log" -mtime +7|xargs ls -l # 方法二: ls -l $(find -type f -name "*.log" -mtime +7) # 方法三: find -type f -name "*.log" -mtime +7 -exec ls -l {} \; # find -exec {} \; 命令: find 找到的内容全部都放到 {} 中
练习7. 装完系统后,希望让网络文件共享服务 NFS(iptables),仅在3级别上开机自启动,该如何做?
[root@NEO ~]# chkconfig |grep ipt iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@NEO ~]# # 上面的数字即表示 在哪个级别上把 iptables 开机是否自启动 # 只在3级别上把 iptables 开机自启动 : chkconfig --level 3 iptables on [root@NEO ~]# chkconfig --level 3 iptables on [root@NEO ~]# chkconfig |grep ipt iptables 0:off 1:off 2:off 3:on 4:off 5:off 6:off [root@NEO ~]# # chkconfig --level ---> 指定运行级别进行操作
练习8. /etc/ 目录为linux 系统的默认配置文件及服务启动命令的目录
- 用 tar 打包/etc 整个目录(打包及压缩)
-
把a点命令的压缩包,解压到 /tmp 指定目录下 (最好只用 tar 命令实现: -C 路径)
- 用 tar 打包 /etc 整个目录 (打包及压缩,但需要排除 /etc/services 文件)
# tar 命令: 创建、查看、解压 压缩包 # 创建压缩包 tar zcvf /tmp/etc.tar.gz /etc/ # 通过 gzip 创建一个压缩包,压缩包放在 /etc 下;zcvf --> 创建压缩包; /tmp/etc.tar.gz --> 压缩包存放的位置; /etc/ --> 被压缩的目标 (被压缩的目录可以有多个) # z ---> 通过 gzip 工具进行压缩;z 表示 压缩,没有 z 表示打包 # c ---> create,创建压缩包 # v ---> verbose,显示执行过程 # f ---> file, f 后面要接上压缩包的名字 # 查看压缩包的内容 tar ztf /tmp/etc.tar.gz # z ---> gzip # t ---> list,显示压缩包的内容 # 解压 压缩包: # 1. 先进入到 /tmp/ 目录 # 2. 解压压缩包 cd /tmp/ tar zxf etc.tar.gz # 或者 tar zxvf etc.tar.gz # 默认是解压到当前目录 [root@NEO tmp]# tar zxf etc.tar.gz tar: etc/prelink.cache: time stamp 2019-03-16 07:34:21 is 24187.13954116 s in the future [root@NEO tmp]# ll total 9512 drwxr-xr-x 78 root root 4096 Mar 16 00:01 etc -rw-r--r-- 1 root root 9732526 Mar 16 00:28 etc.tar.gz [root@NEO tmp]# # 将上面的命令简写: # 创建压缩包: tar zcvf zcf ---> 打包 并 压缩 cf ---> 打包(在一起) # 查看压缩包的内容: tar ztf tf # 解压: tar zxvf xf # 解压时也可以通过 -C 参数指定解压路径 # tar 命令的提示: [root@NEO tmp]# tar zcf /tmp/etc.tar.gz /etc/ tar: Removing leading `/' from member names # Removing leading `/' from member names ===> 把压缩包中开头的 '/' 删除 ; /etc/ 变成 etc/ # 所以 tar 命令打包的时候会把压缩包中的文件/目录由 绝对路径 变成 相对路径 # 用 tar 打包 /etc 整个目录 (打包及压缩,但需要排除 /etc/services 文件) # tar zcf 压缩包名 要压缩的目标 --exclude=文件名 [root@NEO ~]# tar zcf /tmp/etc.tar.gz /etc/ tar: Removing leading `/' from member names tar: Removing leading `/' from hard link targets [root@NEO ~]# tar zcf /tmp/etc-exclude.tar.gz /etc/ --exclude=/etc/services tar: Removing leading `/' from member names tar: Removing leading `/' from hard link targets [root@NEO ~]# ll /tmp/ total 18892 -rw-r--r-- 1 root root 9605653 Mar 16 02:45 etc-exclude.tar.gz -rw-r--r-- 1 root root 9732526 Mar 16 02:45 etc.tar.gz [root@NEO ~]#
练习9. 已知如下命令及结果:
mkdir -p /oldboy echo "I am oldboy,myqq is 123456789">/oldboy/oldboy.txt a. 现在需要从文件中过滤出 "oldboy" 和 "123456789" 字符串; b. 如果需要从文件中过滤出 "oldboy,123456789" 字符串,请给出命令
a. 现在需要从文件中过滤出 "oldboy" 和 "123456789" 字符串;
# 方法一: sed # 利用 sed 把不要的东西替换为空 [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 [root@NEO oldboy]# sed 's#I am ##g' oldboy.txt oldboy,myqq is 123456789 [root@NEO oldboy]# sed 's#I am ##g' oldboy.txt |sed 's#,myqq is##g' oldboy 123456789 [root@NEO oldboy]# # 方法二:sed/tr + awk # awk 擅长取列,列与列之间的分隔符默认为 空格;第1列用 $1 表示,$2 表示第2列,以此类推 [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 [root@NEO oldboy]# awk '{print $3,$5}' oldboy.txt oldboy,myqq 123456789 [root@NEO oldboy]# # 思路:先用 sed 把 , 替换为 空格,再用 awk 取出第3列 和 第6列 [root@NEO oldboy]# sed 's#,# #g' oldboy.txt I am oldboy myqq is 123456789 [root@NEO oldboy]# sed 's#,# #g' oldboy.txt |awk '{print $3,$6}' oldboy 123456789 [root@NEO oldboy]# # 替换 的另一种方式: tr # tr "," " " <oldboy.txt # 把 , 替换为 空格,利用 < 进行输入重定向 [root@NEO oldboy]# tr "," " " <oldboy.txt I am oldboy myqq is 123456789 [root@NEO oldboy]# tr "," " " <oldboy.txt |awk '{print $3,$6}' oldboy 123456789 [root@NEO oldboy]# # 方法三: 利用 awk 指定多个分隔符号 # awk -F 可以指定新的的分隔符 # 指定一个分隔符号:awk -F "分隔符" [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 [root@NEO oldboy]# awk -F "," '{print $1}' oldboy.txt I am oldboy [root@NEO oldboy]# # 指定多个分隔符号: awk -F "[多个分隔符号]" [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 [root@NEO oldboy]# awk -F "[, ]" '{print $3,$6}' oldboy.txt oldboy 123456789 [root@NEO oldboy]# # awk -F "[, ]" # 指定以 , 和 空格 作为分隔符号
b. 如果需要从文件中过滤出 "oldboy,123456789" 字符串,请给出命令
# awk 中的 '{print $3,$6}' 中的 , 相当于 空格,如果想在结果中显示 "," , 可以用下面的方法:(加上 "") [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 [root@NEO oldboy]# awk -F "[, ]" '{print $3","$6}' oldboy.txt oldboy,123456789 [root@NEO oldboy]# # awk '{print ""}' 中的 "" 中的内容会原封不动的显示出来
练习10. 如何查看 /etc/services 文件中有多少行?
# wc -l 文件 ---> 统计文件中有多少行 [root@NEO oldboy]# wc -l /etc/services 10774 /etc/services [root@NEO oldboy]# # 查看 sshd 远程连接进程是否在运行: ps -ef ---> 显示系统中正在运行的进程 [root@NEO oldboy]# ps -ef |grep "sshd" root 1422 1 0 00:01 ? 00:00:00 /usr/sbin/sshd root 1702 1422 0 02:43 ? 00:00:00 sshd: root@pts/1 root 1816 1704 0 04:22 pts/1 00:00:00 grep sshd [root@NEO oldboy]# # 上面第一行 表示 sshd 的进程,第一行下面的 表示 创建的连接 [root@NEO oldboy]# ps -ef |grep "/sshd" # 加上 / 能过滤出 sshd 的进程 root 1422 1 0 00:01 ? 00:00:00 /usr/sbin/sshd root 1818 1704 0 04:24 pts/1 00:00:00 grep /sshd [root@NEO oldboy]# # 扩展: [root@NEO oldboy]# ps -ef |grep "/sshd"|wc -l 2 [root@NEO oldboy]# # 上面的结果 “2” 表示 进程运行正常 # wc -l 的作用: 统计出现的次数
练习11. 过滤出 /etc/services 文件包含 3306 或 1521 两个数字所在行的内容
# grep 中的 “或者” 用 | 来表示,此时不能再用 grep ,而是 egrep (grep 不支持 | 这种正则表达式); egrep 相当于 grep -E,它支持高级的正则 [root@NEO oldboy]# egrep "3306|1521" /etc/services mysql 3306/tcp # MySQL mysql 3306/udp # MySQL ncube-lm 1521/tcp # nCube License Manager ncube-lm 1521/udp # nCube License Manager [root@NEO oldboy]#
练习12. 命令行及 shell 中加单引号和加双引号的区别:
# 单引号: 所见即所得,吃啥吐啥(单引号中的内容会原封不动的显示出来) # 双引号: 双引号中的内容和单引号的类似,但双引号中的 特殊符号 会被解析、运行 [root@NEO oldboy]# echo '$LANG $(hostname) `pwd`' $LANG $(hostname) `pwd` [root@NEO oldboy]# echo "$LANG $(hostname) `pwd`" en_US.UTF-8 NEO /oldboy [root@NEO oldboy]# [root@NEO oldboy]# echo "hello world $LANG $(hostname) `pwd`" hello world en_US.UTF-8 NEO /oldboy