Technology + People + Process

LAMP Stack on IMX-6

LAMP Stack on IMX-6 Sabrelite

Introduction :

LAMP STACK stands for- 

L- Linux 

A- Apache server 

M- Mysql Server and Client 

P- All the programming language that starts from p.(Php,pearl,python etc). 

Definition of LAMP stack-The reason they call it a stack is because each level derives off it's base layer. Our Operating system, Linux, is the base layer. Then Apache, web daemon sits on top of OS. Then Our database stores all the information served by our web daemon, and PHP (or any P* scripting language) is used to drive and display all the data, and allow for user interaction.

So through Lamp stack we can create a truly database-driven and dynamic Web site that is easy to update and provides rich functionality to support users. 

Features Of Lamp Stack

About Linux:

A freely distributed open source operating system that runs on a number of hardware platforms.

About Apache:

Only Web server to run on all the major platform (*NIX ,Windows,mac,freebsd and other we name it)

About Mysql:

Open Source database server that relies on SQL for processing the data in the database..

Work on more than 20 platform including Linux ,Windows ,OS/X ,HP-UX,AIX and some more

About Php:

Open source server side scripting language designed specifically for the web. 

Output not only html but can also output xml,images (JPG and PNG),PDF files,flash movies. 

Some thing what we love today on web are: 

  • Google , Orkut , Facebook ,YouTube ,Gmail etc. all these famous and our favorite web apps are running some how on Lamp stack.
  • Wikipedia uses PHP, MySQL, and Apache HTTPD to provide an online encyclopedia with thousands of entries in multiple languages. All of this is served by Linux servers running the WikiMedia application. 

How it is Working:

  • The Apache server running on Linux is an easy way of building a simple Web server, but the information provided by the Apache server will be "static" — that is, basic pages of information that the we must build and type ourself. 
  • Adding interactive or dynamic components requires the use of a programming language, like Perl or PHP. These languages will allow us to work with forms. For example, they let our users send us an e-mail or randomly select a page to visit.
  • For truly interactive and dynamic Web sites, however, what we need is a way of building pages composed of information in a database.

For this MySql server and MySql CLient needs to be installed in our system.With the help of Mysql Server we can dump our database in forms of tables and MySql Client will provide interface (like command promt ) to access those tables. 

For Example-If we want to create an online store . We could do it using static pages. But we could even use dynamic elements to let people add products to their basket and send their order to us.

Our Achievements:

  • Cross compiled all the dependent libraries of Lamp stack for arm platform (IMX-6 sabrelite).
  • Lamp stack is up within 12 sec (Including Boot time).It means all the server ,Web demon   (Apache configured with Php) and Mysql Server is running successfully.

Techincal detailes of Bringing up Lamp Stack on Imx:

1) Cross compiling LAMP stack through ltib:

1.1 Create ltib environment for your PC.Follow the document named Ltib Document.txt provided in same directory. Linux part will be done while creating environment for ltib for your PC. 

1.2    Steps to cross compile apache. 

1.2.1 Go to main ltib directory and use: 

1.2.2 $./ltib -m config 

1.2.3 Select Package list under package selection .Then select httpd (apache) web server.    Exit from there and save the configuration. 

1.2.4 Run ltib command. 

          $./ltib 

1.3. Steps to cross compile Php,perl,python. 

1.3.1 Copy php-5.3.27.tar.bz2 and php-no-iconv-searchmysq.patch to /opt/freescale/pkgs/. 

         Modify the php.spec file as per new version of php. php.spec is provided in main       directory, directly replace that file.

1.3.2 Run ltib command. 

         $./ltib 

1.3.3 Steps to cross compile mysql. 

1.3.4  Copy php-5.3.27.tar.bz2 to /opt/freescale/pkgs/. Modify the mysql.spec file as per new version of mysql. mysql.spec is provided in main       directory, directly replace that file.

1.3.5 Run ltib command. 

         $./ltib 

Note:Also cross compile dhcpcd to enable networking. 

If you reached here means you have cross compiled LAMP stack successfully.
 

2) Steps to run LAMP stack on Target board

To start apache server on Target. 

$./usr/bin/apachectl start

Copy your php program into /usr/htdocs folder. 

Example : Hellowolrd.php 

Check localhost for your target board.To make local host up. 

$ifconfig lo up 

$ifconfig 

Output: 

lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0 

          UP LOOPBACK RUNNING  MTU:16436  Metric:1 

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B) 

$wget http://localhost/ 

Output: 

Connecting to localhost (127.0.0.1:80) 

index.html           100% |*******************************|  1456   0:00:00 ETA 

     or 

Open any browser and type localhost/ 

Output:It should show that apache is working. 

To compile php program.

$wget http://localhost/Helloworld.php 

Output: 

Connecting to localhost (127.0.0.1:80) 

my.php               100% |*******************************|    16   0:00:00 ETA 

To check the output of php program.

$cat Helloworld.php 

