1. 程式人生 > >Android環境下移植busybox-1.21.1

Android環境下移植busybox-1.21.1

前言:本移植主要是為了實現安卓環境下DHCP伺服器和telnetd伺服器功能。

Dhcp伺服器主要修改快取檔案路徑“/tmp/leases,telnetd主要新增登陸驗證,這個牽扯到login命令。

1.首先下載busybox-1.21.1.tar.bz2

2.解壓,進入busybox-1.21.1執行:

#cp configs/android2_defconfig .config

3.因新增dhcp伺服器需要,修改busybox-1.21.1\networking\udhcp\dhcpc.c

新增:

#ifndef PACKET_AUXDATA
# define PACKET_AUXDATA 8
struct tpacket_auxdata {
uint32_t tp_status;
uint32_t tp_len;
uint32_t tp_snaplen;
uint16_t tp_mac;
uint16_t tp_net;
uint16_t tp_vlan_tci;
uint16_t tp_padding;
};
#endif

修改busybox-1.21.1\networking\udhcp\files.c

#include <features.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
 
struct ether_addr *ether_aton_r(const char *asc, struct ether_addr *addr)
{
size_t cnt;
for (cnt = 0; cnt < 6; ++cnt) {
unsigned int number;
char ch;
ch = _tolower(*asc++);
if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
return NULL;
number = isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
ch = _tolower(*asc);
if ((cnt < 5 && ch != ':')
|| (cnt == 5 && ch != ' ' && !isspace(ch)))
{
++asc;
if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
return NULL;
number <<= 4;
number += isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
ch = *asc;
if (cnt < 5 && ch != ':')
return NULL;
}
/* Store result.  */
addr->ether_addr_octet[cnt] = (unsigned char) number;
/* Skip ':'.  */
++asc;
}
return addr;
}

4.因新增passwd命令需要,修改

android-ndk-r10b\platforms\android-9\arch-arm\usr\include\pwd.h

新增:

struct passwd
{
    char* pw_name;
    char* pw_passwd;
    uid_t pw_uid;
    gid_t pw_gid;
    char* pw_gecos; /* Real Name or Comment field for mac busybox*/  
    char* pw_dir;
    char* pw_shell;
};

5.修改telnetd.c

<span style="font-size:18px;">#define INIT_G() do { \
    G.loginpath = "/system/bin/login"; \
    G.issuefile = "/etc/issue.net"; \
} while (0)</span>

6.新增login選項

遮蔽tcdrain(STDOUT_FILENO);

7.編譯busybox 執行

#make menuconfig

說明:

新增編譯器和路徑、使用者密碼命令、dhcp等,詳見配置檔案(.config)。

#make

8.安裝

#make install

9.telnetd伺服器實現

將生成的busybox拷貝到機器中(我們的機器是/system/bin/)。

在使用telnetd伺服器登入新增賬戶密碼中,先講解一下生成賬戶密碼方法,首先在/system/etc下生成一個passwd檔案,然後使用生成的busybox工具執行命令:

#busybox touch /system/etc/passwd

#busybox adduser root

這裡或許會出現錯誤:“passwd : unknown uid 0”,這裡需要修改一下passwd 檔案內容,如:

root:x:1000:1000:Linux User,,,:/home/root:/system/bin/sh

將使用者ID和組ID都改為0,如:

root:x:0:0:Linux User,,,:/home/root:/system/bin/sh

執行新增命令:

#busybox passwd root  -- 輸入命令

最後還是要改一下passwd 檔案,如:

root:9VMsMcbCRjKI2:0:0:Linux User,,,:/:/system/bin/sh”

在機器中執行:

#busybox telnetd&

這樣一個telnetd伺服器流程就完成了!

10.DHCP伺服器

首先需要在/tmp目錄下建立一個leases檔案,將配置檔案udhcpd.conf位於“busybox-1.21.1\examples\udhcp”

根據自己的需求修改一下檔案並拷貝到機器的“/system/etc”目錄下。

修改內容如路由IP地址、DNS、路由閘道器等:

start192.168.0.20
end192.168.0.254

啟動dhcp伺服器:

#busybox udhcpd -fS /etc/udhcpd.conf &

這樣一個dhcp伺服器流程就完成了。

針對以上busybox-1.21.1的目錄檔案修改這裡附上補丁檔案,直接打上補丁就可以直接編譯安裝了。