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的目錄檔案修改這裡附上補丁檔案,直接打上補丁就可以直接編譯安裝了。