recuperação tabela mysql a partir do arquivo *.frm
Ola pessoal, sempre coloco post com nomes intuitivo ou sugestivo hoje como estou com pressa fui bem direto :D. Tive um problema com meu cacti que a tabela poller_output estava dando erro no cacti mesmo um recover me informava a seguinte mensagem.
mysql> repair table poller_output USE_FRM;
+———————+——–+———-+——————+
| Table | Op | Msg_type | Msg_text |
+———————+——–+———-+——————+
| cacti.poller_output | repair | Warning | Can’t open table |
| cacti.poller_output | repair | status | Operation failed |
+———————+——–+———-+——————+
2 rows in set (0.00 sec)mysql>
Mesmo tentando recuperar não foi possivel olhando os arquivos fisicamente no disco notei que somente existia um arquivo somente chamado poller_output.frm. Para ser bem resumido existem 2 engine de armazenamento: MyISAM, InnoDB. O InnoDB joga tudo em um arquivo somente. Já o MyISAM utiliza três arquivos:
| Extensão do arquivo | Finalidade |
| .frm | Definicao de tabela |
| .MYD | Tabela de dados |
| .MYI | Tabela de índices |
No meu caso o cacti utiliza tabelas em MyISAM, então dos três arquivos somente tinha 1 o .frm :D. Para recover da definicao de tabela você precisa utilizar o utilitário mysqlfrm que vem no pacote mysql-utilities disponivel em http://dev.mysql.com/downloads/utilities/. Aí você me diz? mas para saber a definição da tabela e so ir na console do mysql e digitar o comando desc poller_output! que burro ricardo 😀 Aí te digo foi a primeira coisa que tentei 😀
mysql> desc poller_output;
ERROR 1017 (HY000): Can’t find file: ‘poller_output’ (errno: 2)
mysql>
Entao baixe o mysql-utilities instale e rode o comando.
root@apolo:/var/lib/mysql/cacti# mysqlfrm –diagnostic poller_output.frm
# WARNING: Cannot generate character set or collation names without the –server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for poller_output.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:CREATE TABLE `poller_output` (
`local_data_id` mediumint(8) unsigned NOT NULL,
`rrd_name` varchar(19) NOT NULL,
`time` datetime NOT NULL,
`output` text,
PRIMARY KEY `PRIMARY` (`local_data_id`,`rrd_name`,`time`)
) ENGINE=MyISAM;#…done.
root@apolo:/var/lib/mysql/cacti#
Pronto de posse da definição da tabela recrie a tabela na console do mysql. Mas e os dados? bem não sei que quedas dágua deu que sumiu meu .MYD, como são dados de monitoramento e “aceitavel”, caso contrario eu teria um backup 😀
Vlw
Telemetria para nerd
Ola pessoal, venho aqui novamente postar algo que eu considero relativamente importante, iremos aprender como criar ou plotar graficos. O título talvez nao tenha nada haver apesar que eu discordo. O software que iremos estudar é o rrdtool. RRDtool é um banco de dados Round Robin. A tecnologia Round robin funciona com uma quantidade pre-determinada de dados, e um ponteiro para a posicao atual. Imagine um anel ou circulo com posições, onde cada posicao no circulo armazena dados. Quando os dados são lidos posição por posicao os dados podem ser armazandos ou lidos. Depois de um tempo, todas as posiçoes disponíveis serão reutilizados e o processo continua. RRDtool utiliza arquivos rrd. RRDtool foi desenvolvido por Tobias Oetiker. Para o nosso exemplo vamos imaginar o circuito de Monaco, e vamos coletar os km percorridos.
Como a formula 1 pra mim ultimamente anda sem emoção e sem graça, vamos ser praticos, digamos que a mclaren percorre o circuito e coletamos os seguintes dados a cada passagem pela linha de chegada:
| Horário | Timestamp | Distancia(m) |
| 11:47 | 1406303220 | 4000 |
| 11:51 | 1406303460 | 7400 |
| 11:56 | 1406303760 | 11200 |
| 12:02 | 1406304120 | 15230 |
| 12:07 | 1406304420 | 18000 |
| 12:12 | 1406304720 | 21400 |
| 12:17 | 1406305020 | 25400 |
| 12:22 | 1406305320 | 28600 |
| 12:27 | 1406305620 | 32100 |
| 12:32 | 1406305920 | 35700 |
| 12:37 | 1406306220 | 39000 |
| 12:42 | 1406306520 | 43150 |
| 12:47 | 1406306820 | 47001 |
| 12:52 | 1406307120 | 50600 |
| 12:57 | 1406307420 | 54000 |
Após a coleta vamos criar nosso arquivo rrd. Criamos com o comando rrdtool,iremos criar um arquivo rrd chamdo monaco.rrd, que inicia no dia 2014/07/25 as 11:47:00 no qual e utilizado timestmap ou epoch unix se voce nao sabe do que eu estou falando leia meu post sobre epoch. Para nosso arquivo rrd iremos criar um datasource ou DS de nome dados e tipo COUNTER o qual é um contador, o qual é lido a cada 5 minutos que é o padrão, na mesma base de dados criamos 1 conjunto de dados RRA. A “amostra” RRA ira conter a média(AVERAGE) e contém 24 amostras( 24 vezes amostras de 5 minutos totalizando 2 horas). Segue comando
rrdtool create monaco.rrd –start 1406303220 DS:dados:COUNTER:600:U:U RRA:AVERAGE:0.5:1:24
Fico muito confuso né, vamos tentar melhorar isso digamos que mude e deixar a parte RRA assim
RRA:AVERAGE:0.5:6:10
O restante do comando definiremos abaixo
- –start: define o inicio do arquivo rrd quando ele começa
DS: datasource existe alguns tipo nao vou mencionar isso e um inicio fico para vc olhar no site RRDTool, mas alguns deles que posso citar são COUNTER, ABSOLUTE, etc. - O DS tem um formato:
- DS:nomedoDS:heartbeat:Min:Max
- NomedoDS: nome quaisquer para o DS
- Heartbeat: Se em 300 segundos conforme nosso exemplo e o comportamento default, e esperar 300 segundos(5 minutos), para receber uma coleta, caso contrario nao receba nenhum dado ele ira esperar mais heartbeat segundos.
- Min: Valor minimo da coleta
- Max: Valor maximo da coleta
Isso diz para armazenar 6 coletas de 5 minutos(que é o período de coleta), tipo depois de 6 coletas vc guarda uma como a média, e guarde 10 valores de média. Acho que agora ficou bom né 🙂
Bom vamos agora colocar dados no nosso banco de dados RRD, novamente com o comando rrdtool
rrdtool update monaco.rrd 1406303220:4000 1406303460:7400 1406303760:11200
rrdtool update monaco.rrd 1406304120:15230 1406304420:18000 1406304720:21400
rrdtool update monaco.rrd 1406305020:25400 1406305320:28600 1406305620:32100
rrdtool update monaco.rrd 1406305920:35700 1406306220:39000 1406306520:43150
rrdtool update monaco.rrd 1406306820:47001 1406307120:50600 1406307420:54000
Vamos visualizar o que foi inserido com o comando “rrdtool fetch”.
[ricardobarbosa@shark ~]$ rrdtool fetch monaco.rrd AVERAGE –start 1406303400 –end 1406307900
dados1406303700: -nan
1406304000: -nan
1406304300: 9.2333333333e+00
1406304600: 1.0493333333e+01
1406304900: 1.2533333333e+01
1406305200: 1.1733333333e+01
1406305500: 1.1266666667e+01
1406305800: 1.1866666667e+01
1406306100: 1.1400000000e+01
1406306400: 1.2700000000e+01
1406306700: 1.3235333333e+01
1406307000: 1.2332666667e+01
1406307300: 1.1598666667e+01
1406307600: -nan
1406307900: -nan
1406308200: -nan
[ricardobarbosa@shark ~]$O que são esses dados? vamos pegar o primeiro caso para entender. Vamos fazer o delta ou calculo de uma velocidade média
11:47 1406303220 4000 11:51 1406303460 7400 Tempo
1406303220-1406303460=240
Distância
7400-4000=3400
Velocidade média = 3400/240 aproximamente 10 por ele faz a média entre os 300 segundos ele normaliza os dados, um detalhe, quando crio o arquivo por default ele usa o intervalo de captura como 300 segundos o que acontece se nesses 300 segundos não for detectado nenhum dado? ele espera mais 300 segundos devido a configuração de heartbeat(DS:dados:COUNTER:600:U:U)
Agora vamos gerar o gráfico.
rrdtool graph monaco.png –start 1406303400 –end 1406307900 DEF:dadosgraph=monaco.rrd:dados:AVERAGE LINE2:dadosgraph#FF0000
Temos várias opções de grafico como LINE2, GAUGE, etc assim como DST e tipos de DS
Veja o gráfico
O rrdtool e muito extenso cheio de detalhes que seria dificil falar tudo aqui, caso tenha dúvidas de uma olhada no site rrdtool ou comments 😀
Desativar IPV6
Ola um post rápido e que não acho interessante mas já tive que fazer isso por necessidade. Desativar o IPv6. Para desativar o suorte IPv6 no Ubuntu e na maioria das distros, edite o aqruivo /etc/sysctl.conf.
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
Estas linha adicionadas desativarão o suporte IPv6 em loopback, no padrão por todas as interfaces eth disponíveis. Um reinicio das interfaces redes é necessária:
/etc/init.d/networking restart
Ele modifica na realidade os seguintes arquivos modificando o conteúdo de 0 à 1 :
/proc/sys/net/ipv6/conf/lo/disable_ipv6
/proc/sys/net/ipv6/conf/all/disable_ipv6
/proc/sys/net/ipv6/conf/default/disable_ipv6
Comandos :
echo ‘1’ > /proc/sys/net/ipv6/conf/lo/disable_ipv6
echo ‘1’ > /proc/sys/net/ipv6/conf/all/disable_ipv6
echo ‘1’ > /proc/sys/net/ipv6/conf/default/disable_ipv6
Att.
Medindo o tempo de cada volta :P
Nesse post e mais uma referência e um pre-requisito para um futuro post sobre RRDTool, Estou criando um sistema de monitoramento para plataforma GEPON(um outro post explico o que é GEPON), e estou fazendo uso do RRDTool, e aprender como o tempo flui num sistema Linux/Unix e primordial. Algumas documentações descrevem que o tempo no UNIX e um contador que iniciou no primeiro minuto do dia 01 de janeiro de 1970, de lá pra cá esse contador somente vem aumentando. Como podemos ver esse contador ? Bom existe várias formas, várias linguagem de programação nos dão essa informação mas para começar vamos pro bash. Para visualizar o epoch(é o nome dado a esse sistema de contagem de tempo no Unix, algumas literaturas utilizam o nome timestamp para representar) pode ser visualizado com o comando “date”.
root@shark ~# date +%s
1402330971
root@shark ~# date +%s
1402330972
root@shark ~# date +%s
1402330973
root@shark ~# date +%s
1402330974
root@shark ~# date +%s
1402330975
root@shark ~# date +%s
1402330977
root@shark ~#
É possivel obter o epoch de determinado período:
root@apolo:~# date -d “2014/07/25 12:57” “+%s”
1406307420
root@apolo:~#
Repare que o valor final começou em 971 e foi incrementando até 977 e isso pro resto da vida ate completar todas os 32 bits que é um numero inteiro utilizado para representar o epoch. Existe uma expectativa para o epoch durar até 2038. Mas até lá talvez teremos um novo bug do milênio :P.
Existe um site que permite você converter facilmente entre um formato para humanos lerem e outras para as máquinas, http://www.epochconverter.com/ no site também ele possue como obter o valor em algumas
linguagens de programação, vou colocar aqui para referência:
Para obter o epoch em algumas linguagem:
PHP time()
Python import time first, then time.time()
Ruby Time.now (or Time.new). To display the epoch: Time.now.to_i
Perl time more …
Java long epoch = System.currentTimeMillis()/1000;
C# var epoch = (DateTime.UtcNow – new DateTime(1970, 1, 1)).TotalSeconds;
Objective-C [[NSDate date] timeIntervalSince1970]; (returns double) or NSString *currentTimestamp = [NSString stringWithFormat:@”%f”, [[NSDate date] timeIntervalSince1970]];
C++11 double now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count();
VBScript/ASP DateDiff(“s”, “01/01/1970 00:00:00”, Now())
AutoIT _DateDiff(‘s’, “1970/01/01 00:00:00”, _NowCalc())
Delphi Epoch := DateTimetoUnix(Now); Tested in Delphi 2010.
R as.numeric(Sys.time())
Erlang calendar:datetime_to_gregorian_seconds(calendar:universal_time())-719528*24*3600.
MySQL SELECT unix_timestamp(now()) more …
PostgreSQL SELECT extract(epoch FROM now());
SQLite SELECT strftime(‘%s’, ‘now’);
Oracle PL/SQL SELECT (SYSDATE – TO_DATE(’01/01/1970 00:00:00′, ‘MM-DD-YYYY HH24:MI:SS’)) *
24 * 60 * 60 FROM DUAL
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, GETUTCDATE())
JavaScript Math.round(new Date().getTime()/1000.0) getTime() returns time in milliseconds.
Visual FoxPro DATETIME() – {^1970/01/01 00:00:00} Warning: time zones not handled correctly
Adobe ColdFusion
Tcl/Tk clock seconds
Unix/Linux Shell date +%s
PowerShell get-date (get-date).touniversaltime() -uformat “%s”
Other OS’s Command line: perl -e “print time” (If Perl is installed on your system)
Existe também no site a opção para conversão de um formato para outro em python
>>> import time
>>> int(time.mktime(time.strptime(‘2000-01-01 12:34:00’, ‘%Y-%m-%d %H:%M:%S’)))
946740840
>>> time.strftime(“%a, %d %b %Y %H:%M:%S +0000”, time.localtime(946740840))
‘Sat, 01 Jan 2000 12:34:00 +0000’
>>>
Primeiro convertemos o formato humando para epochs e depois de epoch para formato humando 😀
Vou deixar aqui também para referencia as conversões
Converter a partir do formato humano para epoch:
PHP strtotime(“15 November 2012”) (converts most English date texts) or:
date_create(’01/15/2010′)->format(‘U’) (PHP5 DateTime class)
Python import time first, then int(time.mktime(time.strptime(‘2000-01-01 12:34:00’, ‘%Y-%m-%d %H:%M:%S’))) – time.timezone
Ruby Time.local(year, month, day, hour, minute, second, usec ) (or Time.gm for GMT/UTC input). To display add .to_i
Perl Use the Perl Epoch routines
Java long epoch = new java.text.SimpleDateFormat(“MM/dd/yyyy HH:mm:ss”).parse(“01/01/1970 01:00:00”).getTime() / 1000;
VBScript/ASP DateDiff(“s”, “01/01/1970 00:00:00”, time field) More info
AutoIT _DateDiff(‘s’, “1970/01/01 00:00:00”, “YYYY/MM/DD HH:MM:SS”)
Delphi Epoch := DateTimeToUnix(StrToDateTime(myString));
C Use the C Epoch Converter routines
R as.numeric(as.POSIXct(“MM/dd/yyyy HH:mm:ss”, origin=”1970-01-01″))
MySQL SELECT unix_timestamp(time) Time format: YYYY-MM-DD HH:MM:SS or YYMMDD or YYYYMMDD
More on using Epoch timestamps with MySQL
PostgreSQL SELECT extract(epoch FROM date(‘2000-01-01 12:34’));
With timestamp: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE ‘2001-02-16 20:38:40-08’);
With interval: SELECT EXTRACT(EPOCH FROM INTERVAL ‘5 days 3 hours’);
SQLite SELECT strftime(‘%s’,timestring);
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, time field)
JavaScript Use the JavaScript Date object
Unix/Linux Shell date +%s -d”Jan 1, 1980 00:00:01″ Replace ‘-d’ with ‘-ud’ to input in GMT/UTC time.
Converter a partir da epoch para formato humano:
PHP date(output format, epoch); Output format example: ‘r’ = RFC 2822 date
Python import time first, then time.strftime(“%a, %d %b %Y %H:%M:%S +0000”, time.localtime(epoch)) Replace time.localtime with time.gmtime for GMT time.
Ruby Time.at(epoch)
Java String date = new java.text.SimpleDateFormat(“MM/dd/yyyy HH:mm:ss”).format(new java.util.Date (epoch*1000));
VBScript/ASP DateAdd(“s”, epoch, “01/01/1970 00:00:00”)
AutoIT _DateAdd(“s”, $EpochSeconds , “1970/01/01 00:00:00”)
Delphi myString := DateTimeToStr(UnixToDateTime(Epoch)); Where Epoch is a signed integer.
C Use the C Epoch Converter routines
Objective-C NSDate * myDate = [NSDate dateWithTimeIntervalSince1970:epoch]; NSLog(@”%@”, date);
R as.POSIXct(epoch, origin=”1970-01-01″, tz=”GMT”)
MySQL FROM_UNIXTIME(epoch, optional output format) Default output format is YYY-MM-DD HH:MM:SS. If you need support for negative timestamps: DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval -315619200 second),”%Y-%m-%d”) (replace -315619200 with epoch)
PostgreSQL PostgreSQL version 8.1 and higher: SELECT to_timestamp(epoch); More info Older versions: SELECT TIMESTAMP WITH TIME ZONE ‘epoch’ + epoch * INTERVAL ‘1 second’;
SQLite SELECT datetime(epoch_to_convert, ‘unixepoch’); or local timezone: SELECT datetime(epoch_to_convert, ‘unixepoch’, ‘localtime’);
Oracle PL/SQL SELECT to_date(’01-JAN-1970′,’dd-mon-yyyy’)+(1326357743/60/60/24) from dual
Replace 1326357743 with epoch.
SQL Server DATEADD(s, epoch, ‘1970-01-01 00:00:00’)
Microsoft Excel =(A1 / 86400) + 25569 Format the result cell for date/time, the result will be in GMT time (A1 is the cell with the epoch number). For other time zones: =((A1 +/- time zone adjustment) / 86400) + 25569.
Crystal Reports DateAdd(“s”, {EpochTimeStampField}-14400, #1/1/1970 00:00:00#) -14400 used for Eastern Standard Time.
JavaScript Use the JavaScript Date object
Tcl/Tk clock format 1325376000
Unix/Linux Shell date -d @1190000000 Replace 1190000000 with your epoch, needs recent version of ‘date’. Replace ‘-d’ with ‘-ud’ for GMT/UTC time.
PowerShell Function get-epochDate ($epochDate) { [timezone]::CurrentTimeZone.ToLocalTime(([datetime]’1/1/1970′).AddSeconds($epochDate)) }, then use: get-epochDate 1279152364. Works for Windows PowerShell v1 and v2
Other OS’s Command line: perl -e “print scalar(localtime(epoch))” (If Perl is installed) Replace ‘localtime’ with ‘gmtime’ for GMT/UTC time.
E para finalizar o post programadores e desenvolvedores quando vale 1 ano em segungos, 1 mês, etc
| Formato humano | Seconds |
| 1 hora | 3600 segundos |
| 1 dia | 86400 segundos |
| 1 semana | 604800 segundos |
| 1 mês (30.44 dias) | 2629743 segundos |
| 1 ano (365.24 dias) | 31556926 segundos |
Att.
Contruindo pontes com teclado e mouse :P
Ola pessoal vocês já sabem, a mesma ladainha de sempre. Após longo período sem postar aqui venho novamente depois de um LONGOO, mas bem LOONNGGOO tempo sem postar vamos a um micro, flash tutorial, how-to porque quebrei a cabeça e se não fosse um amigo “garga” do canal #freebsd-br, rede freenode não tinha colocado meu FreeBSD em bridge para funcionar. Obrigado “garga”.
Primeiramente vamos a topologia bem rápido e sem delongas. Segue abaixo.
Iremos colocar um freeBSD para funcionar em bridge por enquanto esse server não tem uma finalidade especifica mas posteriormente ele sera um servidor proxy com tproxy, seja lá como vou fazer isso 🙂
Para montar a bridge são utilizados alguns comandos bem simples. Rápido e fácil
Criando a ponte
# ifconfig bridge0 create
Definindo as interfaces membros da ponte
# ifconfig bridge0 addm lr0 addm lr1
Visualizando
root@proxy:/root # ifconfig bridge0
bridge0: flags=8843 metric 0 mtu 1500
ether 02:41:a8:eb:20:00
nd6 options=29
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: rl0 flags=143
ifmaxaddr 0 port 3 priority 128 path cost 200000
member: rl1 flags=143
ifmaxaddr 0 port 4 priority 128 path cost 200000
root@proxy:/root #
Para remover as interfaces membros
# ifconfig bridge0 deletem lr0 deletem lr1
Vamos configurar para toda inicialização do FreeBSD ele já montar minha ponte. Para quem não sabe toda a configuração de inicializacção e feita no arquivo rc.conf. Uma observação somente vou colocar a parte que diz respeito a bridge.
ifconfig_rl0=”up”
ifconfig_rl1=”up”
cloned_interfaces=”bridge0″
ifconfig_bridge0=”addm rl1 addm rl0 up”
Uma configuração de brinde a configuração de um endereço IP na interface bridge aqui tem um pulo do gato, que graças ao Garga funcionou. Inicialmente tentei a configuração assim:
ifconfig_rl0=”up”
ifconfig_rl1=”up”
cloned_interfaces=”bridge0″
ifconfig_bridge0=”addm rl1 addm rl0 up”
ifconfig_bridge0=”inet 192.168.1.11 netmask 255.255.255.0 up”
defaultrouter=”192.168.1.1″
Mas não funciona, como o rc.conf é um script a variavel “ifconfig_bridge0” era sobrescrita porque ele esta descriminada duas vezes então o pulo do gato esta aqui. Preciso criar um alias
ifconfig_rl0=”up”
ifconfig_rl1=”up”
cloned_interfaces=”bridge0″
ifconfig_bridge0=”addm rl1 addm rl0 up”
ifconfig_bridge0_alias0=”inet 192.168.1.11 netmask 255.255.255.0 up”
defaultrouter=”192.168.1.1″
Assim rolou, abaixo coloquei o bate-papo com o “garga” 🙂
<garga> ricardobarbosams: ahhhh cara lembrei
<garga> pqp
<garga> ja passei por isso
<garga> maldita bridge
<garga> como o ifconfig nao aceita tudo ao mesmo tempo agora
<garga> vc tem que fazer um cambalacho
<garga> nao sei se isso é o certo
<garga> mas sei que funciona
<garga> faz assim
<garga> ifconfig_bridge0=”addm rl0 addm rl1″
<garga> ifconfig_bridge0_alias0=”inet 192.168.11.1 netmask 255.255.255.0″
<garga> 🙂
<porks> aeouahe
<porks> ORA PORRA. QUE QUE ? ISTO PORRRAAAAAAAAAAAAAA ?!?!?!?!
<garga> no fim das contas o ifconfig vai fazer o que eh pra fazer
<porks> tem que dividir a pica
<porks> senao ele nao aguenta
<garga> eu sei la se isso eh o jeito correto de fazer,mas ja fiz e deu certo
<garga> LOL
<ricardobarbosams> hum
<ricardobarbosams> kkkk
<ricardobarbosams> dexa eu tentar
* Agent_Smith_BR has quit (Read error: No route to host)
<ricardobarbosams> garga, aeee
<ricardobarbosams> funfo
<ricardobarbosams> vou documentar isso
<ricardobarbosams> vlw garga
<ricardobarbosams> 🙂
Vlw pessoal, espero que se algum dia alguém precisar criar um bridge lembre desse pulo do gato.
VMWare arrumando o guarda roupa
Ola como ultimamente estou com um pouco de tempo vou colocar aqui as tecnologias que sempre preciso relembrar 🙂
Nesse post vamos verficiar como o vmware faz o armazendo dos seus dados, os tipos de discos. Aprendi muito graças ao post do blog do Igor Seiji(Valeu Seiji) http://igorseiji.info/2012/02/15/qual-tipo-de-disco-escolher-para-criar-uma-maquina-virtual-no-vmware-vsphere-5/
Bom eu sou bem direto, vamos ao que interessa, o vmware trabalha com 2 tipos de discos(não diria bem tipos :P):
- Thin – Aloca espaço do disco somente o que precisa, se criarmos um disco virtual de 200G para uma maquina virtual onde vou instalar um linux e a instalação do linux ocupar 10G, meu disco virtual irá ocupar somente 10G no meu HD ou storage.
- Thick – Aloca tudo mesmo não precisando, ou seja se criar um disco virtual de 200G para uma máquina virtual o tamanho no HD ou storage do disco virtual será de 200G, mesmo a instalação utilizando apenas 10G.
O tipo Thick ainda possue 2 tipos subtipos:
- Thich Lazy Zeroed – É o modo padrão utilizado pelo vmware, ele ocupa somente o espaço utilizado. Vamos a um exemplo: Se criarmos um disco virtual de 200G para uma maquina virtual qualquer, e a instalação ocupar 10G, temos disponivel para o sistema operacional da máquina virtual ainda 190G, conforme for sendo utilizado os 190G ele vai fazendo o zeroing(Ato de escrever o disco virtual com zeros para garantir que não dados escritos no disco).
- Thick Eager Zeroed – Este metodo e parecido com o lazy zeroed com a diferença que ele faz o zeroing na criação na máquina virtual, isso consequentemente deixa a criação da máquina virtual mais demorada, em contrapartida terei mais performance, visto que não terei que fazer o zeroing na escrita de dados.
Att.
Linuxes, parceiros ate no ssh :)
Sempre esqueço esse procedimento. Então vou colocar aqui para nunca mais esquecer 😛
O servidor A ira conectar no servidor B sem senha. Então vamos ao procedimento correto.
Antes vamos tentar o acesso
serverA:~# ssh suporte@192.168.0.11
The authenticity of host ‘192.168.0.11 (192.168.0.11)’ can’t be established.
RSA key fingerprint is 64:52:f0:f2:54:6d:c1:f7:37:24:a7:a7:48:7b:39:4d.
Are you sure you want to continue connecting (yes/no)?
serverA:~#
Procedimento Servidor A.
Quando rodar o comando ele vai pedir uma senha, apenas digite enter para a senha e confirmação.
serverA:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:92:34:95:79:ad:16:d0:f9:bc:c5:f7:5f:70:5b:45 root@serverA
serverA:~#
Agora vamos copiar a chave publica para o servidor B.
serverA:~# scp /root/.ssh/id_rsa.pub suporte@192.168.0.11:/tmp/
Procedimento Servidor B
Agora no servidor B copiamos a chave pública e colocamos no diretorio oculto .ssh dentro do diretorio pessoal do usuário em questão como “authorized_keys2”
serverB:~# cp /tmp/id_rsa.pub ~/.ssh/authorized_keys2
Agora no servidor A fazemos o teste de conexão 🙂
serverA:~# ssh suporte@192.168.0.11
Detalhe isso so funcionara por usuário.
Att.
Linux sempre disponivel para atende-lo, senhor :)
O título do post tenta ser bem objetivo, iremos configurar alta disponibilidade em um ambiente Linux, utilizando duas máquinas com iguais configurações em que se uma cair a outra assume, no caso o serviço que iremos deixar disponivel será o firewall netfilter/iptables e squid. Usaremos sincronização das configurações utilizando o DRBD. O nosso ambiente será como abaixo já com os respectivos endereços IP’s. Uma observação na interface eth0 o qual foi designada para ser a interface externa não teremos IP, somente o endereço ip virtual na interface alias eth1:0, o heartbeat será na interface interna, no nosso exemplo a interface eth0, com o endereço ip virtual na interface eth0:0.
Para construir nosso ambiente precisamos do DRBD e Heartbeat, o DRBD é uma tecnologia para o sincronismo das configurações e o heartbeat para fazer a checagem do master e slave e ativar os serviços no slave quando o master ficar indisponível. O primeiro passo e instalar o heartbeat, não vou explicar aqui como faz isso, porque existe várias maneiras de se fazer isso. Eu por exemplo utilizei o ubuntu e ele ja tem o pacote no repositorios de pacotes, no CentOS, fedora também tem o pacote no repositorio, ou ainda se preferir você tem a opção de compilar a partir do código fonte. Fica a gosto do frequês.
O diretório de trabalho do heartbeat fica em /etc/ha.d, existe 3 arquivos que precisaremos configurar, são eles:
- haresources: define quais recursos estarão em alta disponibilidade, tais como o nosso squid e iptables, além de montagem de partições sincronizadas com drbd, etc.
- authkeys: arquivo contendo a autenticação dos nós do nosso cluster de alta disponibilidade
- ha.cf: Configurações globais do heartbeat como tempo de dead, warning, arquivos de logs, etc.
Antes de prosseguirmos, precisamos definir quais os nomes dos nossos master e slave.
- master: srvfw01
- slave: srvfw02
Depois configurar a resolução de nomes no arquivo /etc/hosts
192.168.0.1 srvfw01
192.168.0.2 srvfw02
Depois de instalado o heartbeat vamos configurar o a interface eth1 mesma interface da rede interna para o heartbeat segue abaixo arquivo de configuração.
ha.cf
#Arquivo de debug
debugfile /var/log/ha-debug
# Arquivo de log
logfile /var/log/ha-log
logfacility local0
# frequência em segundos de checagem do master
keepalive 2
# Tempo mínimo em segundos para declarar o master morto ou inativo
deadtime 30
# quanto tempo o heartbeat deve esperar por bits atrasados
warntime 10
# tempo maximo para declarar o master morto ou inativo
initdead 120
# porta de comunicação para o heartbeat
udpport 694
# interface que será utilizada para comunicação do heartbeat utilizando endereço multicast
mcast eth0 239.0.0.43 694 1 0
# qual interface ou interfaces serão utilizadas para a comunicação do heartbeat
bcast eth0
# definindo se o servico deve voltar para o master caso ele volte a responder o heartbeat
auto_failback on
# nós ou hosts que irão compor o cluster
node srvfw01
node srvfw02
authkeys
auth 1
1 crc
Esse arquivo é o arquivo que faz a autenticação dos nós ou hosts que compõem o cluster. Existem outros métodos além do crc, tais como sha1, md5, o qual você pode-se utilizar uma senha.
Vou deixar para explicar o arquivo haresources depois que mexermos no drbd para o melhor entendimento.
A tecnologia DRBD trabalha com dispositivo em rede tipo uma partição de um disco, etc. Vejamos a figura abaixo retirado do site drbd mostra bem esse conceito.
Então a idéia e criar um dispositivo tal como o dispositivo /dev/drbd0 em comum entre os dois hosts que fazem parte do cluster de alta disponibilidade e associar ele a um disco fisico em cada host, tipo /dev/sdb como no nosso laboratorio que iremos fazer. Precisamos associar o dispositivo /dev/drbd0 com o /dev/sdb1 por exemplo, teremos que fazer isso em ambos os hosts.Obs: Precisamos ter uma partição EXCLUSIVA para isso.
Então para a instalação do drbd, proceda como na instalação do heartbeat, procure no repositorio de pacotes da tua distro ou compile 🙂
Depois de instalado o drbd normalmente já carrega o módulo do kernel drbd, mas se precisar utilize o comando modprobe(modprobe drbd). O arquivo de configuração do drbd é /etc/drbd.conf. Segue abaixo o arquivo que utilizei.
Não vou comentar todos os parametros do arquivo de configuração, por ser extenso e caso precise de algo mais especifico as páginas man são suas confidentes 🙂 Alguns paramêtros que o drbd utiliza para subir são obrigatorios, tais como:
- global:
- common:
- resource:
Iremos configurar apenas o recurso ou resource:
drbd.conf
resource srvfw {
protocol C;
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
}
syncer {
rate 100M;
}
on srvfw01 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.1:7788;
meta-disk internal;
}
on srvfw02 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.2:7788;
meta-disk internal;
}
}
Explicando alguns paramêtros mais importantes.
- device: Dispositivo virtual o que será utilizado nos dois hosts.
- disk: disco físico que será mapeado pelo dispositivo virtual.
- address: Endereço IP e porta do host.
- meta-disk: onde será colocado o meta-disk do drbd, meta-data são informações de replicação.
Não coloquei as configurações de global e common utilizei o padrão do ubuntu que veio auto-configurado no pacote.
include “drbd.d/global_common.conf”;
Vamos colocar o drbd para funcionar, primeiro vamos definir um diretório em comum em ambos hosts, escolhi o diretório /srvfw
host srvfw01 e srvfw02
mkdir /srvfw
Particione o disco /dev/sdb para /dev/sdb1.
zerar a partição com o comando:
dd if=/dev/zero of=/dev/sdb1 bs=1M count=128
Depois iremos criar o dispositivo drbd
drbdadm create-md recurso
ou seja, para nosso exemplo rodar o comando nos dois hosts
drbdadm create-md srvfw
Atachar o disco nos dois hosts
drbdadm attach srvfw
sincronizar
drbdadm syncer srvfw
Iniciar a replicação apenas no master, ou srvfw01
drbdadm — –overwrite-data-of-peer primary srvfw
Reinicie o serviço drbd nos dois hosts
/etc/init.d/drbd restart
Verifique se a sincronização ocorreu
root@srvfw01:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: 71955441799F513ACA6DA60
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@srvfw01:~# 15:48:26
Definindo quem é primario e secundario
srvfw01
drbdadm primary all
srvfw02
drbdadm secondary all
Agora vamos formatar o dispositivo /dev/drbd0 com o sistema de arquivo de sua preferência. Primeiro execute no master como ele sendo o drbd primario, depois promova o master como secundario no drbd e formate o dispositivo /dev/drbd0 no slave.
mkfs.reiserfs /dev/drbd0
Depois de formatado o dispositivo nos dois hosts podemos monta-ló e testa-ló. Neste ponto reinicie o serviço drbd0. obs: Estou montando depois de formatar o dispositivo /dev/drbd0 nos dois hosts e estou no master(srvfw01)
mount -t reiserfs /dev/drbd0 /srvfw
Crie um arquivo para teste
touch /srvfw/arquivo.txt
Agora desmonte o /srvfw e promova o master(srvfw01) à secundario no drbd e o slave(srvfw02) à primario.
srvfw01
drbdadm secondary all
srvfw02
drbdadm primary all
Monte novamente o /dev/drbd0 mas agora no slave(srvfw02)
mount -t reiserfs /dev/drbd0 /srvfw
Liste o conteudo do ponto de montagem e veja que o arquivo criado “arquivo.txt” estará lá. Estamos com o drbd funcionando e replicando. A idéia aqui e colocar as configurações do iptables e squid dentro do diretório ou ponto de montagem /srvfw.
Editar o arquivo /etc/fstab para montagem automática.
/dev/drbd0 /srvfw reiserfs noauto 0 0
Agora vamos configurar o ultimo item o arquivo haresources.
haresources
srvfw01 IPaddr::192.168.0.10/24/eth0/192.168.0.255 drbddisk::srvfw Filesystem::/dev/drbd0::/srvfw::reiserfs
srvfw01 IPaddr::172.31.1.151/24/eth1/172.31.1.255 gateway::172.31.1.150 iptables squid
Vamos lá este útimo item e minucioso e cheio de detalhes e esses detalhes são essenciais para o entendimento. Para o start do serviço no slave ou no master é necessário existir um script que inicie o serviço em questão o heartbeat já vem com um conjunto default de script de inicialização de serviços que ficam em /etc/ha.d/resource.d. Cada script dentro deste diretório inicializa e interrompe serviços. Não temos script para inicialização do iptables e nem para o squid então vamos criar um shellscript simples para fazer isso. Vamos entendendo linha a linha.
- srvfw01: Nome do host que é definido como master
- IPaddr::192.168.0.10/24/eth0/192.168.0.255: Aqui ele vai chamar o script que inicializa um serviço. O script IPaddr vai configurar um endereço IP 192.168.1.10 com mascara de rede /24 na interface eth0 com endereço de broadcast 192.168.0.255.
- drbddisk::srvfw: Este script vai iniciar o recurso drbd(aquele mesmo recurso configurado no /etc/drbd.conf) host em questão como primario do drbd
- Filesystem::/dev/drbd0::/srvfw::reiserfs: Script para fazer a montagem do dispositivo /dev/drbd0 no ponto de montagem /srvfw utilizando sistema de arquivo reiserfs. Simples não
Repare que eu passo paramêtros para o script atráves da sintaxe “::”, ou seja, por exemplo o comando ou shellscript “Filesystem” se fosse executar na linha de comando seria o mesmo que
./Filesystem /dev/drdb0 /srvfw reiserfs start
Simples não. Um detalhe que se você procurar no diretório /etc/ha.d/resource.d você encontra-rá o script Filesystem la dentro.
Próxima linha, na linha acima configuramos o endereço IP virtual da interface LAN e montamos a partição drbd e agora iremos explicar a linha que inicializa o endereço ip virtual da interface WAN
- srvfw01: Nome do host que é definido como master
- IPaddr::172.31.1.151/24/eth1/172.31.1.255: Aqui ele vai chamar o script que inicializa um serviço. O script IPaddr vai configurar um endereço IP 172.31.1.151 com mascara de rede /24 na interface eth1 com endereço de broadcast 172.31.1.255.
- gateway::172.31.1.150: Script que configura o gateway default.
- iptables: script que carrega as regras de firewall
- squid: script que inicializa o squid
O script “iptables” e “squid”, foram criado pela minha pessoa os scripts que eu criei ficaram um pouco complexo. Então nesse post vou diminuir a complexidade deixado eles bem simples para ficar didático
script iptables
#!/bin/bash
IPT=$(which iptables)
usage() {
echo “Uso: $0 {start|stop}”
exit 1
}case $1 in
start)
/srvfw/config/iptables/firewall
;;
stop)
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X$IPT -t filter -P INPUT ACCEPT
$IPT -t filter -P FORWARD ACCEPT
$IPT -t filter -P OUTPUT ACCEPT
;;
*) usage
;;
esac
Este script inicializa ou interrompe um firewall a sintaxe para iniciar e interromper seguem abaixo respectivamente.
./iptables start
./iptables stop
No script do squid como estamos utilizando o ubuntu, sendo assim resolvi somente alterar a varíavel que indica o arquivo de configuração do script que inicia e interrompe o squid nativo no caso do ubuntu ele utiliza o sistema de inicialização upstart. Então somente alterar a variavel “CONFIG” no arquivo /etc/init/squid3.conf, para /srvfw/config/squid/squid.conf, depois podemos utilizar o script de inicialização nativo do ubuntu.
#!/bin/bash
#
#
case $1 in
start)
/etc/init.d/squid3 start
;;
stop)
/etc/init.d/squid3 stop
;;
*) usage
;;
esac
Facil né. Bom depois e somente testar, simular quedas no master e ver o slave assumindo qualquer dúvida mailme.
Att.
Firefox me bloqueando???
Ola pessoal, esses dias estava configurando o varnish acelerador web e coloquei ele para funcionar na porta 79, uma antes da 80 :P. Ao terminar de configurar fui testar o acesso e olha o que o firefox me disse.
Sim senhores o firefox tem uma proteção por porta, mas fique tranquilo e fácil resolver isso, vamos lá:
Acesse o “painel de configuração” do firefox.
- Abrir uma nova aba e digitar about:config
- Uma mensagem será exibida, clique em “Serei cuidadoso, eu prometo!”
- Clique com o botão direito em qualquer área dentro das configurações exibidas.
- No menu de contexto aberto selecione Nova preferência > String.
- Digite: network.security.ports.banned.override e clique em OK
- Ele solicitara o valor, digite o número da porta que esta tentando acessar e depois tente o acesso.
t+
pisando no freio do kernel
Ola pessoal, nessa semana recebi a tarefa, de instalar um servidor bacula em um servidor HP ML330. Instalei o ubuntu normalmente, mas na hora de inicializar surgia o seguinte erro.
Starting up…
Loading, please wait…
Gave up waiting for root device. Common problems:
-Boot args (cat /proc/cmdline)
-Check root delay = (did the system wait long enough?)
-Check root=(did the system wait for the right device?)
-Missing modules (cat /proc/modules; ls /dev)ALERT! /dev/disk/by-uuid/aa10r6jd-2r58-75dy-j7op-3gh56kl98nb does not exist. Dropping to a shell!
BusyBox v1.13.3 (Ubuntu 1:1.13.3-1ubuntu11) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.(initramfs)
Após isso não inicializava o kernel e ficava no prompt, quando entrei no prompt do busybox(para quem não sabe busybox, é o conjunto de utilitários do linux customizados em que o objetivo é ser pequeno, para ser executados em dispositivos embarcados como celular, flash, etc), e listei o diretório /dev/, ele exibia os device da controladora. O hardware era uma controladora SCSI Compaq. Após analisar desconfiei que poderia o kernel estar sendo muito mais rápido que a controladora, então pesquisando encontrei o parametro “rootdelay” que retarda a inicialização. Então na inicialização do grub apertei a tecla “e”, e editei o grub em tempo de execução, e adicionei a seguinte linha no kernel
linux /boot/vmlinuz-3.2.0-23-generic root=UUID=4cb78f3e-a217-4b05-883c-443fc67ca52f ro rootdelay=140 vga=normal
Apos iniciar o kernel e aparecer o prompt de login, faça o login normalmente e edit o arquivo /etc/default/grub e adicione os parametros.
GRUB_CMDLINE_LINUX_DEFAULT=”rootdelay=60 vga=normal “
Depois execute:
sudo update-grub
Com isso o kernel retarda a inicialização e a controladora SCSI fica pronta e entrega os devices para o kernel.
🙂






