So Tired !_! 逆水行舟, 不进则退!

12Oct/18

减小lvm根分区容量, 分配到swap

Posted by Nick Xu

在安装Linux系统时LVM划分/分区过大,使用一段时间后觉得没必要把/分区(/dev/vgsrv/root)分的这么大(100G呢),此时可以从Linux安装光盘启动进入rescue模式,选择相关的语言,键盘模式,当系统提示启用网络设备时,选择“NO”,然后在提示允许rescue模式挂载本地Linux系统到/mnt/sysimage下时选择“Skip”,文件系统必须不被挂载才可以对/分区减小容量操作。最后系统会提示选择进入shell终端还是reboot机器,选择进入shell终端。

依次输入pvscan、vgscan、lvscan三个命令扫描pv、vg、lv相关信息,

然后输入 lvchange -ay /dev/vgsrv/root(上文提到的/分区名称)此命令是激活/分区所在的逻辑卷。

下一步是缩小文件系统大小和逻辑卷/dev/vgsrv/root,

在缩小文件系统前先检查下硬盘,e2fsck -f /dev/vgsrv/root

缩小文件系统为指定大小: resize2fs/dev/vgsrv/root 50G

设置逻辑卷大小为50G:lvreduce -L 50g /dev/vgsrv/root

系统会进入是否缩小逻辑卷,输入 y 确定。

再检查下硬盘,e2fsck -f /dev/vgsrv/root

缩小逻辑卷成功后可输入vgdisplay,lvdisplay查看。输入exit可退出rescue模式。

 

正常进入系统后, 下面针对系统Swap分区扩容与缩减做说明: 

[root@server10 ~]# free -g
            total       used       free     shared    buffers     cached