Output: 

 Hello, World! 

or 

Open any browser on board and type localhost/Helloworld.php 

Output: 

 Hello, World! 

Note:If you will get the above output for given Helloworld php program then php and apache is configured properly. 

To run mysql server follow the document named mysql_runtime_error.txt provided in same directory. 

Note:All the initial commands to make LAMP satck up on target board are added in initial script (/etc/rc.d/rcS) itself. Boot time is 13 seconds.
 

3) Copying Rootfs 

The file system format ext3 or ext4 is a good option for removable media due to the

built-in journaling. Run the following command to format the partition:

$ sudo mkfs.ext3 /dev/sdb1

Or

$ sudo mkfs.ext4 /dev/sdb1

→  Copy the target file system to the partition:

$ mkdir /home/user/mountpoint 

$ sudo mount /dev/sdb1 /home/user/mountpoint

→  Extract rootfs package to certain directory: extract rootfs.ext2.gz to /home/user/rootfs for example:

$ gunzip rootfs.ext2.gz

$ mount -o loop -t ext2 rootfs.ext2 /home/user/rootfs

→ Assume that the root file system files are located in /home/user/rootfs as in the previous step:

$ cd /home/user/rootfs

$ sudo cp -rpa [A-z]* /home/user/mountpoint

$ sudo umount /home/user/mountpoint
 

4) Fixing Errors

Apache compile time error:

1.Apache was itself not cross compiled properly.Encountered following errors: 

error("Sorry, no shared object support for Apache");

error("available under your platform. Make sure");

error("the Apache module mod_so is compiled into");

Fix:--- httpd-2.0.54.orig/support/apxs.in 

+++ httpd-2.0.54/support/apxs.in

