VirtualBox虚拟机动态分配的虚拟磁盘用久了以后会变得非常大,相当占用空间。可以采用将磁盘闲置空间重新清零的方法,还原多余的占用空间。

虚拟机中操作

第一步是采用zerofree(Linux)或SDelete(Windows)工具在虚拟机中将磁盘空闲区域清零:

Linux

在Linux虚拟机中,先安装zerofree,以Debian为例,执行 apt-get install zerofree 命令安装。

安装完成后,需要重启虚拟机机器进入Recovery模式,操作过程如下。

开机时进入Advanced options:

在Advanced模式中选择recovery mode:

在Recovery模式下登录后,依次执行以下命令清除/dev/sda1设备的闲置空间:

1
2
3
busybox mount -o ro,remount /dev/sda1
zerofree /dev/sda1
busybox mount -o rw,remount /dev/sda1

其他磁盘设备同理。

Windows

如果是Windows虚拟机,可以在https://docs.microsoft.com/zh-cn/sysinternals/downloads/sdelete 下载微软官方的SDelete工具。

下载后解压并且进入SDelete目录,在CMD中运行SDelete.exe,并提供参数,例如清理C盘,则运行以下命令:

1
SDelete.exe -z C:

主机中操作

等待上述过程执行完成以后,可以进入第二步,在主机中回收虚拟磁盘闲置的空间:

进入Virtualbox的虚拟机目录,这里以一台Debian虚拟机为例,在目录中运行以下命令:

1
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd Debian.vdi --compact

C:\Program Files\Oracle\VirtualBox\是Virtualbox在Windows 64位系统中的默认安装位置,如果安装位置与此不同,修改即可。

等待执行到100%,即可完成磁盘回收。

磁盘回收的过程中有效数据不会丢失,可以放心操作。



使用aapt工具获取apk的信息,可以使用

1
aapt dump badging xxx.apk

如果没有aapt,使用apt安装:

1
apt-get install aapt

写个脚本批量获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash 