Mem:            62         62          0          0          0         60
-/+ buffers/cache:          2         60
Swap:          127          0        127
[root@server10 ~]# df -h
[root@server10 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
[root@server10 ~]# lvdisplay
 --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
 VG Name                VolGroup00
 LV UUID                oZ7rEm-hphT-MsGk-fNaD-RC5X-INgZ-oCJdml
 LV Write Access        read/write
 LV Status              available
 # open                 1
  LV Size                150.84 GB
 Current LE             4827
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:0
 
 --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol01
 VG Name                VolGroup00
 LV UUID                pCpqVB-cwXV-MunF-OtBQ-usYA-hFxt-l07IJc
 LV Write Access        read/write
 LV Status              available
 # open                 1
  LV Size                127.91 GB
 Current LE             4093
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:1
 
[root@server10 ~]# vgdisplay
 --- Volume group ---
 VG Name               VolGroup00
 System ID            
 Format                lvm2
 Metadata Areas        1
 Metadata Sequence No  3
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                2
 Open LV               2
 Max PV                0
 Cur PV                1
 Act PV                1
 VG Size               278.75 GB
 PE Size               32.00 MB
 Total PE              8920
  Alloc PE / Size       8920 / 278.75 GB
 Free  PE / Size       0 / 0  

 VG UUID               9hHRZZ-VUd4-bMwc-rnhK-wiyq-sPZw-dtJREo  
[root@server10 ~]# free -m
            total       used       free     shared    buffers     cached
Mem:         64449      64129        320          0        327      61494
-/+ buffers/cache:       2307      62142
Swap:       130975          0     130975
[root@server10 ~]# swapoff -a
[root@server10 ~]# free -m
            total       used       free     shared    buffers     cached
Mem:         64449      64065        384          0        327      61494
-/+ buffers/cache:       2243      62206
Swap:            0          0          0
[root@server10 ~]# lvreduce /dev/VolGroup00/LogVol01 -L -64G
 WARNING: Reducing active logical volume to 63.91 GB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce LogVol01? [y/n]: y
 Reducing logical volume LogVol01 to 63.91 GB
 Logical volume LogVol01 successfully resized
[root@server10 ~]# mkswap /dev/VolGroup00/LogVol01
Setting up swapspace version 1, size = 68618809 kB
[root@server10 ~]# swapon /dev/VolGroup00/LogVol01
[root@server10 ~]# free -m
            total       used       free     shared    buffers     cached
Mem:         64449      64150        299          0        327      61549
-/+ buffers/cache:       2273      62175
Swap:        65439          0      65439
[root@server10 ~]# free -g
            total       used       free     shared    buffers     cached
Mem:            62         62          0          0          0         60
-/+ buffers/cache:          2         60
Swap:           63          0         63
[root@server10 ~]# vgdisplay
 --- Volume group ---
 VG Name               VolGroup00
 System ID            
 Format                lvm2
 Metadata Areas        1
 Metadata Sequence No  4
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                2
 Open LV               2
 Max PV                0
 Cur PV                1
 Act PV                1
 VG Size               278.75 GB
 PE Size               32.00 MB
 Total PE              8920
  Alloc PE / Size       6872 / 214.75 GB
 Free  PE / Size       2048 / 64.00 GB

 VG UUID               9hHRZZ-VUd4-bMwc-rnhK-wiyq-sPZw-dtJREo
 
[root@server10 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     147G   74G   65G  54% /

/dev/sda1              99M   13M   81M  14% /boot
tmpfs                  32G     0   32G   0% /dev/shm
[root@server10 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
[root@server10 ~]# lvextend /dev/VolGroup00/LogVol00 -l +100%FREE
  Extending logical volume LogVol00 to 214.84 GB
 Logical volume LogVol00 successfully resized

[root@server10 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     147G   74G   65G  54% /

/dev/sda1              99M   13M   81M  14% /boot
tmpfs                  32G     0   32G   0% /dev/shm
[root@server10 ~]# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 56320000 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 56320000 blocks long.

[root@server10 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     209G   74G  124G  38% /

/dev/sda1              99M   13M   81M  14% /boot
tmpfs                  32G     0   32G   0% /dev/shm
[root@server10 ~]# 

------------------------------------------------------------------

以上是减容量,下面针对增加容量做一下命令解析:

swapoff -a   //关闭swap分区
lvextend -l +100%free /dev/VolGroup00/LogVol00 //增加swap卷所有可用空间
mkswap /dev/VolGroup00/LogVol00 //建立swap分区
swapon /dev/VolGroup00/LogVol00//启用swap分区

Filed under: Linux Comments Off
5Sep/18

Python图片验证码识别

Posted by Nick Xu

大致介绍

在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类:

1、计算验证码

2、滑块验证码

3、识图验证码

4、语音验证码

这篇博客主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库。

识别验证码通常是这几个步骤:

1、灰度处理

2、二值化

3、去除边框(如果有的话)

4、降噪

5、切割字符或者倾斜度矫正

6、训练字体库

7、识别

这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要,并不一定切割验证码,识别率就会上升很多有时候还会下降

这篇博客不涉及训练字体库的内容,请自行搜索。同样也不讲解基础的语法。

用到的几个主要的python库: Pillow(python图像处理库)、OpenCV(高级图像处理库)、pytesseract(识别库)

 

灰度处理&二值化

灰度处理,就是把彩色的验证码图片转为灰色的图片。

二值化,是将图片处理为只有黑白两色的图片,利于后面的图像处理和识别

在OpenCV中有现成的方法可以进行灰度处理和二值化,处理后的效果:

 

代码:

复制代码
 1 # 自适应阀值二值化
 2 def _get_dynamic_binary_image(filedir, img_name):
 3   filename =   './out_img/' + img_name.split('.')[0] + '-binary.jpg'
 4   img_name = filedir + '/' + img_name
 5   print('.....' + img_name)
 6   im = cv2.imread(img_name)
 7   im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #灰值化
 8   # 二值化
 9   th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)
10   cv2.imwrite(filename,th1)
11   return th1
复制代码

 

去除边框

如果验证码有边框,那我们就需要去除边框,去除边框就是遍历像素点,找到四个边框上的所有点,把他们都改为白色,我这里边框是两个像素宽

注意:在用OpenCV时,图片的矩阵点是反的,就是长和宽是颠倒的

代码:

复制代码
# 去除边框
def clear_border(img,img_name):
  filename = './out_img/' + img_name.split('.')[0] + '-clearBorder.jpg'
  h, w = img.shape[:2]
  for y in range(0, w):
    for x in range(0, h):
      if y < 2 or y > w - 2:
        img[x, y] = 255
      if x < 2 or x > h -2:
        img[x, y] = 255

  cv2.imwrite(filename,img)
  return img
复制代码

 

效果:

降噪

降噪是验证码处理中比较重要的一个步骤,我这里使用了点降噪和线降噪

线降噪的思路就是检测这个点相邻的四个点(图中标出的绿色点),判断这四个点中是白点的个数,如果有两个以上的白色像素点,那么就认为这个点是白色的,从而去除整个干扰线,但是这种方法是有限度的,如果干扰线特别粗就没有办法去除,只能去除细的干扰线

代码:

复制代码
 1 # 干扰线降噪
 2 def interference_line(img, img_name):
 3   filename =  './out_img/' + img_name.split('.')[0] + '-interferenceline.jpg'
 4   h, w = img.shape[:2]
 5   # !!!opencv矩阵点是反的
 6   # img[1,2] 1:图片的高度,2:图片的宽度
 7   for y in range(1, w - 1):
 8     for x in range(1, h - 1):
 9       count = 0
10       if img[x, y - 1] > 245:
11         count = count + 1
12       if img[x, y + 1] > 245:
13         count = count + 1
14       if img[x - 1, y] > 245:
15         count = count + 1
16       if img[x + 1, y] > 245:
17         count = count + 1
18       if count > 2:
19         img[x, y] = 255
20   cv2.imwrite(filename,img)
21   return img
复制代码

 

点降噪的思路和线降噪的差不多,只是会针对不同的位置检测的点不一样,注释写的很清楚了

代码:

复制代码
# 点降噪
def interference_point(img,img_name, x = 0, y = 0):
    """
    9邻域框,以当前点为中心的田字框,黑点个数
    :param x:
    :param y:
    :return:
    """
    filename =  './out_img/' + img_name.split('.')[0] + '-interferencePoint.jpg'
    # todo 判断图片的长宽度下限
    cur_pixel = img[x,y]# 当前像素点的值
    height,width = img.shape[:2]

    for y in range(0, width - 1):
      for x in range(0, height - 1):
        if y == 0:  # 第一行
            if x == 0:  # 左上顶点,4邻域
                # 中心点旁边3个点
                sum = int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x + 1, y]) \
                      + int(img[x + 1, y + 1])
                if sum <= 2 * 245:
                  img[x, y] = 0
            elif x == height - 1:  # 右上顶点
                sum = int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x - 1, y]) \
                      + int(img[x - 1, y + 1])
                if sum <= 2 * 245:
                  img[x, y] = 0
            else:  # 最上非顶点,6邻域
                sum = int(img[x - 1, y]) \
                      + int(img[x - 1, y + 1]) \
                      + int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x + 1, y]) \
                      + int(img[x + 1, y + 1])
                if sum <= 3 * 245:
                  img[x, y] = 0
        elif y == width - 1:  # 最下面一行
            if x == 0:  # 左下顶点
                # 中心点旁边3个点
                sum = int(cur_pixel) \
                      + int(img[x + 1, y]) \
                      + int(img[x + 1, y - 1]) \
                      + int(img[x, y - 1])
                if sum <= 2 * 245:
                  img[x, y] = 0
            elif x == height - 1:  # 右下顶点
                sum = int(cur_pixel) \
                      + int(img[x, y - 1]) \
                      + int(img[x - 1, y]) \
                      + int(img[x - 1, y - 1])

                if sum <= 2 * 245:
                  img[x, y] = 0
            else:  # 最下非顶点,6邻域
                sum = int(cur_pixel) \
                      + int(img[x - 1, y]) \
                      + int(img[x + 1, y]) \
                      + int(img[x, y - 1]) \
                      + int(img[x - 1, y - 1]) \
                      + int(img[x + 1, y - 1])
                if sum <= 3 * 245:
                  img[x, y] = 0
        else:  # y不在边界
            if x == 0:  # 左边非顶点
                sum = int(img[x, y - 1]) \
                      + int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x + 1, y - 1]) \
                      + int(img[x + 1, y]) \
                      + int(img[x + 1, y + 1])

                if sum <= 3 * 245:
                  img[x, y] = 0
            elif x == height - 1:  # 右边非顶点
                sum = int(img[x, y - 1]) \
                      + int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x - 1, y - 1]) \
                      + int(img[x - 1, y]) \
                      + int(img[x - 1, y + 1])

                if sum <= 3 * 245:
                  img[x, y] = 0
            else:  # 具备9领域条件的
                sum = int(img[x - 1, y - 1]) \
                      + int(img[x - 1, y]) \
                      + int(img[x - 1, y + 1]) \
                      + int(img[x, y - 1]) \
                      + int(cur_pixel) \
                      + int(img[x, y + 1]) \
                      + int(img[x + 1, y - 1]) \
                      + int(img[x + 1, y]) \
                      + int(img[x + 1, y + 1])
                if sum <= 4 * 245:
                  img[x, y] = 0
    cv2.imwrite(filename,img)
    return img
复制代码

 

效果:

 

其实到了这一步,这些字符就可以识别了,没必要进行字符切割了,现在这三种类型的验证码识别率已经达到50%以上了

 

字符切割

字符切割通常用于验证码中有粘连的字符,粘连的字符不好识别,所以我们需要将粘连的字符切割为单个的字符,在进行识别

字符切割的思路就是找到一个黑色的点,然后在遍历与他相邻的黑色的点,直到遍历完所有的连接起来的黑色的点,找出这些点中的最高的点、最低的点、最右边的点、最左边的点,记录下这四个点,认为这是一个字符,然后在向后遍历点,直至找到黑色的点,继续以上的步骤。最后通过每个字符的四个点进行切割

图中红色的点就是代码执行完后,标识出的每个字符的四个点,然后就会根据这四个点进行切割(图中画的有些误差,懂就好)