-unless (grep /mod_so/, `. $envvars && $httpd -l`) {

my $httpd_l ="Compiled in modules: \n core.c \n mod_access.c \n mod_auth.c \n mod_include.c \n mod_log_config.c \n mod_env.c \n mod_setenvif.c \n prefork.c \n http_core.c \n mod_mime.c \n mod_status.c \n mod_autoindex.c \n mod_asis.c \n mod_cgi.c \n mod_negotiation.c \n mod_dir.c \n mod_imap.c \n mod_actions.c \n mod_userdir.c \n mod_alias.c \n mod_so.c";

unless (grep /mod_so/, "$httpd_l") {

#unless (grep /mod_so/, `. $envvars && $httpd -l`) {

2.Some errors related path of headers files.

Fix:Giving full path resolved this issue.

File name:Script in /usr/local/apache2/bin:apxs,/usr/local/apache2/build/instdso.sh

Exp:my $targetdir="/home/sateesh-(user name)/buildroot/buildroot-2013.08.1/output/target";

my $installbuilddir = "$targetdir/usr/local/apache2/build";(same for other problem)

Some others files also required full path:httpd.h,apr_strings.h etc

Mysql compile Time Error:

1./bin/rm: cannot remove `libtoolT': No such file or directory 

edit configure and change  $RM "$cfgfile" to  $RM -f "$cfgfile" to fix "cannot remove `libtoolT': No such file or directory'" error. 

2.lib/ld-linux.so.3: No such file or directory 

#sudo apt-get install libc6-armel-cross 

#sudo ln -sf /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib/ld-linux.so.3 

3./lib/ld-uClibc.so.0: No such file or directory 

Locate ld-uClibc.so.0 

#sudo ln -sf <path>lib/ld-uClibc.so.0 /lib/ld-uClibc.so.0 

4.I get the following on SCO 5.0.4: 

sql_lex.cc: In function `void lex_init()': 

sql_lex.cc:93: `symbols' undeclared (first use this function) 

sql_lex.cc:93: (Each undeclared identifier is reported only once 

sql_lex.cc:93: for each function it appears in.) 

sql_lex.cc:95: `sql_functions' undeclared (first use this function) 

sql_lex.cc: In function `int find_keyword(LEX *, unsigned int, bool)': 

sql_lex.cc:180: implicit declaration of function `int get_hash_symbol(...)' 

sql_lex.cc:180: initialization to `SYMBOL *' from `int' lacks a cast 

I have compiled other version withour problems. 

copy gen_lex_hash from host-mys 

configure && make 

[this error occurs] 

$ cd sql 

$ ./gen_lex_hash > lex_hash.h 

$ cd .. 

$ make 

 Some more Errors and Fixes.
 

5. Could not run test programme

Fix:  /output/build/host_mysql_client-5.1.67/configure changed the condition for tests so it will not run test program or it ll go forward even if it couldnt run the test program.
 

6. I have located this particular my_config.h from different build root source and compiled.
 

7.error: /bin/bash: ./gen_lex_hash: cannot execute binary file.

Fix: this is because buildroot is trying to executable compiled for arm Platform.so we copied gen_lex_hash from /output/build/host_mysql_client-5.1.1.67/sql/gen_lex_hash to /output/build/mysql_client-5.1.1.67/sql/gen_lex_hash as this file is compiled for host which is X86
 

8.error: operator '<' has no left operand 

Fix: initialized macro STACKDIRECTION to -1 which means stack grows form High address to low address value.In file /output/build/mysql_client.5.1.1.67/include/my_config.h and sql_parse.cc .Add # Define STACK_DIRECTION -1 in both files my_config.h and sql_parse.cc .

This link has been very helpful to solve last two errors.

http://translate.google.co.in/translate?hl=en&sl=zh-CN&u=http://www.cnblogs.com/yoleung/articles/1454763.html&prev=/search%3Fq%3Dsql%2Bcannot%2Bexecute%2Bgen_lex_hash%2Bbinary%2Bfile%26biw%3D1301%26bih%3D678

Mysql Run Time Error:

 1.

700101 01:20:44  mysqld started 

700101  1:20:44 [ERROR] Can't start server : Bind on unix socket: Permission denied 

700101  1:20:44 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ? 

700101  1:20:44 [ERROR] Aborting 

Fix: $chown -R mysql:mysql /tmp/ 

Check /tmp/mysql.sock is created or not:Created then successfull 

2. Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist 

Fix:Tables are not created we need to run the following script: 

$mysql_install_db

Error while running above command: 

While running mysql_install_db,it is running through memory issue:No space left on device.Unable to create tables or does not exist 

Issue:

$df -h 

Output: 

/tmp folder is allocated by 512K,So when running mysql_install_db will try to install created database table into /tmp folder ,it will run through memory issue because /tmp is already full. 

Fix: 

I have edited /etc/rc.d/rc.conf 

export TMPFS_SIZE="512" to export TMPFS_SIZE="12M" .Change it as per your need.

3. 

071202 14:52:11 mysqld started 

071202 14:52:11 InnoDB: Operating system error number 13 in a file operation. 

InnoDB: The error means mysqld does not have the access rights to 

InnoDB: the directory. 

InnoDB: File name ./ibdata1 

InnoDB: File operation call: ‘create’. 

InnoDB: Cannot continue operation. 

071202 14:52:11 mysqld ended 

Fix: 

First update your my.cnf file for innoDB support 

$cp /usr/local/share/mysql/my-small.cnf /etc/rc.d/init.d/my.cnf 

Then update your paths in my.cnf as following. 

$ vi /etc/my.cnf 

# Uncomment the following if you are NOT using BDB tables 

#skip-bdb 

# Uncomment the following if you are using InnoDB tables 

innodb_data_home_dir = /usr/var/ 

innodb_data_file_path = ibdata1:10M:autoextend 

innodb_log_group_home_dir = /usr/var/ 

innodb_log_arch_dir = /usr/var/ 

# You can set .._buffer_pool_size up to 50 - 80 % 

# of RAM but beware of setting memory usage too high 

innodb_buffer_pool_size = 16M 

innodb_additional_mem_pool_size = 2M 

Set .._log_file_size to 25 % of buffer pool size 

innodb_log_file_size = 5M 

innodb_log_buffer_size = 8M 

innodb_flush_log_at_trx_commit = 1 

innodb_lock_wait_timeout = 50 

And now fix your permissions on the DATA directory. 

$chown -R mysql:mysql /usr/var 

To start mysql server: 

$mysqld_safe & 

$cp /usr/share/mysql/mysql.server /etc/rc.d/init.d/mysql 

$/etc/rc.d/init.d/mysql start 

To stop mysql server: 

$/etc/rc.d/init.d/mysql stop 

Note:mysql.server is just a wrapper that invokes mysqld_safe, which in turn invokes mysqld.  The advantage of involving mysqld_safe in  this process (as opposed to starting the server directly) is that  if the server crashes, mysqld_safe restarts it. 

To check mqsql is running or not : 

mysqladmin -u root -p ping 

Enter password: (enter) 

output:mysqld is alive 

5) Some basic tips to create data base and test any application.

6) To assign a new ip  to imx board.

    $ ifconfig eth0 <ip address>

Use:We can use any browser to test the application. Open any browser and type:

<ip address>/<projet name>

To run mysql server without any password:

$sudo mysqld_safe --skip-grant-tables &

OR

To change the password of mysql. Follow the below link.

http://www.rackspace.com/knowledge_center/article/mysql-resetting-a-lost-mysql-root-password

To check and create data base.

Login to mysql as root user

$mysql -u root -p

password <enter for nothing or you password>

To show the existing data bases.

mysql>show databases;

To ceate any data base.

mysql>create databases <database name>;

To use any data base.

mysql>use database;

To show the table in selected data base.

mysql>show tables;

To check the content of any tables.

mysql>select * from <table name>;

To dump any data base.

First Login to mysql,create database and the log out.

$mysql -u root -p -h localhost <database name > < /usr/htdocs/<database name>.sql


Request for Quote

Drop us a line and we'll get in touch with you as quick as we can