target=$1
if [ -d $target ]
then
for apk in `ls $target/*.apk`
do
app_name=`aapt dump badging $apk | grep 'application: label' | awk -F "'" '{print $2}'`
echo $apk $app_name
done
elif [ ${target#*.} == "apk" ]
then
app_name=`aapt dump badging $target | grep 'application: label' | awk -F "'" '{print $2}'`
echo $target $app_name
else
echo $target "nOt aN aPk fiLe"
fi

脚本下载链接:

get_apk_name


前言

随着技术的发展,近年很多的网站、移动应用程序、微信小程序等等,采用前后端分离、使用JSON API数据传递这种方式来设计和开发。如此,前端程序可以保持独立、并且相对来说比较完整,后端程序逻辑复杂、性能强劲。前端可以有丰富的对数据的展现方式(图表、动画等等),后端也只需要完善相应的对模型的控制,同时输出一份前端所需要的数据,采用Ajax+JSON方式传递,从而让前后端的开发相对而言都更为轻松,在结构合理、技术完备的情况下,工程层面也能实现较大程度的规模上的突破。

Rails作为一种流行的MVC框架,本身在API的开发上已经有了很成熟的配套设施了。Rails的模板支持.json.jbuilder形式的JSON数据渲染,配合jbuilder从模型对象数组直接创建JSON数据,在开发上有着无与伦比的便利。在此之前,如果使用php开发程序,从数组创建JSON,需要先整理好数组,再json_encode(Array)进行输出,很是麻烦。当然身为PHP程序员的你可能要说,PHP也有很强大的API构建框架,可以很方便的构建出健壮的API,是的,我承认有这些框架的存在,只是限于本人的水平和喜好,在PHP开发方面并没有走的那么深远,也就不熟悉其中的一些高级操作了。如果有兴趣,也可以发邮件就这方面进行一些探讨。

近期由于一个项目的需要,需要从已有的Rails应用中开辟出一个新的独立接口,供客户端程序调用,因此学习了一下Rails API的构建方法,也顺便留下此文,作为记录。关于Rails API的构建,我参考了这篇文章 https://blog.csdn.net/li_001/article/details/65937664

以下就是如何使用Rails构建JSON API

我当前采用的环境是 Ruby 2.4.1 + Rails 5.2.0

配置控制器

首先假设我们的应用已经创建好了,并且建立一个Article模型,包含两个字段,title和content,运行迁移并创建种子数据。

此时进入项目根目录,新建一个控制器:

1
rails g controller api/v1/base --no-assets

这个控制器的代码就会位于app/controllers/api/v1/base_controller.rb,我们需要在其中完善一些权限有关的配置。

由于Rails默认的安全属性,以及我们如果之前自定义了一些控制器中的过滤方法,我们需要在该控制器中跳过它,例如我们首先禁用rails自带的CSRF 保护和CSRF token的输出,以及去除掉返回包中的set-cookies头,由于我的应用还使用了devise作为用户认证的模块,所以还要在此禁用掉authenticate_user方法。
完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Api::V1::BaseController < ApplicationController
# disable the CSRF token
protect_from_forgery with: :null_session

# disable cookies (no set-cookies header in response)
before_action :destroy_session

# disable the CSRF token
skip_before_action :verify_authenticity_token

# skip devise user authentication
skip_before_action :authenticate_user!

def destroy_session
request.session_options[:skip] = true
end
end

创建好base控制器以后,我们需要在这个控制器的基础上派生出一些新的控制器,这里我们新建一个articles控制器

1
rails g controller api/v1/articles --no-assets

此时除了会生成控制器代码以外,还会在app/views/api/v1目录下创建articles目录,作为模板存放的目录。

articles控制器的代码位于app/controllers/api/v1/users_controller.rb,内容如下

先在其中定义一个show方法:

1
2
3
4
5
class Api::V1::ArticlesController < Api::V1::BaseController
def show
@article = Article.find(params[:id])
end
end

配置路由

接下来我们对路由config/routes.rb进行配置

1
2
3
4
5
namespace :api do
namespace :v1 do
resources :articles
end
end

配置视图

articles控制器的视图代码位于app/views/api/v1/articles/,我们在其中建立show.json.jbuilder文件,内容如下:

1
2
3
json.article do
json.(@article, :id, :title, :content)
end

上面这段代码,是jbuilder建立json的语句代码,至于jbuilder的用法,可以参考这篇文章http://ohcoder.com/blog/2015/04/19/jbuilder/

访问接口

启动Rails程序,访问/api/v1/articles/1.json,即可看到接口输出的JSON数据。

接口通信

除了从接口获取JSON数据以外,我们还需要向接口POST JSON数据,并希望接口实现数据的解析和保存。
首先像往常一样,需要在控制器中创建create方法,用于新建数据:

1
2
3
def create
@host = Host.create(article_params)
end

呵呵,一行代码,是的,就这么简单。
而article_params,则是个私有方法,大概需要这样实现:

1
2
3
def article_params
params.require(:article).permit(:title, :content)
end

在客户端(或网页中)向该接口发送数据,地址是/api/v1/articles

发送的数据类似下面这样:

1
2
3
4
5
6
{
"article":{
"title":"test",
"content":"a test article from client"
}
}

直接发送这条数据可能会出错,因为在请求的时候需要带上json格式描述

1
2
Content-Type: application/json
Accept: application/json

完整的POST请求,参考下:

1
2
3
4
5
6
7
8
9
10
11
POST /api/v1/articles HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Accept: application/json

{
"article":{
"title":"test",
"content":"a test article from client"
}
}


简介

Devise是Rails中一个功能强大、逻辑复杂的用于实现站点用户管理和登录的组件。鉴于Ruby之不重复造轮子的精神思想,Devise是值得去深入研究学习一下的。由于Devise本身的复杂性,这里对搭建的过程做一个记录,也借此分享一下基于Devise实现最基本的站点用户管理和登录的过程。

环境准备

需要在机器上安装Ruby和Rails。
本次编程环境:

  • Debian 9(Kernel 4.9.0-6-amd64)
  • ruby-2.4.1
  • Rails 5.2.0

开始

新建项目

首先新建一个Rails项目TestSite,创建Post scaffold,包含title和body两个字段

1
2
rails new TestSite
rails g scaffold Post title:string body:string

安装Devise

接着在Gemfile中添加devise

1
gem 'devise'

在项目中执行bundle,以及执行devise:install

1
2
bundle
rails generate devise:install

由于我们暂时只在本地测试,因此修改config/environments/development.rb文件,在其中加入mailer配置:

1
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

生成模型

指定Devise将要运行在哪个模型上,这里使用user作为模型,那么运行:

1
rails generate devise User

下一步,就是运行迁移:

1
rails db:migrate

控制器过滤

如果希望在应用运行之前校验用户身份,在ApplicationController中加入以下过滤器:

1
before_action :authenticate_user!

指定路由:

1
root to: 'posts#index'

添加注销功能

在Application的首页,加上用户注销的链接:

1
<%= link_to "Logout", destroy_user_session_path, method: "DELETE"  if current_user %>

配置视图

如果想要自定义登陆界面的视图,则运行以下命令:

1
rails g devise:views users

这里后面带模型名称,就会创建在这个模型范围内的视图(建议这样做,便于以后拓展多重用户身份模型)

此时就可以在相应的视图中自定义登录、注册、重置密码等相应的界面了。

配置控制器

生成控制器就和生成视图的流程是类似的,运行:

1
rails generate devise:controllers users

这样控制器就创建好了。

控制器这一段是值得好好说道说道的。
首先观察下控制器,控制器是可以追加功能的,也可以覆盖原来的方法,不过不推荐这样做,因为从目前经验来看devise自带的控制器已经足够健壮了。但是有时候,我们需要在原有的基础上新增一些功能,例如记录登录日志、增加一点自定义认证方式等等。这里简单介绍下如何在控制器中新增功能。
上一步操作,为我们生成了以下控制器:

1
2
3
4
5
6
app/controllers/users/confirmations_controller.rb
app/controllers/users/passwords_controller.rb
app/controllers/users/registrations_controller.rb
app/controllers/users/sessions_controller.rb
app/controllers/users/unlocks_controller.rb
app/controllers/users/omniauth_callbacks_controller.rb

这里以登录为例,如果我们想要改写登录功能,首先我们要在路由中改写我们要复写的控制器路由:

routes.rb中:

1
2
3
4
5
6
7
8
9
10
11
Rails.application.routes.draw do
#devise_for :users
resources :posts
root to: 'posts#index'

devise_for :users, controllers: {
# 这一行定义了有关sessions的控制选项,交由我们即将复写的sessions控制器处理。
sessions: 'users/sessions'
}

end

接着修改app/controllers/users/sessions_controller.rb,这里我们简单实现一个功能,当用户在前台登陆时,在后台的console中输出用户的登录信息。复写create方法:

1
2
3
4
5
6
7
# POST /resource/sign_in
def create
super
puts "="*64
puts resource.email
puts "="*64
end

尝试在前台登录,控制台输出了我们想要的信息:

待续



上手Markdown,你只需要先熟悉以下几种语法就够了:

  1. 标题、章节
  2. 粗体、斜体
  3. 无序列表、有序列表
  4. 代码、链接、图片
  5. 表格

下面开始一一讲解


1. 标题、章节

标题很简单,用#号就可以。
一级标题是#,二级标题就用##,三级标题就用###,以此类推。
例如以下内容:

# 一级标题
## 二级标题
### 三级标题

在页面中展示的样子就是:

一级标题

二级标题

三级标题

至于章节,一般用—来表示,这样在页面中会显示章节线。

例如:

Area 1

---
Area 2

效果就是:


Area 1


Area 2


2. 粗体、斜体

粗体用**内容**来表示,斜体用*内容*来表示。

例如:

*斜体*

**粗体**

效果:

斜体

粗体


3 . 无序列表、有序列表

列表一般用

+ 无序列表1级
    + 无序列表2级
        + 无序列表3级

1. 有序列表1
2. 有序列表2

来表示

显示的效果如下:

  • 无序列表1级
    • 无序列表2级
      • 无序列表3级
  1. 有序列表1
  2. 有序列表2

4. 代码、链接、图片

  • 代码
    大段的代码,以tab开头就可以。或是用三个`来表示。小段的代码,用两个反引号来表示。例如:
1
2
3
4
5
6

\`\`\`ruby
#test code
puts "hello"
\`\`\`
#去掉\

显示的效果就是:

1
2
#test code
puts "hello"
  • 链接和图片

这个稍微复杂点,链接用:

[链接描述](URL)

图片用

![图片描述](URL)

例如:

[百度](https://www.baidu.com/)

![百度Logo](https://www.baidu.com/favicon.ico)

效果:

百度

百度Logo


5. 表格

表格一般是以下形式:

|表格|表格|表格|表格|表格|
|:-|:-|:-|:-|:-|
|1|2|3|4|5
|6|7|8|9|0

效果:

表格 表格 表格 表格 表格
1 2 3 4 5
6 7 8 9 0


0x00 Create a new post/page

1
2
~# hexo new "Post Title"
~# hexo new page "Download"

0x01 Put codes blocks on your post

Use keyword tag codeblock and endcodeblock

1
2
3
{% codeblock lang:javascript %}
alert('Hello World!');
{% endcodeblock %}

Or just use three backquotes

1
2
3
4
\`\`\`[language] [title] [url] [link text]
code snippet
\`\`\`
#remove the \ before `

Images

1
{% img [class names] /path/to/image [width] [height] [title text [alt text]] %}

Links

1
{% link text url [external] [title] %}

0x03 Organize your posts resources

In _config.yml, set post_asset_folder as true

1
post_asset_folder: true

Then your _posts directory maybe such as this

1
2
3
4
5
6
7
8
9
root@debian:~/chorder.net/source# tree _posts/
_posts/
├── hello-world
│   └── 20180510.jpg
├── hello-world.md
├── hexo-start-up
└── hexo-start-up.md

2 directories, 3 files

You can directly include images from resources directory:

1
{% asset_img xxx.jpg ALT TITLE %}

0x04 Organize your post categories / tags

Your may want to organize your posts as different categories and tags.
First you need to define categories and tags directories in _config.yml, default is like this

1
2
3
4
5
6
# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories

Then you can generate a new page to navigate the posts

1
2
~# hexo new page "categories"
~# hexo new page "tags"

After that, the tags and categories directory will being created in source:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@debian:~/chorder.net/source# tree
.
├── categories
│   └── index.md
├── _posts
│   ├── hello-world
│   │   └── 20180510.jpg
│   ├── hello-world.md
│   ├── hexo-start-up
│   └── hexo-start-up.md
└── tags
└── index.md

5 directories, 5 files

And on the next time when you creating a new post, you could statement the category and tags of your post,
on the head of post markdown file, just like:

1
2
3
4
5
6
---
title: 10 basic operations of Hexo
date: 2018-05-17 17:05:24
categories: default
tags: default
---

The archives of tags and categories will showing in the site automatically.

0x05 Publish pages on a simple local server

In your hexo directory, run

1
~# npm install hexo-server --save

Then start the server:

1
~# hexo server -p PORT

Or if your want publish static pages as an production envirement, you should first generate static files:

1
~# hexo generate

And then start the server as static mode, it will only deploy pages which included in public directory:

1
~# hexo server -s

0x06 Directly include code from resource

1
{% include_code [title] [lang:language] path/to/file %}

0x07 Insert a video from youtube / vimeo

1
{% youtube video_id %}
1
{% vimeo video_id %}

0x08 Quote an article / resource

1
2
3
4
5
6
7
8
# article
{% post_path slug %}
{% post_link slug [title] %}

# resource
{% asset_path slug %}
{% asset_img slug [title] %}
{% asset_link slug [title] %}

0x09 Sitemap & robots.txt

As for optimize your site with a better SEO, ensure you has create sitemap:

1
2
3
4
#for google sitemap, install this package
npm install hexo-generator-sitemap --save
#for baidu(China) sitemap, instal this package
npm install hexo-generator-baidu-sitemap --save

Over that, tell the spider what you have done, write this in your robots.txt, and save it at source directory:

1
2
Sitemap: http://YOUR DOMAIN/sitemap.xml
Sitemap: http://YOUR DOMAIN/baidusitemap.xml

Example robots.txt as mine:

1
2
3
4
5
6
7
User-agent: *
Allow: /
Allow: /archives/
Allow: /categories/
Allow: /tags/
Sitemap: https://chorder.net/sitemap.xml
Sitemap: https://chorder.net/baidusitemap.xml

You can see both above at:

Sitemap Baidu Sitemap robots.txt


Welcome to chorder.net, which is…

Somewhere for coding.

1
2
3
loop do
puts "hello vistor"
end

Somewhere for learning.

Talk is cheap, show me the code.

Linus Benedict Torvalds

Somewhere for sharing.

A new hexo blog, themed by alpha-dust(Jonathan Klughertz)

Somewhere for me.

A New Beginning.

by Chorder, May 10, 2018.



1、Linux 基础
安装Linux操作系统

Linux文件系统

Linux常用命令

Linux启动过程详解

熟悉Linux服务能够独立安装Linux操作系统

能够熟练使用Linux系统的基本命令

认识Linux系统的常用服务安装Linux操作系统

Linux基本命令实践

设置Linux环境变量

定制Linux的服务

Shell 编程基础使用vi编辑文件

使用Emacs编辑文件使用其他编辑器

2

认识后台程序Bash编程熟悉Linux系统下的编辑环境熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序

3、Linux 下的 C 编程基础
linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化 熟悉Linux系统下的开发环境熟悉Gcc编译器 熟悉Makefile规则编写Hello,

chi dazzle,World程序 使用 make命令编译程序 编写带有一个循环的程序调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务下载Bootloader和内核 嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序
4、嵌入式系统移植
Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念 能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM能够熟悉进行串口通信熟悉文件I/O 编写串口通信程序 编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理PPP协议 GPRS 了解嵌入式Linux网络体系结构能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS 使用socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序 调试一个加入信号/槽的实例 通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识 Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念 了解Linux字符设备驱动程序结构能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动分析一个看门狗驱动程序 对比Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析 块设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统 对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化 MTD块设备的读写操作了解Linux系统的文件系统了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持 移植JFFS2文件系统通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码创建一个cramfs 文件系统 、Shell 编程基础
Shell简介

<二>

学习掌握嵌入 Linux 的开发与移植 现在非常流行。
各种学习文章与培训班,充斥书店 街头。

笔者 也上了路,经历漫长的摸索,终于一日开窍,但的确 糟蹋了 很多 金钱与时间。 作为穷人,现写下自己的感受,供好学寒士 参考。

第一要点: 实验重于看书 (多编码,少翻书)
一定首先搭建x86实验环境。
用旧计算机(周末电脑城抛售存货,有新的),搭建一套 实验环境。
host主机: 一台PC机(能够跑redhat linux,看问档 就可以了,配网卡与软驱)。
target目标机: 一块旧PC主板,配一张网卡和一个软驱,电源。
附件: 交网线 ,交串口线

够了,不会超过3千元(已经很满足了)。

软件全部到 电脑城/网站 下载。

先不管什么arm ppc mips, 以后看看文档吧。

第二重点:GNU C编译
在PC 上安装 redhat linux 包括 开发工具。
熟悉linux 的配置命令。

练习 linux 的 C 语言编程,多个程序的编译工程制作。
无聊的话,将C语言教材的例程,编译十几个,熟悉GNU 编译器。www.gnu.org
包括gcc make ld objdump ar 等 GNU toolkit

第三重点:realtime linux 内核编程/加载到目标板运行。
1。 下载 rt-linux ,或uclinux 或什么 非 redhat的linux 源码,一定 是包括,编译工程makefile, 并且for x86 PC的。
2。修改和配置程序,将 rtlinux的 标准 console口 改为串口,不是vga与键盘。
3。在redhat linux 环境下,编译 这个 embedded linux内核。
用mkboot的这样程序(或按代码中工具,) 将编译好的内核执行文件 拷贝定位软盘引导区。

4。用这张软盘引导在目标PC主板 。
在PC主机的 串口终端上配置 PC主板目标机。 效果同 redhat linux terminal console一样。

以后越来月难,坚持。

第四个重点 编译跑通网卡的驱动程序
下载编译 你的网卡驱动源码
跑通 主机与目标机的 网络通讯。
不要太动头想, ping 通就是了。

第五个重点 用tftp 下载执行文件从 PC主机 到 目标机运行。

第六个重点 GNU GDB 远程在线调试(网口调试)

第七个重点 实时内核学习/修改
照文章/书 分析调试/破坏 内核的源码。
主要是 调度/消息/存储/文件/进程/线程/互斥 等

单独跑跑, 了解内核功能就是了。

第八个重点 TCP/IP的学习
下载一个 简单的web server (http server)
学习理解,并编译加载运行。
将 PC主板目标机 看作网站服务器,然后在PC主机的网络浏难器中 访问这个 web server.
有兴趣,把你的照片加载到目标机的 html网页中。
www.zebra.org

第九个重点 网卡驱动程序分析
了解 PCI总线原理,尝试独立写点网卡驱动程序,过滤以太报文的处理。 跟踪处理 特殊的报文。

第十个重点USB和 FLASH文件系统练习。(可以跳过)
可以分析修改 USB与FLASH文件系统源码。
一定要分析源码,上网查 FLASH的型号。

第十一个重点 路由器实验。
分析zebra方面的源码,再买一张网卡。
尝试分析 NAT RIP等协议,将你的PC板目标机,变成一台简单的路由器。

以后的实验 需要根据 行业来,
例如,mini-GUI (图形编程),或 DVR (硬盘录象机),或IP Vedio WebTV 服务器。

可以玩好几年,当然最好找工作前,有针对地做实验。

一句话,动手修改编码,不要只看看。

<三>

嵌入式Linux操作系统学习规划
ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:
(1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
(2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定)
(3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。
从事嵌入式软件开发的好处是:
(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。
(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
(4)兴趣所在,这是最主要的。
从事嵌入式软件开发的缺点是:
(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
(2)这方面的企业数量要远少于企业计算类企业。
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
(4)平台依托强,换平台比较辛苦。
兴趣的由来:
1、成功观念不同,不虚度此生,就是我的成功。
2、喜欢思考,挑战逻辑思维。
3、喜欢C
C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下:
相信程序员。
不要阻止程序员做那些需要去做的。
保持语言短小精干。
一种方法做一个操作。
使得它运行的够快,尽管它并不能保证将是可移植的。
4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。
5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。
方法步骤:
1、基础知识:
目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。
科目:数字电路、计算机组成原理、嵌入式微处理器结构。
汇编语言、C/C++、编译原理、离散数学。
数据结构和算法、操作系统、软件工程、网络、数据库。
方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。
主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。

2、学习linux:
目的:深入掌握linux系统。
   方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。
3、学习嵌入式linux:
目的:掌握嵌入式处理器其及系统。
方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
   (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
   (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。
   主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。

4、深入学习:
   A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
   B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
   C、网络与信息安全技术:如加密技术,数字证书CA等。
   D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。
   说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。
   注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。
   不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的!
   技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。

   嵌入式书籍推荐
   Linux基础
   1、《Linux与Unix Shell 编程指南》
   C语言基础
   1、《C Primer Plus,5th Edition》【美】Stephen Prata着
   2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着
   3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
   4、《嵌入式Linux应用程序开发详解》
   Linux内核
   1、《深入理解Linux内核》(第三版)
   2、《Linux内核源代码情景分析》毛德操 胡希明著
   研发方向
   1、《UNIX Network Programming》(UNP)
   2、《TCP/IP详解》
   3、《Linux内核编程》
   4、《Linux设备驱动开发》(LDD) 
   5、《Linux高级程序设计》 杨宗德著
   硬件基础
   1、《ARM体系结构与编程》杜春雷着
   2、S3C2410 Datasheet
   英语基础
   1、《计算机与通信专业英语》
   系统教程
   1、《嵌入式系统――体系结构、编程与设计》
   2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着
   3、《Building Embedded Linux Systems》   
   4、《嵌入式ARM系统原理与实例开发》 杨宗德著
   理论基础
   1、《算法导论》
   2、《数据结构(C语言版)》
   3、《计算机组织与体系结构?性能分析》
   4、《深入理解计算机系统》【美】Randal E. Bryant David O’’Hallaron着
   5、《操作系统:精髓与设计原理》
   6、《编译原理》
   7、《数据通信与计算机网络》
   8、《数据压缩原理与应用》

   C语言书籍推荐
   1. The C programming language 《C程序设计语言》
   2. Pointers on C 《C和指针》
   3. C traps and pitfalls 《C陷阱与缺陷》
   4. Expert C Lanuage 《专家C编程》
   5. Writing Clean Code —–Microsoft Techiniques for Developing Bug-free C Programs
   《编程精粹–Microsoft 编写优质无错C程序秘诀》
   6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》
   7.《C语言嵌入式系统编程修炼》
   8.《高质量C++/C编程指南》林锐
   尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。

这里很多书其实是推荐而已,不必太在意,关键还是基础,才是重中之重!!!

<四>

嵌入式Linux学习的基本的原则是通学+专长。

通学,即了解该方向的相关领域,但是“通”不等于“泛”,对待学习应该举一反三,把握事物的本质。如果能用通用的思想去解决问题,那么才算学有小成。比如,五一学习Mark Balch的《COMPLETE DIGITAL DESIGN》后,对嵌入式系统在上电之后,软硬件如何配合工作有了更深入的理解。虽然这本书不是介绍嵌入式系统,但是很多技术是通用的。有开放的思维,把握自己研究的中心,把其他领域的方法思想吸收过来为我所用,这样可以对研究中心有更为深入的认识。 

专长,即研究中心。通学的目的在于打好基础,融会贯通。但是仅仅如此是不够的。因为通学不可能把每个方向都研究精深,人的精力毕竟是有限的嘛,所以要有自己感兴趣的方向,以此作为研究中心,深入深入再深入,成为该方向的专家。以通促专,提炼自己的思想,以开放的思维谋求最大的提升! 

我选择的研究领域是嵌入式系统(ARM+Linux),在该领域有四种类型的工作: 
1、系统设计 
2、硬件设计 
3、驱动开发及内核移植 
4、应用开发 

基于我目前的认识,研究中心是驱动开发及内核移植,争取以后做系统设计,成为嵌入式系统设计工程师。 

嵌入式Linux学习分为三个阶段: 
第一阶段:建立嵌入式Linux知识体系框架。 
第二阶段:深入学习嵌入式Linux的基本技术。 
第三阶段:精深专长。 

这三个阶段可以交叉。第一阶段通过2006年暑假两个月的强化学习,已经完成。现在正在进行第二阶段的学习。这个阶段关注嵌入式Linux软件开发的基本技术,包括:JTAG的工作原理及其实现(以JFlash为主)、bootloader的原理及实现(以U-boot为主)、kernel移植与开发(尝试2.4.18、2.6.X)、FS制作(尝试ramdisk、cromfs等)、应用程序的移植(基本掌握开发)、调试和诊断技术。在这个阶段,同时打好硬件基础(掌握S3C2410)和软件基础(bash、C和基本的开发工具)。第三个阶段在读研期间,以研究OS原理和Linux内核源代码为主,与第二阶段交叉进行。 

其实,每天进步一点点,把这一点点所学加到已经建立的知识体系框架中,日积月累,思想认识必定会有所提升。虽然都认可宁可断其一指,不可伤其十指,但是应该承认人的认识是有局限性的。比如学习A时,因缺乏实践等各方面原因,可能认识不深入,也许在学习B时突然认识到了。所以一定要举一反三,而且要反复学习。记住基础的技术,努力学习先进技术,不停止前进的脚步。

<五>

【序】学习Linux开发近一年,由于我是实验室第一个从事这方面开发的,学习过程中遇到了很多问题,可是总是求师无门,只能一个人自己摸索,同时也充分利用了网络,参考了广大CSDN博友及相关论坛的帖子,在此表示感谢!

嵌入式Linux的学习涵盖的范围比较广,下从bootloader,到内核移植、文件系统,中间的驱动开发,到上层的应用程序调试、开发环境等,变化莫测,经常是别人的能用自己的就有问题。

由于缺乏他人适当指点,自己在学习过程中也走了很多弯路,整个开发环境的搭建整了N久,更搞笑的是经常听说模块加载insmod,可连这个命令在主机还是ARM上用都没搞明白,那叫一个汗啊!大家勿笑,嵌入式Linux的初学者确实对交叉环境比较不懂,我是其一啊。

现在适逢好友小布丁要学习嵌入式Linux,就将近一年来的学习体会总结下,整理了一个总体的学习计划,希望给那些曾经像我一样彷徨的人一些帮助。后续将完善此文档,上传到个人空间上,先贴出目录。本人水平有限,不当之处,还请大家指正!

小布丁同学曾在我处于困境时一如既往的理解我支持我,给我信心给我鼓励,谢谢你,美丽开怀的小布丁,希望你能happy and fascinating forever!

谨以此文献给我们永远可爱迷人的小布丁!

Sailor_forever

September 3, 2007


第一篇 Linux主机开发环境(15天)

1.1 Vmvare下Linux的安装(优先)

1.2 Windows下从硬盘安装Linux(可选)

1.3 Linux的基本命令及使用

1.4 Linux的文件系统及与windows的文件共享

1.5 GCC开发工具

1.6 GDB调试

1.7 Makefile编写

1.8 主机端的模块编程

1.9 简单应用程序

第二篇 ARM+Linux开发环境(7天)

2.1 交叉开发环境介绍

2.2 交叉编译器cross-tool

2.3 配置主机开发环境

2.3.1 配置超级终端minicom或hyperterminal或DNW

2.3.2 配置TFTP网络服务

2.3.3 配置NFS主机端网络服务

2.4 建立交叉开发环境

2.4.1配置NFS ARM端网络服务

2.4.2 编译ARM-gdb

2.5 交叉调试应用程序

2.6 ARM上的简单模块编程

第三篇 Linux系统bootlaoder移植(7天)

3.1 Bootloader介绍

3.2 u-boot命令及环境变量

3.3 u-boot的编译配置

3.4 u-boot源码分析

3.5 u-boot移植过程

第四篇 Linux的内核移植(15天)

4.1 配置编译Linux内核

4.1.1 Linux内核源代码结构

4.1.2 Linux内核编译选项解析

4.1.3 Linux内核编译链接

4.2 Linux启动过程源代码分析

4.3 Linux内核移植平台相关代码分析

第五篇 Linux的驱动编程(15天)

5.1 Linux的设备管理

5.2 Linux的驱动程序结构

5.3 简单的字符设备驱动程序

5.4 Linux内核模块的加载卸载

5.5 Linux的打印调试方法

5.6 字符设备的高级属性-中断

5.6 常见的串口网口驱动分析

第六篇 文件系统制作(5天)

6.1 Linux文件系统制作

6.2 文件系统和存储设备的选择

6.3 部署Ramdisk文件系统的过程

第七篇 Linux的高级应用编程(5天)

总用时 15+7+7+15+15+5+5 大概两个半月



建立热点:

@echo off
netsh wlan set hostednetwork mode=allow
netsh wlan set hostednetwork ssid=热点名 key=密码
netsh wlan start hostednetwork

关闭热点

netsh wlan set hostednetwork mode=disallow


在很多时候拿到了内网的一台主机,我们需要用它做跳板来对内网进一步扩大战果。
也许方法很多,meterpreter,nc等等。但是最方便也最有可能穿透防火墙的方法,就是用ssh。
分为四种类型:
本地转发,远程转发,跳板转发,动态转发。
本地转发
假设攻击机A主机为本机,ip是y.y.y.y,用户是hacker,被攻击且用作跳板的主机是B,ip是
x.x.x.x,对应的内网ip是10.0.0.2,用户是root,ssh的端口是22。
假设B机器上的80端口开放了一个服务,但是只有B主机本机上才能访问,这时候可以使用本地转
发,在A机器上执行命令:

1
ssh -L 8080:localhost:80 root@x.x.x.x

这样,在本机A中访问localhost:80,数据被转发到B主机的80端口,即实现了访问B机器的本地
服务。
很常见的一个实例就是攻击者拿下了某目标内部的网关服务器,但是出于安全考虑网管的web控
制台界面只有在网关服务器自身上才能访问,这时候就可以通过这种方式转发流量,方便的操作
网关服务器的web控制台了。
上面的情况,是基于A主机可以ssh到B的情况,但假如从A到B的ssh连接被拒绝,而恰好B主机的
防火墙没有禁止其使用ssh外连,这时候就可以通过远程转发来实现上述同样的效果。
在B机器上执行命令:

1
ssh -R 8080:localhost80 hacker@y.y.y.y

这时候在A机器上访问自身的8080端口,数据也是被转发到了B主机的80端口上的。
可见,这种方式受到的局限比较多,因为如果能够在B主机上使用ssh外连了,还需要通过ssh来
转发流量的情况也是很少见的,但也不是没有。
以上两种转发,都是只对跳板服务器自身的服务,很多时候,渗透需要的是内网中一台稳定的跳板,
这时候就可以使用
跳板转发来实现多主机之间转发。
假设现在需要通过B主机作为跳板,来访问与B处于同一内网中的机器C的80端口,假设C的ip是
10.0.0.3,这时候可以在攻击机上执行如下命令:

1
ssh -g -L 8080:10.0.0.3:80 root@x.x.x.x

此时在A主机上8080端口的流量就被转发到C主机的80端口上了。
最有用的就是最后要介绍的,
动态转发,这种转发可以将流量随心所欲的转发,此时实现的效果就相当于代理服务器,在A机器
上用下面的命令实现:

1
ssh -D 8080 root@x.x.x.x

此时在A机器上配置SOCKS代理端口localhost:8080,就可以以B为代理服务器随心所欲的畅游。
最后补充使用ssh进行X转发的命令,其实很简单:

1
ssh -X root@x.x.x.x

这样连接上以后,目标机器的X服务器所做的操作都会通过x协议发送到本地,很方便的实现了可
视化操作。
例如在终端输入firefox,就可以在本地弹出一个实际上运行在远程的firefox进程。



Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×