但是也可以看到,m2是粘连的,代码认为他是一个字符,所以我们需要对每个字符的宽度进行检测,如果他的宽度过宽,我们就认为他是两个粘连在一起的字符,并将它在从中间切割

确定每个字符的四个点代码:

复制代码
def cfs(im,x_fd,y_fd):
  '''用队列和集合记录遍历过的像素坐标代替单纯递归以解决cfs访问过深问题
  '''

  # print('**********')

  xaxis=[]
  yaxis=[]
  visited =set()
  q = Queue()
  q.put((x_fd, y_fd))
  visited.add((x_fd, y_fd))
  offsets=[(1, 0), (0, 1), (-1, 0), (0, -1)]#四邻域

  while not q.empty():
      x,y=q.get()

      for xoffset,yoffset in offsets:
          x_neighbor,y_neighbor = x+xoffset,y+yoffset

          if (x_neighbor,y_neighbor) in (visited):
              continue  # 已经访问过了

          visited.add((x_neighbor, y_neighbor))

          try:
              if im[x_neighbor, y_neighbor] == 0:
                  xaxis.append(x_neighbor)
                  yaxis.append(y_neighbor)
                  q.put((x_neighbor,y_neighbor))

          except IndexError:
              pass
  # print(xaxis)
  if (len(xaxis) == 0 | len(yaxis) == 0):
    xmax = x_fd + 1
    xmin = x_fd
    ymax = y_fd + 1
    ymin = y_fd

  else:
    xmax = max(xaxis)
    xmin = min(xaxis)
    ymax = max(yaxis)
    ymin = min(yaxis)
    #ymin,ymax=sort(yaxis)

  return ymax,ymin,xmax,xmin

def detectFgPix(im,xmax):
  '''搜索区块起点
  '''

  h,w = im.shape[:2]
  for y_fd in range(xmax+1,w):
      for x_fd in range(h):
          if im[x_fd,y_fd] == 0:
              return x_fd,y_fd

def CFS(im):
  '''切割字符位置
  '''

  zoneL=[]#各区块长度L列表
  zoneWB=[]#各区块的X轴[起始,终点]列表
  zoneHB=[]#各区块的Y轴[起始,终点]列表

  xmax=0#上一区块结束黑点横坐标,这里是初始化
  for i in range(10):

      try:
          x_fd,y_fd = detectFgPix(im,xmax)
          # print(y_fd,x_fd)
          xmax,xmin,ymax,ymin=cfs(im,x_fd,y_fd)
          L = xmax - xmin
          H = ymax - ymin
          zoneL.append(L)
          zoneWB.append([xmin,xmax])
          zoneHB.append([ymin,ymax])

      except TypeError:
          return zoneL,zoneWB,zoneHB

  return zoneL,zoneWB,zoneHB
复制代码

 

分割粘连字符代码:

复制代码
      # 切割的位置
      im_position = CFS(im)

      maxL = max(im_position[0])
      minL = min(im_position[0])

      # 如果有粘连字符,如果一个字符的长度过长就认为是粘连字符,并从中间进行切割
      if(maxL > minL + minL * 0.7):
        maxL_index = im_position[0].index(maxL)
        minL_index = im_position[0].index(minL)
        # 设置字符的宽度
        im_position[0][maxL_index] = maxL // 2
        im_position[0].insert(maxL_index + 1, maxL // 2)
        # 设置字符X轴[起始,终点]位置
        im_position[1][maxL_index][1] = im_position[1][maxL_index][0] + maxL // 2
        im_position[1].insert(maxL_index + 1, [im_position[1][maxL_index][1] + 1, im_position[1][maxL_index][1] + 1 + maxL // 2])
        # 设置字符的Y轴[起始,终点]位置
        im_position[2].insert(maxL_index + 1, im_position[2][maxL_index])

      # 切割字符,要想切得好就得配置参数,通常 1 or 2 就可以
      cutting_img(im,im_position,img_name,1,1)
复制代码

 

切割粘连字符代码:

复制代码
def cutting_img(im,im_position,img,xoffset = 1,yoffset = 1):
  filename =  './out_img/' + img.split('.')[0]
  # 识别出的字符个数
  im_number = len(im_position[1])
  # 切割字符
  for i in range(im_number):
    im_start_X = im_position[1][i][0] - xoffset
    im_end_X = im_position[1][i][1] + xoffset
    im_start_Y = im_position[2][i][0] - yoffset
    im_end_Y = im_position[2][i][1] + yoffset
    cropped = im[im_start_Y:im_end_Y, im_start_X:im_end_X]
    cv2.imwrite(filename + '-cutting-' + str(i) + '.jpg',cropped)
复制代码

 

效果:

 

  识别

识别用的是typesseract库,主要识别一行字符和单个字符时的参数设置,识别中英文的参数设置,代码很简单就一行,我这里大多是filter文件的操作

代码:

复制代码
      # 识别验证码
      cutting_img_num = 0
      for file in os.listdir('./out_img'):
        str_img = ''
        if fnmatch(file, '%s-cutting-*.jpg' % img_name.split('.')[0]):
          cutting_img_num += 1
      for i in range(cutting_img_num):
        try:
          file = './out_img/%s-cutting-%s.jpg' % (img_name.split('.')[0], i)
          # 识别字符
          str_img = str_img + image_to_string(Image.open(file),lang = 'eng', config='-psm 10') #单个字符是10,一行文本是7
        except Exception as err:
          pass
      print('切图:%s' % cutting_img_num)
      print('识别为:%s' % str_img)
复制代码

 

最后这种粘连字符的识别率是在30%左右,而且这种只是处理两个字符粘连,如果有两个以上的字符粘连还不能识别,但是根据字符宽度判别的话也不难,有兴趣的可以试一下

无需切割字符识别的效果:

 

需要切割字符的识别效果:

 

 

这种只是能够识别简单验证码,复杂的验证码还要靠大家了

参考资料:

1、http://www.jianshu.com/p/41127bf90ca9

本来参考了挺多的资料,但是时间长了就找不到了,如果有人发现了,可以告诉我,我再添加

使用方法:

 

1、将要识别的验证码图片放入与脚本同级的img文件夹中,创建out_img文件夹
2、python3 filename
3、二值化、降噪等各个阶段的图片将存储在out_img文件夹中,最终识别结果会打印到屏幕上

 

最后附上源码(带切割,不想要切割的就自己修改吧):

 View Code

 

30Aug/18

ubuntu18.04安装mysql 5.5

Posted by Nick Xu

官网下载LINUX编译版本 mysql-5.5.61-linux-glibc2.12-x86_64.tar.gz 解压

  1. shell> sudo apt-get install libaio-dev(或者libaio1)
  2. shell> sudo groupadd mysql
  3. shell> sudo useradd -r /nonexistent -s /bin/false -c mysql -g mysql mysql
  4. shell> sudo cd /usr/local
  5. shell> tar zxvf /home/niumd/mysql-5.5.13-linux2.6-i686.tar.gz
  6. shell> sudo mv /home/niumd/mysql-5.5.13-linux2.6-i686 /usr/local/mysql
  7. shell> cd /usr/local/mysql
  8. shell> sudo chown -R mysql:mysql .
  9. shell> sudo scripts/mysql_install_db --user=mysql     
  10. shell> sudo chown -R mysql:mysql data
  11. shell> sudo cp support-files/mysql.server /etc/init.d/mysql.server
  12. shell> sudo cp support-files/my-medium.cnf /etc/mysql/my.cnf
  13. shell> sudo bin/mysqld_safe --user=mysql & 
  14. shell> sudo pwd /usr/local/mysql
  15. shell> sudo bin/mysqladmin -u root password 'new-password'
  16. shell> sudo bin/mysql -uroot -p
Filed under: Linux Comments Off
27Aug/18

H3C WA2620i-AGN多AP自动漂移设置

Posted by Nick Xu

更多设置地址: http://www0.h3c.com.cn/Service/Document_Center/Wlan/WX/WX5000/Command/Command_Manual/H3C_WX_CR-6W104/02/201208/751156_30005_0.htm

此处只是简单的设置当终端(手机等设备)连接AP的信号值低于某个阀值则AP端主动断开连接, 让终端重新连接, 当终端重新连接时会自动连接到信号较的AP(即距离比较近的AP), 因此只要把多个AP的接入点名称,密码,加密方式设为一致即可, 此操作可实现企业简单无线网络漂移设置, 超多AP节点建议使用AC统一控制.

以下操作通过TELNET或者控制线连接到交换机, 阀值需要自己测试, 根据实际情况调整, 一般情况下20能够满足

wlan option client-reconnect-trigger

【命令】

wlan option client-reconnect-trigger rssi signal-check

undo wlan option client-reconnet-trigger

【视图】

系统视图

【缺省级别】

2:系统级

【参数】

rssi:主动触发无线客户端重连接的信号强度门限值,取值范围为1~40,建议取值为20,单位dBm。

【描述】

wlan option client-reconnect-trigger命令用来配置主动触发无线客户端重连接功能,如果无线客户端接收到信号的rssi值小于配置的门限值,就主动触发无线客户端重连接。当配置了signal-check时,如果无线客户端接收到信号的rssi值小于配置的门限值,不立即触发无线客户端重连接,而是等待检查下一次无线客户端接收到信号的rssi值,如果rssi又减少了3dBm以上,才触发无线客户端重连接,否则,不触发无线客户端重连接。

undo wlan option client-reconnet-trigger命令用来恢复缺省情况。

缺省情况下,关闭主动触发无线客户端重接接功能。

【举例】

# 开启主动触发无线客户端重接接功能。

<sysname> system-view

[sysname] wlan option client-reconnect-trigger 20

Filed under: Linux Comments Off
10Aug/18

编写systemd service文件

Posted by Nick Xu

什么是 Systemd service?

一种以 .service 结尾的单元(unit)配置文件,用于控制由 systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。

编写 Systemd service

基本结构

Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。

和 SysV init 脚本的差异

过去,*nix 服务(守护精灵)都是用 SysV 启动脚本启动的。SysV 启动脚本就是 Bash 脚本,通常在 /etc/init.d 目录下,可以被一些标准参数如 start,stop,restart 等调用。启动该脚本通常意味着启动一个后台守护精灵(daemon)。shell 脚本常见的缺点就是,慢、可读性不强、太详细又很傲娇。虽然它们很灵活(毕竟那就是代码呀),但是有些事只用脚本做还是显得太困难了,比如安排并列执行、正确监视进程,或者配置详细执行环境。

SysV 启动脚本还有一个硬伤就是,臃肿,重复代码太多。因为上述的“标准参数”必须要靠各个脚本来实现,而且各个脚本之间的实现都差不多(根本就是从一个 skeleton 骨架来的)。而 Systemd 则进行了统一实现,也就是说在 Systemd service 中完全就不需要、也看不到这部分内容。这使得 Systemd 服务非常简明易读,例如 NetworkManager 这一重量级程序的服务,算上注释一共才有 19 行。而它相应的 SysV 启动脚本头 100 行连标准参数都没实现完。

Systemd 兼容 Sysv 启动脚本,这也是为什么这么久我们仍然需要一个 systemd-sysvinit 软件包的原因。但是根据以上理由,最好针对所有您安装的守护精灵都使用原生 Systemd 服务来启动。另外,Systemd 服务可无缝用于所有使用 Systemd 的发行版,意思是 Arch 下编写的脚本拿过来依然能够使用。

通常来说,上游应该在发布源代码的同时发布 Systemd 服务,但如果没发布,你可以对照本教学来为它们写一个并贡献给它们。

关于 SysV init 启动脚本的编写可见openSUSE:Packaging_init_scripts,这主要用于你的服务器,毕竟服务器追求稳定软件更新的不是很勤(但你一定不知道欧盟汽车里的车载系统必须是 Systemd)。

真正开始前需要注意的问题

如上所述,Systemd 的 service 文件是完全跨发行版的,所以有时候没有必要重造轮子。真正编写你的服务前,请确认它在各大发行版中完全就不存在:

Systemd 语法

Systemd 语法和 .desktop 文件的语法比较像,也比较类似 Windows 下的 .ini 文件,因此无论对于打包者还是最终用户都是非常容易上手的。

主要格式请见下面的小例子,这里需要说明三点:

  • Systemd 单元文件中的以 “#” 开头的行后面的内容会被认为是注释
  • Systemd 下的布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭。注:

仅限于 Systemd 文件,比如:

RemainOnExit=yes

并不适用于该文件中嵌入的 shell 语句,比如:

ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes

这里的 yes 就不能替换。因为等号后面是一条嵌入的 shell 语句。

  • Systemd 下的时间单位默认是秒,所以要用毫秒(ms)分钟(m)等请显式说明。

一个小例子

NetworkManager 的 Systemd service:

[Unit]
Description=Network Manager
After=syslog.target
Wants=remote-fs.target network.target

[Service]
Type=dbus
BusName=org.freedesktop.NetworkManager
ExecStart=/usr/sbin/NetworkManager --no-daemon
EnvironmentFile=/etc/sysconfig/network/config
ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
# Suppress stderr to eliminate duplicated messages in syslog. NM calls openlog()
# with LOG_PERROR when run in foreground. But systemd redirects stderr to
# syslog by default, which results in logging each message twice.
StandardError=null

[Install]
WantedBy=multi-user.target
Also=NetworkManager-wait-online.service

以下我们以编写我们论坛(https://forum.suse.org.cn)所使用的 He.net IPv6 单元文件为例。

定义控制单元 [Unit]

在 Systemd 中,所有引导过程中 Systemd 要控制的东西都是一个单元。Systemd 单元类型有:

  • 系统服务
  • 套接字(socket)
  • 设备
  • 挂载点
  • 自动挂载点
  • SWAP 文件
  • 分区
  • 启动对象(startup target)
  • 文件系统路径
  • 定时器

简单说,Systemd 把 *nix 里那些分散开发因此宏观看变成一团杂碎的东西重新统一命名了。单元名就是你写的这个 .service 文件的名称。但不只有 .service 后缀的文件才可以是一个单元,单元还可以有 .target, .path 等后缀,具体可以去 /usr/lib/systemd/system 下了解。但那种后缀要么由 Systemd 上游开发者写好随 systemd 软件包分发,要么由我们的 Base:system 团队添加,一般用户是不太需要写其它后缀的控制单元的。

我们先要声明我们在定义控制单元:

[Unit]

单元名称就不用写了,我们要写一条单元描述:

[Unit]
Description=Daemon to start He.net IPv6

下面我们要讲解一下 Systemd 是如何控制各个单元之间的关系的。它和 RPM 的 specfile 的依赖关系控制的语法非常相似(毕竟都是红帽一家的):

  • Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制某单元与它“需要”的单元的启动顺序(启动顺序是另外控制的),即 Systemd 不是先启动 Requires 再启动本单元,而是在本单元被激活时,并行启动两者。于是会产生争分夺秒的问题,如果 Requires 先启动成功,那么皆大欢喜; 如果 Requires 启动得慢,那本单元就会失败(Systemd 没有自动重试)。所以为了系统的健壮性,不建议使用这个标记,而建议使用 Wants 标记。可以使用多个 Requires。
  • RequiresOverridable:跟 Requires 很像。但是如果这条服务是由用户手动启动的,那么 RequiresOverridable 后面的服务即使启动不成功也不报错。跟 Requires 比增加了一定容错性,但是你要确定你的服务是有等待功能的。另外,如果不由用户手动启动而是随系统开机启动,那么依然会有 Requires 面临的问题。
  • Requisite:强势版本的 Requires。要是这里需要的服务启动不成功,那本单元文件不管能不能检测等不能等待都立刻就会失败。
  • Wants:推荐使用。本单元启动了,它“想要”的单元也会被启动。但是启动不成功,对本单元没有影响。
  • Conflicts:一个单元的启动会停止与它“冲突”的单元,反之亦然。注意这里和后面的启动顺序是“正交”的:

两个相互冲突的单元被同时启动,要么两个都启动不了(两者都是第三个单元的 Requires),要么启动一个(有一个是第三个单元的 Requires,另一个不是),不是 Requires 的那个会被停止。要是两者都不是任何一个单元的 Requires,那么 Conflicts 别的那个单元优先启动,被 Conflicts 的后启动,要是互相写了,那么两个都启动不了。

  • OnFailure:很明显,如果本单元失败了,那么启动什么单元作为折衷。

好了,现在我们来想象一下,我们的单元(Ipv6 隧道)应该想要什么呢?很显然是一个连通着的网络。有一个 Systemd 默认提供的对象叫做 network-online.target(默认的 target 列表可见 systemd.special,必看,因为你大多数时候 Wants 的都是一个固定的系统状态而不是其它 systemd 服务),正正好好能够提供我们需要的环境。于是:

[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target

下面我们需要定义一下服务启动顺序,不然连 / 目录所在的硬盘都没挂载就开始干活,上哪儿找程序去呀。Systemd 服务启动顺序主要使用以下两个标记定义的:

  • Before/After:要是一个服务 Before 另一个服务,那么在并行启动时(Systemd 总是用进程 0 并行启动所有东西,然后通过这两个标记来二次等待排序),那另一个服务这时就会等这个服务先启动并返回状态,注意是先启动而不是启动成功,因为失败也是一种状态,一定要成功才启动另一个服务是通过依赖关系定义的。反之 After 亦然。

下面说下“关机”(可以是挂起,这时候有些服务是依然在跑的,比如网络唤醒)时候的顺序:如果两个服务都是要关掉的,Before 是先关自己,After 是先关别人,这很好理解; 但如果一个服务是要关,而另一个是要开的,那么不管 Before/After 写了什么,总是优先关闭而不是开始。也就是比如服务 A Before 服务 B,但是服务 B 是在关,而服务 A 是在 restart,那么服务 B 的顺序在服务 A 的前面。

好啦,我们的单元应该在什么的前后启动呢?它不需要一定在什么服务前面跑起来,这不像 ifup 和 dhcp,网络起不来获取 ip 肯定没用。我们只需要有网就可以了。“有网”在 Systemd 中也是由一个默认 target:network.target 提供的,于是我们的控制单元就定义好了:

[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target
After=network.target

定义服务本体 [service]

在定义完了 Systemd 用来识别服务的单元后,我们来定义服务本体,依然是声明:

[Service]

然后是声明服务类型:

[Service]
Type=

Systemd 支持的服务类型有以下几类:

  • simple 默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。这在图形界面里非常好理解,我打开 Amarok,退出它就没有了。但是命令行的大部分程序都不会那么设计,因为命令行的一个最基本原则就是一个好的程序不能独占命令行窗口。所以输入命令,回车,接着马上返回给你提示符,但程序已经执行了。所以只有少数程序比如 python xxx.py 还使用这种方式。在这种类型下面,如果你的主程序是要响应其它程序的,那么你的通信频道应该在启动本服务前就设好(套接字等),因此这种类型的服务,Systemd 运行它后会立刻就运行下面的服务(需要它的服务),这时没有套接字后面的服务会失败,写 After 也没用,因为 simple 类型不存在主进程退出的情况也就不存在有返回状态的情况,所以它一旦启动就认为是成功的,除非没起来。
  • forking 标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。你要是使用的这种方式,最好也指定下 PIDFILE=,不要让 Systemd 去猜,非要猜也可以,把 GuessMainPID 设为 yes。

判断是 forking 还是 simple 类型非常简单,命令行里运行下你的程序,持续占用命令行要按 Ctrl + C 才可以的,就不会是 forking 类型。

创建 PIDFILE 是你为它写服务的程序的任务而不是 Systemd 的功能,甚至也不是 Sysvinit 脚本的功能。参考 startproc创建pid file的问题了解进一步的知识。因此如果你的程序确实是 forking 类型,但就是没实现创建 PIDFILE 的功能,那么建议使用 ExecStartPost= 结合 shell 命令来手动抓取进程编号并写到 /var/run/xxx.pid。

  • oneshot 顾名思义,打一枪换一个地方。所以这种服务类型就是启动,完成,没进程了。常见比如你设置网络,ifup eth0 up,就是一次性的,不存在 ifup 的子进程(forking 那样),也不存在主进程(simple 那样),它运行完成后便了无痕迹。因为这类服务运行完就没进程了,我们经常会需要 RemainAfterExit=yes。后面配置的意思是说,即使没进程了,我们也要 Systemd 认为该服务是存在并成功了的。所以如果你有一个这样的服务,服务启动后,你再去 ifup eth0 up,这时你再看服务,依然显示是 running 的。因为只要在执行那条一次性命令的时候没出错,那么它就永远认为它是成功并一直存在的,直到你关闭服务。
  • dbus 这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。

一般人也就能用到上面四个,还有两种少见的类型:

  • notify 这个程序在启动完成后会通过 sd_notify 发送一个通知消息。所以还需要配合 NotifyAccess 来让 Systemd 接收消息,后者有三个级别:none,所有消息都忽略掉; main,只接受我们程序的主进程发过去的消息; all,我们程序的所有进程发过去的消息都算。NotifyAccess 要是不写的话默认是 main。
  • idle 这个程序要等它里面调度的全部其它东西都跑完才会跑它自己。比如你 ExecStart 的是个 shell 脚本,里面可能跑了一些别的东西,如果不这样的话,那很可能别的东西的控制台输出里会多一个“启动成功”这样的 Systemd 消息。

由于 He.net 的 IPv6 是用 iproute2 的 ip 命令来弄的,所以是一个 oneshot 一次性服务。

[Service]
Type=oneshot
RemainAfterExit=yes

接下来要设置 ExecStart, ExecStop。如果程序支持的话,你还可以去设置 ExecReload,Restart 等。注意,这里设置的是它们 Reload/Restart 的方式,但并不代表没有它们 Systemd 就不能完成比如 systemctl restart xxx.service 这样的任务,程序有支持自然最好,程序不支持那就先 stop 再 start 咯。同样有特殊要求的时候你也可以去设置比如 ExecStartPre/ExecStartPost,RestartSec,TimeoutSec 等其它东西,参考链接里都有使用方法。

这里要特殊讲一下 ExecStart:

  • 如果你服务的类型不是 oneshot,那么它只可以接受一个命令,参数不限,比如你先 ip tunnel create 再 ip tunnel0 up,那是两个 ip 命令,如果你不是 oneshot 类型这样是不行的。
  • 如果有多条命令(oneshot 类型),命令之间以分号 ; 分隔,跨行可用反斜杠 \。
  • 除非你的服务类型是 forking,否则你在这里输入的命令都会被认为是主进程,不管它是不是。

于是我们的 [Service] 就写好了:

 [Service]
 Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/sbin/ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 108.170.7.158     ttl 255 ; \
           /usr/sbin/ip link set he-ipv6 up ; \
           /usr/sbin/ip addr add 2001:470:c:1184::2/64 dev he-ipv6 ; \
           /usr/sbin/ip route add ::/0 dev he-ipv6 ; \
           /usr/sbin/ip -6 addr
 ExecStop=/usr/sbin/ip route delete ::/0 dev he-ipv6 ; \
          /usr/sbin/ip -6 addr del 2001:470:c:1184::2/64 dev he-ipv6 ; \
          /usr/sbin/ip link set he-ipv6 down ; \
          /usr/sbin/ip tunnel del he-ipv6

安装服务 [install]

这可能有点绕,我服务文件都弄好了,放到 /etc/systemd/system(供系统管理员和用户使用),/usr/lib/systemd/system(供发行版打包者使用)了,不就是安装好了嘛。

这里说的是一种内部状态,默认你放对位置它显示的是 disabled,unloaded,所以我们要在 Systemd 内部对它进行一下 load,没人要的东西是不需要安装的(我们不收渣渣),所以我们要告诉 Systemd 它是有人要的,被谁要。一般都是被

[Install]
WantedBy=multi-user.target 

要(multi-user.target 表示多用户系统好了,简单理解就是你可以登入了)。这样在 multi-user.target 启用时,我们的服务也就会被启用了。

[Install] 部分下除了 WantedBy 还有两种属性,分别是:

  • Alias= 给你自己的别名,这样 systemctl command xxx.service 的时候就可以不输入完整的单元名称。比如你给 NetworkManager 一个别名叫 Alias=nm,那你就可以 systemctl status nm.service 查看实际是 NetworkManager.service 的服务了。
  • Also= 安装本服务的时候还要安装别的什么服务。比如我们的 He.net 脚本按理应该需要一个 iproute2.service 作为 also,但是 iproute2 实际上不需要 systemd 控制,所以就没写。它和 [Unit] 定义里面的依赖关系相比,它管理的不是运行时依赖,而是安装时。安装好了之后启动谁先谁后,谁依赖谁,和 Also= 都没有关系。
Filed under: Linux Comments Off
6Aug/18

openresty 编译安装

Posted by Nick Xu

./configure --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --error-log-path=/home/logs/nginx/error.log --http-log-path=/home/logs/nginx/access.log --pid-path=/home/logs/nginx/nginx.pid --with-http_image_filter_module

make -j2

#安装并打包成deb文件,以便其它机器安装, 此打包方法不含配置文件, 需要解压DEB包后手动编辑control文件加入

checkinstall -D make install

dpkg-deb --extract nginx.deb nginx

dpkg-deb --control nginx.deb

mv DEBIAN nginx/

#修改....

dpkg -b nginx nginx_new.deb

Filed under: Linux Comments Off
2Aug/18

Ubuntu 18.04修改IP地址

Posted by Nick Xu

注:配置/etc/network/interfaces已无用

root@ubuntu:~# vim /etc/netplan/50-cloud-init.yaml

network:
ethernets:
eth0:
addresses: [192.168.15.72/20]
gateway4: 192.168.12.2
nameservers:
addresses: [119.29.29.29, 223.5.5.5]
search: []
optional: true
version: 2

执行命令 使配置生效

root@ubuntu:~# netplan apply



子网掩码以32位的2进制存在,/24表示前24位是网络号,后8位是主机号,网络号相同的则表示处于同一网段中,且子网掩码不能单独存在,它必须结合IP地址一起使用。

255.255.255.0 换成二进制就是11111111.11111111.11111111.00000000 一共24个1
8+8+8+0=24
  • 1
  • 2

举例:

255.255.255.192 换成二进制就是11111111.11111111.11111111.11000000 一共26个1
8+8+8+2=26
  • 1
  • 2
 

 

Tagged as: Comments Off
31Jul/18

Install racadm on Ubuntu / Debian for Dell iDRAC

Posted by Nick Xu

http://linux.dell.com/repo/community/deb/latest/

dell-poweredge-drac7-1.50.50-command-line.pdf

Dell OpenManage 7.1 Ubuntu Repository

This is the community-supported Dell OpenManage 7.1 repository for 64-bit Ubuntu 10.04 or later versions, as well as Debian Squeeze and (pre-release) Wheezy. 32-bit packages are provided as well, which also have the srvadmin-megalib package, but are not tested; use the 32-bit packages at your own risk. Debian Wheezy users will need to get libssl0.9.8 from Debian Squeeze or unstable. For PowerEdge 12G servers, it is highly recommended that you are running Ubuntu 12.04 or later due to better driver coverage. Below, you will find instructions on how to install and setup OpenManage command-line and web interfaces.

IMPORTANT NOTE FOR UPGRADING:

If you are upgrading, in step 4, you must use apt-get install <meta-package name> or apt-get dist-upgrade. Do not use apt-get upgrade, as doing so will not upgrade all the necessary packages.

Installation/Upgrade:

1.  (Optional for Upgrade) Create a new file ending in 'sources.list' in the '/etc/apt/sources.list.d' directory. Cut and paste the command below. (If typing by hand, note carefully the spacing.)

echo 'deb http://linux.dell.com/repo/community/deb/latest /' | sudo tee -a /etc/apt/sources.list.d/linux.dell.com.sources.list

2.  To verify OMSA packages, add the repository key to apt. Note that you must re-do this step if upgrading from OMSA 6.5 because a new key is being used.

gpg --keyserver pool.sks-keyservers.net --recv-key 1285491434D8786F

gpg -a --export 1285491434D8786F | sudo apt-key add -

If you are behind a firewall that only allows outbound traffic over port 80, you may need to use this instead:

gpg --keyserver hkp://pool.sks-keyservers.net:80 --recv-key 1285491434D8786F (possibly needing to add "--keyserver-options http-proxy=http://<user>:<password>@<proxy>:<port>")

gpg -a --export 1285491434D8786F | sudo apt-key add -

3.  Make apt aware of the new software repository by issuing the following command:

sudo apt-get update

4.  Install one of the following selection of meta-packages to install the OMSA functionality you require:

srvadmin-all:Install all OMSA components

srvadmin-base:Install only base OMSA, no web server

srvadmin-rac4:Install components to manage the Dell Remote Access Card 4

srvadmin-rac5:Install components to manage the Dell Remote Access Card 5

srvadmin-idrac:Install components to manage iDRAC

srvadmin-idrac7:Install components to manage iDRAC7

srvadmin-webserver:Install Web Interface

srvadmin-storageservices:Install RAID Management

For example, to install all of OMSA: sudo apt-get install srvadmin-all

If you are upgrading, you must use apt-get install or apt-get dist-upgrade. Do not use apt-get upgrade, as doing so will not upgrade all the necessary packages.

 

CLI:

dataeng service starts automatically at reboot. If you want to manually start the service, issue the command below.

  1. sudo service dataeng start
  2. Now, you can use omreportomconfig, and omhelp commands.
  3. For example, you can issue omreport system summary to get details about your system.
  4. You can use omconfig to configure component properties.
  5. omhelp provides help information for commands.
  6. See OpenManage CLI User's Guide for comprehensive documentation.

 

Web Interface:

To use web interface, users with appropriate permissions need to be added.

1.  Add users with appropriate permissions to /opt/dell/srvadmin/etc/omarolemap file. See detailed information in the User's Guide.

         Example:john_doe     *     Administrator

2.  Start the web server.

         sudo service dsm_om_connsvc start

3.  Go to https://<ip_address>:1311/ in your browser to access OMSA.

4.  If you want to start dsm_om_connvsc service at boot, issue sudo update-rc.d dsm_om_connsvc defaults command.

 

Removal

Uninstall all packages: sudo apt-get --auto-remove remove srvadmin-all

Uninstall all packages including config files: sudo apt-get --auto-remove purge srvadmin-all

 

Documentation:

OpenManage 7.1 Documentation

OMSA 7.1 Manuals

Server Administrator Readme

 

Filed under: Linux Comments Off
25Jul/18

H3C交换机 从console口配置 到设置远程访问(web/telnet)

Posted by Nick Xu

一、console口配置:

现在一般的电脑没有装配com的公口,所以,需要另外购买1根转换线。这里先说原装线的配置:

1、使用交换机自带的,rj45(及网线口)转com(RS232,9孔)线:
买了线才发现,台式服务器(IBM)后面是有这个接口的(机柜式服务器不确定)。
(1)插上线后,xp,打开超级终端;win7、win2008等等,推荐SecureCRT,比网上找的其他的软件好用多了!!
(2)随便写个名字,选择com1端口(!这个很重要!),具体的参数最好按照说明指导书设置,说明指导书可以通过搜索H3C网站相关型号找到。也可以直接点下“恢复默认设置”。
(3)我的经验是,如果只有光标在闪,那么按下回车键,就会出来信息了。

2、使用rj45(网口)转USB线:
(1)首先安装这条线的驱动;
(2)插上线后,xp,打开超级终端;win7、win2008等等,推荐SecureCRT,比网上找的其他的软件好用多了!!
(3)随便写个名字,选择的端口要看“设备管理器”中,“端口”项目中多出来的那个“service。。。”是com几,比如,我的就是“com3”(!这个很重要!),具体的参数最好按照说明指导书设置,说明指导书可以通过搜索H3C网站相关型号找到。也可以直接点下“恢复默认设置”。
(4)我的经验是,如果只有光标在闪,那么按下回车键,就会出来信息了。

二、配置远程访问,包括http和telnet访问:
(1)配置ip和http访问:
sys
[h3c]interface vlan 1  //进入vlan1进行配置
[h3c-vlan-interface1]ip address 192.168.1.1 255.255.255.0 //设置交换机的ip地址
[h3c-vlan-interface1]quit

(1) Device

# Web 用 名为 admin, 为 admin, 为 http,用 为 network-admin。 [Sysname] local-user admin

[Sysname-luser-manage-admin] service-type http
[Sysname-luser-manage-admin] authorization-attribute user-role network-admin

[Sysname-luser-manage-admin] password simple admin

[Sysname-luser-manage-admin] quit

# HTTP 。
[Sysname] ip http enable
(2) PC
在 PC 的 内 的 IP 并 , 示 Web 面。
在 Web 用 对 中 用 名、 及 , < > 可 , 示 Web 面。成 ,用 可以在 对 进行 。

 

(2)配置telnet访问:
sys
[h3c]telnet server enable  //设置允许telnet服务
[h3c]user-interface vty 0  //
[h3c-vty-0]authentication-mode scheme //设置访问模式,包括none(无账户无密码)、password(无账户有密码)、scheme(有账户有密码)
[h3c-vty-0]quit
[h3c]local-user 你的用户名
“[h3c-user-]password cipher 你的密码”//如果之前设置了可以不用写了
“[h3c-user-]anthorization-attribute level 3 “ //设置访问级别  //如果之前设置了可以不用写了
[h3c-user-]service-type telnet//设置该账户的访问模式
[h3c-user-]quit

(3)访问:
之后就可以通过网页访问交换机了,网页输入192.168.1.1,就会进入交换机的登录页面;
xp可以直接在运行里输入”telnet 192.168.1.1“,win7等系统,需要先安装telnet服务,在”程序“,”安装windows功能“里就可以安装了。

Filed under: Linux, Mac OS Comments Off
25Jul/18

rs232 for mac

Posted by Nick Xu

PL-2303芯片,Prolific公司的产品,到官网下载驱动!

打开网站 http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41下载最新的MAC串口驱动,下载完成后安装,安装完还要重启。

重启完成之后我们在“网络偏好设置”中,发现多了一项USB-SerialController

这说明我们的驱动安装成功了!

下面进行简单的测试,终端执行命令:

cd /dev

ls tty.*

你会发现输出中有一项为tty.usbserial,没错,这就是我们的串口设备。

首先配置minicom(minicom的安装非常简单,使用brew安装,终端输入sudo brew install minicom即可),终端输入

安装完了后需要配置,下面是我的配置过程

[root@sheryuan ~]# minicom -s

+-----[configuration]------+
≠ Filenames and paths      ≠
≠ File transfer protocols  ≠
≠ Serial port setup        ≠
≠ Modem and dialing        ≠
≠ Screen and keyboard      ≠
≠ Save setup as dfl        ≠
≠ Save setup as..          ≠
≠ Exit                     ≠
≠ Exit from Minicom        ≠
+--------------------------+

1、Serial port setup选项配置
选择配置项,这里我们主要配置Serial port setup选项,下面是基本配置

+-----------------------------------------------------------------------+
≠ A -    Serial Device      : /dev/ttyS0                                ≠
≠ B - Lockfile Location     : /var/lock                                 ≠
≠ C -   Callin Program      :                                           ≠
≠ D -  Callout Program      :                                           ≠
≠ E -    Bps/Par/Bits       : 115200 8N1                                ≠
≠ F - Hardware Flow Control : No                                        ≠
≠ G - Software Flow Control : No                                        ≠
≠                                                                       ≠
≠    Change which setting?                                              ≠
+-----------------------------------------------------------------------+
A选项Serial Device 根据我们的串口来,如果是COM1我们就选择ttyS0(不过后面说的出错也有例外),COM2口选择ttyS1等等

E选项Bps/Par/Bits串口波特率、数据位、奇偶校验未、停止位设置为115200 8N1

F选项一定要改为NO,不然终端只能打印从下位机发过来的信息,而不能接受键盘的输入

 

2、Modem and dialing选项配置

有些网上的资料都写到Modem and dialing的配置,不过这个可要可不要,因为不配置它和配置它没有感觉有啥区别,不过我每次都进行了配置。

下面是它的配置选项:

+--------------------[Modem and dialing parameter setup]---------------------+
≠                                                                            ≠
≠ A - Init string .........                                                  ≠
≠ B - Reset string ........                                                  ≠
≠ C - Dialing prefix #1.... ATDT                                             ≠
≠ D - Dialing suffix #1.... ^M                                               ≠
≠ E - Dialing prefix #2.... ATDP                                             ≠
≠ F - Dialing suffix #2.... ^M                                               ≠
≠ G - Dialing prefix #3.... ATX1DT                                           ≠
≠ H - Dialing suffix #3.... ;X4D^M                                           ≠
≠ I - Connect string ...... CONNECT                                          ≠
≠ J - No connect strings .. NO CARRIER            BUSY                       ≠
≠                           NO DIALTONE           VOICE                      ≠
≠ K - Hang-up string ......                                                  ≠
≠ L - Dial cancel string .. ^M                                               ≠
≠                                                                            ≠
≠ M - Dial time ........... 45      Q - Auto bps detect ..... No             ≠
≠ N - Delay before redial . 2       R - Modem has DCD line .. Yes            ≠
≠ O - Number of tries ..... 10      S - Status line shows ... DTE speed      ≠
≠ P - DTR drop time (0=no). 1       T - Multi-line untag .... No             ≠
≠                                                                            ≠
≠ Change which setting?       (Return or Esc to exit)                        ≠
+----------------------------------------------------------------------------+
这里A、B、K三个选项后面开始本来都有相应的参数,我们需要将他们删除,设置为无参数

 

这样,我们的minicom就基本配置完成了

 

三、minicom使用过程中遇到的问题

安装和配置minicom都很简单,不过使用中途会出现一些问题,也许这些问题也是安装过程会出现的

 

问题1、执行minicom时locked

[root@sheryuan ~]# minicom
Device /dev/ttyS0 is locked. 或者出现 Device /dev/ttyS0 lock failed: Operation not permitted.

解决方法:这个问题一般是上次直接关闭putty,而没有关闭minicom,或者是putty死机的情况重新打开putty后会出现这种情况,相当于minicom还在后台执行,只是我们没有发觉而已,这里我们执行ps -aux 查看一下是否有minicom进程,获取minicom的进程号,kill -9命令结束后台的minicom,然后启动minicom就会解决问题了

如果遮掩不能解决问题,可能是因为系统自动在目录/var/lock中生成了lockfile而导致,我们只要进入/var/lock,删除lockfile,那么minicom又可以正常启动了。

 

问题2、minicom只能打印下位机信息不能接受键盘的输入

解决方法:这里是由于我们minicom配置没有配置好,重新minicom -s进行Serial port setup配置,Hardware Flow Control : No ,Software Flow Control : No,将软硬控制流都设置为NO。

 

问题3、不能打开串口设备

minicom: cannot open /dev/ttyUSB0

这个问题是我当时重装系统后用,再次用虚拟机时候进入minicom后出现的

解决方法:断开相应的串口然再次连接(虚拟机的右下角操作),然后进入minicom看是否有效。如果实在解决不了问题。我们最好重启一下虚拟机,然后就应该没问题了

 

问题4、minicom运行缓慢,甚至进不去,出现minicom: cannot open /dev/ttyUSB0: Connection timed out的打印信息。

因为我用的是USB转串口线,前段时间在虚拟中用可以不把该端口当USB口用而是当物理串口用,不过安装完系统后不能把其当物理串口,只能把该端口作为USB口用,在/dev下也出现ttyUSB0设备。不过开始在minicom中配置端口为ttyUSB0也可以连接进入arm环境,不过运行很慢,ls命令出来成列文件就有问题,而且经常出现打印的错误,重启了虚拟机几次,换了minicom的版本,还是不行,后来干脆进入不了minicom,出现minicom: cannot open /dev/ttyUSB0: Connection timed out的错误,感觉与问题3相似,但他们完全是两码事情。

解决方法:后来无意中重启物理windows系统,然后运行虚拟机后,发现串口设置中可以将USB串口设置为实际的物理串口,这样我们就不用ttyUSB0而是直接用ttyS0串口,这样下来进入minicom很顺利,而且运行很流畅。

这个问题我思考了一下,可能是我刚装物理机后,USB转串口驱动安装后,最好要重启一下系统。具体问题我现在也数不清楚。

 

问题5、minicom环境下黑白屏显示问题

也是我解决完问题4进入minicom出现的问题,当时感觉很郁闷,因为文件显示没有颜色区分,文件夹、文件、可执行文件等都是一种颜色,白字黑底色。这样当然不行,所以网上搜了很长时间。

进入mincom时采用这个命令minicom -c on代替minicom就可以进入彩色界面了

具体原因我也了解了网上的说法,不过配置里面没有找到相关的设置。

有些终端(如Linux控制台)支持标准ANSI转义序列色彩,minicom硬性内置了这些转义 序列的代码,但是此选项缺省为off,需要使用‘-c on’打开此项。

不过每次都输入minicom -c on 有点烦哦。使用环境变量吧,export minicom="minicom -c on" 以后想要打开对色彩的支持就输入minicom 即可

 

问题先就写这么多,你出现的问题与我一样,但是用我的方法不能解决也是不足为奇的。大家可以到多了解minicom的设置,到网上搜索别人的解决方法进行对比都是可行的。希望能够给予大家帮助,如果以后出现其他的问题,还会继续添加到后面。

 

在Linux下退出minicom 按ctrl-a x 即可。
但是在Mac OS X这个方法失效了。后来找到方法是

http://osxdaily.com/2013/02/01/use-option-as-meta-key-in-mac-os-x-terminal/

把option键映射成 meta键。即打开终端的偏 好设置,把option键映射
这里写图片描述

设置后,按option(即alt)+ a x 即可退出。

 

 

Filed under: Mac OS Comments Off
site
site